BigAdmin System Administration Portal
특집 기사
Print-friendly VersionPrint-friendly Version

GRUB 및 Solaris 10 1/06 OS: x86 플랫폼용 새 부트로더

Shudong Zhou와 Jan Setje-Eiler, 2005년 12월

이 문서에서는 x 10 플랫폼에서 Solaris 1 06/86 운영 체제의 부트 아키텍처 및 사용자 경험에 대해 설명합니다. 이 문서의 내용 중 일부는 공지 없이 변경될 수 있습니다. 지원되는 인터페이스에 대한 내용은 매뉴얼 페이지 및 Solaris OS 관리 문서를 참조하십시오.

이 문서에서 설명한 새 부트로더는 OpenSolaris Project 또는 Solaris Express program의 Solaris OS 1/06 OS의 공식 릴리스 이전 버전에서 사용할 수 있습니다.


1. 부트 프로세스 소개

x86 기반 시스템의 전원이 켜지면 BIOS는 CPU, 메모리 및 플랫폼 하드웨어를 초기화합니다. 완료 시에는 BIOS는 초기 부트스트랩 소프트웨어, 즉 부트로더를 구성된 부트 장치에서 로드하여 부트로더로 제어 권한을 넘깁니다. Solaris 10 3/05 OS 및 이전 릴리스에서는 Sun에서 개발한 부트로더를 사용하며, 여기에는 대화식 셸과, 리얼 모드 드라이버 기반의 메뉴 중심 장치 구성 도우미가 포함되어 있습니다.

Solaris 10 1/06 릴리스를 시작할 때 부트로더로는 오픈 소스 GRUB 또는 GNU GRand Unified Bootloader(참조 1)가 사용됩니다. 이 초기 제공물은 GRUB 버전 0.95를 기반으로 하며, 새 버전을 사용할 수 있을 때 업데이트됩니다. Solaris 커널은 멀티부트 사양(참조 2)과 완전히 호환되므로 Solaris OS는 멀티부트 사양을 구현하는 부트로더를 통해 부트할 수 있습니다.

GRUB로의 전환 작업은 Solaris 고객에게 다음과 같은 몇 가지 이점을 제공합니다.

  • GRUB를 사용하면 부트 메뉴에서 쉽게 커널과 부트 옵션을 지정할 수 있습니다.

  • 최종 사용자의 경우에는 USB DVD 드라이브에서 부트 및 설치가 지원되지 않습니다.

  • Solaris OS가 동일한 시스템에서 다른 운영 체제와 더욱 쉽게 공존합니다. 특히 Solaris OS는 동일한 GRUB 부트로더를 Linux와 공유할 수 있습니다.

  • 네트워크를 통한 Solaris OS 배포 작업도 단순해집니다. 특히 DHCP 서버 설정 영역에서 그렇습니다. 공급업체별 옵션이 DHCP 서버 설정 시 더 이상 필요하지 않습니다.

  • 개발자는 더 이상 리얼 모드 드라이버를 다루지 않아도 됩니다. 이 드라이버는 이전 Solaris 릴리스에 필요한 부트로더의 부분이었습니다.

  • IHV의 경우 이제 플로피뿐 아니라 CD/DVD를 통해 설치 시 드라이버를 제공할 수 있습니다.

마지막으로 오픈 소스 커뮤니티에서 개발된 부트로더를 채택하여 Sun 고객은 해당 커뮤니티에서 얻은 상당한 GRUB 경험을 이용할 수 있습니다.


2. GRUB로 Solaris OS 부트

GRUB에서 제어 권한을 얻으면 사용자에게 부트할 OS 인스턴스를 선택하라고 요청하는 메뉴가 콘솔에 표시됩니다. 사용자는 메뉴 항목을 선택하거나, 기본 제공 편집기를 사용하여 메뉴 항목을 수정하거나, 명령 모드에서 OS 커널을 수동으로 로드할 수 있습니다. Solaris OS를 부트하려면 GRUB가 boot_archive 파일과 "멀티부트" 프로그램을 로드해야 합니다. 부트 아카이브는 Solaris 커널 모듈 및 데이터가 들어 있는 램 디스크 이미지입니다. GRUB는 이 아카이브를 해석하지 않고 단순히 메모리에 넣습니다. 멀티부트 프로그램은 멀티부트 사양을 준수하는 헤더가 있는 ELF 실행 파일입니다. 로딩이 완료되고 나면 GRUB는 멀티부트 프로그램에 제어 권한을 넘깁니다. 그러면 GRUB 자체가 비활성화 상태가 되며, 메모리가 다시 사용됩니다.

멀티부트 프로그램은 boot_archive를 읽고, 멀티부트 사양에서 지정한 대로 부트 관련 정보를 커널에 전달하여 코어 커널 모듈 조립을 담당합니다. 멀티부트 프로그램은 boot_archive 파일을 사용하여 협력 관계를 유지합니다. 다른 릴리스 또는 OS 인스턴스의 멀티부트 및 boot_archive 정보를 혼합하거나 조합할 수 없습니다.

커널이 제어 권한을 얻게 되면 해당 커널은 CPU, 메모리 및 I/O 장치를 초기화하고, fstype 등록 정보에서 지정된 파일 시스템 유형을 사용하여 bootpath 등록 정보에서 지정된 장치에서 루트 파일 시스템을 마운트합니다. 등록 정보는 eeprom(1M)을 통해 /boot/solaris/bootenv.rc에서 설정하거나, GRUB 메뉴 또는 셸을 통해 GRUB 명령줄에서 설정할 수 있습니다. 등록 정보가 지정되지 않으면 루트 파일 시스템의 기본값은 /devices/ramdisk:a에서 UFS로 지정되며, 설치 미니루트를 부트하는 경우가 이에 해당합니다.


3. 설치

Solaris OS는 CD, DVD 및 넷 설치 서버에서 설치할 수 있습니다. Solaris 10 1/06 릴리스는 다음과 같이 여러 가지 측면에서 Solaris 10 3/05 릴리스와 다릅니다.

  • 최소 메모리 요구 사항: 설치 미니루트를 부트할 수 있는 시스템의 주 메모리는 256MB여야 합니다. 메모리가 부족한 시스템에서는 "Selected item can not fit in memory"라는 GRUB의 메시지가 표시됩니다.

  • USB 드라이브 지원: USB 인터페이스를 통해 연결된 CD/DVD 드라이브에서의 설치 작업은 완전히 지원됩니다.

  • 넷 설치: 넷 설치 이미지를 설정하는 데 필요한 표준 절차는 동일한 상태로 유지됩니다. 클라이언트가 PXE(Preboot eXecution Environment) 메커니즘을 통해 부트한다고 가정됩니다. PXE 부트를 수행할 수 없는 클라이언트는 GRUB 플로피를 사용할 수 있습니다(부록 B 참조).

설치 미니루트를 부트하면 GRUB 메뉴가 표시됩니다. 사용자는 대화식으로 부트 옵션을 편집할 수 있습니다(섹션 4.2 참조). GRUB가 Solaris OS를 로드하고 나면 다음 설치 메뉴가 표시됩니다.

  1. Solaris 대화식(기본값)
  2. 사용자 정의 JumpStart
  3. Solaris 대화식 텍스트(데스크탑 세션)
  4. Solaris 대화식 텍스트(콘솔 세션)
  5. 드라이버 업데이트 적용
  6. 단일 사용자 셸

장치 구성 도우미 및 이와 관련되어 사용자가 Solaris 10 3/05 OS 및 그 이전 버전에서 익숙한 대화식 셸은 더 이상 표시되지 않습니다. 설치 중 필요한 드라이버(예: 호스트 어댑터 드라이버)를 추가하려는 사용자는 옵션 5를 선택하고, ITU(Install Time Update) 플로피 또는 CD/DVD를 제공해야 합니다.

옵션 6은 시스템 복구용으로 사용할 수 있습니다. 이 옵션을 사용하면 시스템 식별을 진행하지 않고도 루트 프롬프트에 빨리 액세스할 수 있습니다. 이 옵션은 Solaris의 비상 안전 세션 부트와 동일합니다(섹션 4.4 참조).


4. 부트 서브시스템 관리

4.1 BIOS

일반적으로 Solaris OS를 설치하기 전에 BIOS 펌웨어를 최신 버전으로 업데이트하는 것이 좋습니다. 이 작업은 일반적으로 컴퓨터를 제조한 공급업체의 지원 페이지를 방문하여 수행됩니다.

Solaris 10 3/05 릴리스와 비교해볼 때 Solaris 10 1/06 OS는 BIOS 기능에서 다른 하위 집합을 사용합니다. 특히 커널은 Intel의 고급 구성 및 전원 관리 인터페이스(ACPI) CA 소프트웨어를 사용하여 ACPI 테이블에서 좀 더 많은 정보를 이용합니다.

BIOS 2.0 사양을 준수하지 않는 시스템에서는 syslog에 다음과 같이 ACPI 테이블 구문 분석과 관련된 메시지가 있을 수 있습니다.

ACPI-0725: *** Warning:
Type override - [4s] had invalid type (DEB_[\200IODB

이러한 메시지는 문제가 되지 않으며, 일반적인 시스템 작업에 영향을 주지 않습니다. ACPI 오류로 인해 정상적인 시스템 부트가 수행되지 않으면 사용자는 다음 GRUB 메뉴의 커널 행에서 acpi-user-options를 2로 설정하여 ACPI 구문 분석기를 비활성화할 수 있습니다(eeprom(1M) 참조).

kernel .. -B ...,acpi-user-options=2

이 경우 시스템에서는 키보드, 마우스, 직렬 포트 2개 및 병렬 포트를 비롯한 표준 ISA 장치 집합이 표시된다고 가정합니다.

4.2 부트 옵션

Solaris OS를 부트하기 위해 사용자는 로드할 커널, 커널에 전달되는 옵션(kernel(1M) 참조) 및 시스템 작동을 사용자 정의하는 등록 정보 이름과 값 목록(eeprom(1M) 참조)을 지정할 수 있습니다. Solaris 설치 시 시스템의 기본값 집합이 선택되고, /boot/solaris/bootenv.rc에 저장됩니다. 사용자는 GRUB 메뉴를 편집하거나 eeprom(1M) 명령을 통해 bootenv.rc 파일을 간접적으로 수정하여 설정을 변경할 수 있습니다.

eeprom을 통해 커널 이름과 커널 옵션을 지정하려면 boot-file 등록 정보를 설정해야 합니다. 상세 모드로 32비트 커널을 부트하려면 다음 명령을 실행합니다.

# eeprom boot-file="kernel/unix -v"

GRUB 메뉴에서 동일한 항목을 지정하려면 GRUB 메뉴의 다음 kernel 명령을

kernel /platform/i86pc/multiboot

다음으로 변경합니다.

kernel /platform/i86pc/multiboot kernel/unix -v

Solaris 커널에서 허용하는 추가 부트 인수는 kernel(1M)을 참조하십시오.

boot-file을 제외한 등록 정보는 다음 구문을 사용하여 GRUB 커널 명령줄에서 지정할 수 있습니다.

kernel /platform/i86pc/multiboot -B prop1=val1[,prop2=val2...]

ttya (com1)에서 직렬 콘솔을 구성하려면 console 등록 정보를 ttya로 설정합니다.

kernel /platform/i86pc/multiboot -B console=ttya        

등록 정보 값에 쉼표가 있으면 해당 값을 따옴표로 묶어야 합니다. 다음 GRUB 명령은 Solaris 콘솔을 ttya로 고속 설정합니다.

kernel /platform/i86pc/multiboot -B console=ttya,ttya-mode="115200,8,n,1,-"

즉, GRUB 메뉴에서 "-B foo=bar"를 지정하는 것은 "eeprom foo=bar"를 실행하는 것과 같습니다. GRUB의 -B 옵션은 주로 임시 오버라이드를 위해 사용됩니다. 영구 설정은 Solaris 업그레이드 프로세스에서 보존되므로 eeprom(1M)을 통해 지정해야 합니다.

4.3 부트 아카이브

부트 아카이브는 platform/i86pc/boot_archive 파일을 참조하며, 각 UFS 또는 ISOFS 형식으로 포장되는 코어 커널 모듈 및 구성 파일 모음입니다. 부트 시 GRUB는 시스템 메모리에 부트 아카이브를 로드합니다. 커널은 이제 루트 장치에서 I/O를 수행하지 않고도 부트 아카이브의 데이터와 텍스트에서 커널 자체를 초기화할 수 있습니다. 커널이 충분한 I/O 기능을 얻게 되면 해당 커널은 bootpath 등록 정보에서 지정한 대로 실제 루트 장치에서 루트 파일 시스템을 마운트합니다. 이때 GRUB에서 로드된 부트 아카이브는 메모리에서 삭제됩니다.

부트 아카이브의 내용은 /boot/solaris/filelist.ramdisk에 지정되어 있습니다. 시스템 종료 시 시스템은 루트 파일 시스템에 대한 업데이트를 확인하고, 필요한 경우 부트 아카이브를 업데이트합니다. bootadm(1M) 명령을 실행하여 시스템 종료 전에 부트 아카이브를 수동으로 업데이트할 수도 있습니다.

4.4 비상 안전 메뉴 항목

Solaris 10 1/06 OS에 새롭게 추가된 파일은 /boot/x86.miniroot-safe로, 부트 가능한 독립 실행형 Solaris 이미지가 여기에 포함되어 있습니다. 이 파일은 GRUB 메뉴의 Solaris failsafe 항목을 선택하여 로드할 수 있습니다. 이 파일은 일반 항목에서 부트를 수행하지 못하는 경우에 시스템 관리자가 편리하게 사용합니다.

장애가 있는 드라이버가 포함된 새 패키지를 추가하거나 부트 시 시스템 패닉이 발생한다고 가정하면, 재부트하는 경우 Solaris의 비상 안전 메뉴 항목을 선택할 수 있습니다. 비상 안전 세션에 있는 경우 /a에서 루트 파일 시스템을 마운트하고 pkgrm -R 을 실행하여 장애가 있는 패키지를 제거합니다. 이 작업이 완료되고 나면 일반 Solaris 항목으로 재부트하여 시스템 작업을 다시 시작할 수 있습니다.

/boot/x86.miniroot-safe 파일도 USB 스틱과 같은 이동식 매체에 복구용으로 복사해 둘 수 있습니다.

4.5 시스템을 부트 가능하게 유지

시스템이 부트 가능한 상태로 유지되도록 GRUB 부트 블록, GRUB 메뉴 및 부트 아카이브는 모두 최신 상태여야 합니다.

GRUB 부트 블록은 Solaris 분할 영역에 있습니다. 부트 블록이 손상되는 경우에는 installgrub(1M) 명령을 사용하여 해당 블록을 다시 설치해야 합니다. installboot(1M)fmthard(1M)를 사용하여 GRUB 부트 블록을 작성할 수는 없습니다.

GRUB 메뉴는 /boot/grub/menu.lst(Solaris 부트 분할 영역이 사용되는 경우에는 /stubboot/boot/grub/menu.lst)에 있으며, bootadm(1M) update-menu 하위 명령을 통해 유지됩니다. GRUB에서는 BIOS 디스크 번호로 디스크의 이름을 지정하므로, BIOS 부트 장치 구성이 변경되면 경우에 따라 GRUB 메뉴 항목이 잘못 렌더링될 수도 있습니다. 이 경우 bootadm update-menu를 실행하면 정확한 메뉴 항목이 만들어집니다.

루트 파일 시스템이 수정되면 부트 아카이브를 업데이트해야 합니다. 커널 파일 업데이트 후에 즉시 시스템 오류(전원 오류 또는 커널 패닉)가 발생하는 경우에는 부트 아카이브가 루트 파일 시스템과 동기화되지 않을 수 있습니다. 이 경우 Solaris Service Manager(예: svcadm(1M))를 통해 관리되는 system/boot-archive 서비스는 다음 재부트 시 실패합니다. Solaris에서는 사용자에게 부트한 다음 오류를 트리거한 이벤트를 삭제할 수 있지만 시스템을 재부트하고, 비상 안전 세션을 선택하여 이 세션에서 부트 아카이브를 업데이트하는 것이 좀 더 안전하다는 것을 사용자에게 알려 주는 메시지가 인쇄됩니다.


5. 멀티부트 설정

부트 가능한 다른 분할 영역이 존재하는 경우 Solaris 설치 프로그램은 이 영역에 대한 GRUB 항목을 추가합니다. 이 기사가 작성된 시점에서는 Microsoft Windows와 진단 분할 영역이 인식됩니다. 사용자는 GRUB 메뉴를 직접 편집하여 다른 운영 체제를 추가할 수 있습니다.

Solaris OS, Linux 및 Windows가 설치된 시스템을 다음과 같이 동일한 디스크에 배치했다고 가정해 보십시오.

        fdisk partition 0:      Windows
        fdisk partition 1:      Linux
        fdisk partition 2:
                slice 0         Solaris 9
                slice 3         Solaris 10 1/06

GRUB 메뉴가 다음과 같이 표시되어야 합니다.

#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris 10 1/06
        root (hd0,2,d)
        kernel /platform/i86pc/multiboot
        module /platform/i86pc/boot_archive
#---------------------END BOOTADM--------------------
title Solaris 9
        root (hd0,2,a)
        chainloader +1
        makeactive
title Linux
        root (hd0,1)
        kernel <from Linux's GRUB menu...>
        initrd <from Linux's GRUB menu...>
title Windows
        root (hd0,0)
        chainloader +1

Solaris의 fdisk partition은 활성 분할 영역이어야 합니다. Windows 메뉴에서 "makeactive"를 입력하지 마십시오. 입력하게 되면 시스템에서 항상 Windows를 부트합니다.

Sun이 아닌 소스에서 가져온 GRUB는 현재 Solaris 내장 VTOC와 UFS 형식을 인식하지 못합니다. Sun은 이를 지원하기 위해 GRUB 프로젝트에 변경 내용을 제출해 오고 있습니다. 이 내용이 통합될 때까지는 Solaris GRUB만 작동합니다. Linux에서 마스터 부트 블록에 GRUB를 설치한 경우에는 Solaris 분할 영역을 활성 분할 영역으로 설정하더라도 Solaris OS를 사용할 수 없게 됩니다. 이 경우 Linux에서 메뉴를 수정하면 Linux GRUB에서 체인로드할 수 있습니다. 또는 installgrub(1M) 명령을 사용하여 위의 예에서 마스터 부트 섹터를 Solaris GRUB로 교체할 수도 있습니다.

installgrub -m /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c0t2d0s3

Solaris VTOC 및 UFS 구현이 표준 GRUB 릴리스로 전파되기 전에는 Solaris 버전의 GRUB만 작동합니다.


6. 넷 부트 클라이언트 및 디스크가 없는 클라이언트

네트워크에서 부트하려면 일반적으로 PXE 클라이언트 용으로 구성된 DHCP 서버와 TFTP 서비스를 제공하는 부트 서버가 필요합니다. 사용 가능한 PXE/DHCP 서버가 없거나 BIOS에 PXE 코드가 들어있지 않은 경우에는 플로피, CD-ROM 또는 로컬 디스크에서 GRUB를 로드하고, GRUB 메뉴에서 수동으로 네트워크를 구성하고, 파일 서버에서 Solaris OS를 부트할 수 있습니다. 자세한 내용은 부록 B를 참조하십시오.

DHCP 서버를 설정하는 작업은 사이트별 작업으로서 로컬 네트워크 관리자에게 위임됩니다. Sun BluePrints 문서, “Configuring JumpStart Servers to Provision Sun x86-64 Systems”: http://www.sun.com/blueprints/0205/819-1692.pdf를 참조하십시오.

Solaris OS를 부트하려면 DHCP 서버는 파일 서버의 IP 주소와 부트 파일 이름(pxegrub)을 사용하여 BIOS PXE 요청에 응답해야 합니다. 부트 서버는 pxegrub 이진, GRUB 메뉴, 멀티부트 프로그램 및 부트 아카이브 제공을 담당합니다. Standard 도구는 이 부트 서버를 설정하기 위해 제공됩니다.

6.1 넷 설치 서버

add_install_client(1M) 명령은 설치 클라이언트에 대한 넷 설치를 설정하기 위해 사용됩니다. Solaris 10 1/06 및 이후 릴리스의 경우 add_install_client(1M)는 항상 PXE/DHCP 부트에 필요한 -d 옵션과 함께 호출해야 합니다. GRUB 플로피가 네트워크에 부트스트랩하기 위해 사용되는 경우에도 이 작업이 필요합니다.

add_install_client를 실행한 후에는 pxegrub에 대한 링크로 /tftpboot/01<eth_addr>을 확인하고, GRUB 메뉴 항목이 들어 있는 /tftpboot/menu.lst.01<eth_addr>을 확인해야 합니다. 위의 경우 <eth_addr>은 클라이언트 네트워크 인터페이스의 이더넷 주소가 됩니다. 또한 넷 이미지의 /boot 디렉토리는 /tftpboot에서 루프백 마운트되어 tftp를 통해 multibootx86.miniroot에 액세스할 수 있습니다.

6.2. 디스크가 없는 클라이언트

smdiskless(1M) 명령은 디스크가 없는 클라이언트를 설정하기 위해 사용됩니다. 이전 릴리스에서 smdiskless(1M)rootusr 파일 시스템을 설정하고, NFS를 통해 클라이언트로 내보냅니다. 하지만 사용자는 클라이언트를 부트할 수 있도록 /tftpboot 영역을 수동으로 구성해야 합니다. Solaris 10 1/06 OS에서는 이 수동 단계가 제거되었습니다. smdiskless(1M) 명령은 /usr/sadm/lib/wbem/config_tftp에서 자동으로 스크립트를 호출하여 PXE 부트를 위해 /tftpboot 영역을 설정합니다.

smdiskless를 실행한 후에는 pxegrub에 대한 링크로 /tftpboot/01<eth_addr>을 확인하고, GRUB 메뉴 항목이 들어 있는 /tftpboot/menu.lst.01<eth_addr>을 확인해야 합니다. 위의 경우 <eth_addr>은 클라이언트 네트워크 인터페이스의 이더넷 주소가 됩니다. 또한 /export/root/<hostname>/boot/tftpboot에서 루프백 마운트되어 tftp를 통해 클라이언트의 멀티부트 및 부트 아카이브에 액세스할 수 있습니다.

디스크가 없는 클라이언트의 부트 아카이브는 클라이언트가 종료되면 자동으로 업데이트됩니다. 클라이언트가 중지되는 경우 클라이언트의 부트 아카이브가 최신이 아니면 다음 명령을 사용하여 서버 쪽에서 아카이브를 업데이트할 수 있습니다.

# bootadm update-archive -R /export/root/<hostname>

이 작업은 x86 클라이언트를 제공하는 SPARC 및 x86 플랫폼 기반 서버 모두에서 작동합니다.


7. 기존의 문제

7.1 Solaris x86 부트 분할 영역

x86 시스템의 경우 Solaris 부트 분할 영역은 약 10MB 정도로 매우 작은 주 fdisk 분할 영역(PCFS(FAT) 형식)으로, 주로 이 때는 BIOS 펌웨어에서 실린더가 1024개가 넘는 디스크 블록에 액세스할 수 없었으므로 Solaris 2.6 릴리스에 도입되었습니다. 디스크 시작 부분 가까이에 있는 작은 영역에 부트 코드를 입력하는 것이 필요했습니다. 부트 분할 영역을 사용하면 Solaris OS를 부트 디스크의 최소 공간 요구 사항으로 비부트 디스크에 설치할 수 있었습니다.

요즘의 시스템에서는 부트 분할 영역이 더 이상 필요하지 않습니다. Solaris 10 1/06 OS 이후 버전부터 사용자에게는 부트 분할 영역을 만들 수 있는 옵션이 더 이상 부여되지 않습니다. 이전 릴리스에서 업그레이드하는 경우에는 수동 개입 없이 시스템을 부트 가능한 상태로 유지할 수 있도록 기존 x86 부트 분할 영역을 유지할 수 있습니다. 이 경우 x86 부트 분할 영역은 /stubboot에서 마운트되며, /stubboot/boot/grub/menu.lst에 GRUB 부트 장치와 메뉴 파일을 포함하고 있습니다. 사용자는 Solaris 디스크 분할 영역에서 부트할 수있도록 /etc/vfstab에서 /stubboot 항목을 삭제하고, /boot/grub/menu.lst를 수정하고, BIOS를 재구성하여 X86 부트 분할 영역을 제거할 수 있습니다.

7.2 리얼 모드 드라이버

Solaris 10 1/06 OS 이전에는 리얼 모드 드라이버는 부트 프로세스의 부분으로 실행되었습니다. 기존의 일부 커널 드라이버는 해당 리얼 모드 드라이버에 따라 암시적으로 달라 하드웨어를 특정 상태로 배치할 수 있습니다. 리얼 모드 드라이버는 더 이상 GRUB 기반 부트의 일부가 아니기 때문에 이러한 커널 드라이버는 제대로 작동하지 않을 수 있습니다. 이 경우가 발생하게 되면 커널 드라이버를 수정하도록 드라이버 공급업체에 이 문제를 보고하십시오.


부록 A. 기본 GRUB 개념

이 부록에서는 GRUB의 기본 개념에 대해 설명합니다. 이 부록의 내용 중 일부는 알림 없이 변경될 수 있습니다. 보다 자세한 내용은 GRUB 설명서를 참조하십시오.

A. 1 장치 이름 지정

부트로더의 기본 목적은 저장소 장치에서 시스템 메모리로 데이터를 로드하는 것입니다. GRUB에서 작업하려면 GRUB에서 장치의 이름을 지정하는 방법에 대해 이해해야 합니다.

플로피 디스크의 이름은 다음과 같이 지정됩니다.

(fd0) -- first, second floppy

GRUB는 단일 네트워크 인터페이스만 참조합니다.

(nd) -- network interface

그리고 GRUB는 거의 항상 BIOS에서 DHCP를 통해 시험되고 구성된 인터페이스입니다. 플로피 또는 기타 로컬 매체에서 GRUB를 부트하여 네트워크 인터페이스를 구성할 수도 있습니다(부록 B 참조).

하드 디스크의 이름은 hd와 숫자로 시작됩니다. 숫자의 경우 0은 BIOS 디스크 0x80(BIOS에 의해 열거되는 첫 번째 디스크)에, 1은 0x81 등으로 차례대로 매핑됩니다.

(hd0) -- first bios disk (also the BIOS boot disk 0x81)
(hd1) -- second bios disk (BIOS disk 0x81)
(hd0,1) -- first bios disk, second primary partition
(hd0,0,a) -- first bios disk, first fdisk partition, Solaris/BSD slice 0 and 1

BIOS 디스크 번호 매기기는 BIOS 구성이 수정되는 경우 변경될 수 있습니다. 그러므로 BIOS 부트 디스크 순서를 변경하거나 디스크 구성을 수정하는 경우에는 GRUB 메뉴가 유효하지 않은 상태가 될 수 있습니다. BIOS에서 디스크 번호 다시 매기기와 관련된 부트 문제를 처리하려면 먼저 디스크 번호 매기기 규칙에 대해 알아야 합니다.

A.2 기능 구성 요소

기능 GRUB 구성 요소에는 stage1, stage2menu.lst가 포함되어 있습니다. stage1은 Solaris fdisk 분할 영역의 첫 번째 섹터에 설치되지만, 옵션으로 마스터 부트 섹터에 설치될 수도 있습니다. stage2는 Solaris 분할 영역에서 예비 영역에 설치됩니다. menu.lst/boot/grub에 있으며 GRUB stage2에서 읽습니다.

디스크에서 stage2가 있는 위치를 stage1에게 알려야 하므로 dd(1M)를 사용하여 디스크에 stage1stage2를 쓸 수 없습니다. installgrub(1M) 명령은 GRUB 부트 블록을 설치하는 지원 방식입니다.

/boot/grub/bin/grub에서 표시되더라도 GRUB 셸은 아직 지원되지 않으며, 일부 명령은 BIOS 호출 시 운영 체제 제한으로 인해 Solaris OS에서 작동하지 않습니다.

A.3 GRUB 메뉴

기본 메뉴 파일은 /boot/grub/menu.lst입니다. menu.lst를 수동으로 편집하면 다음 재부트 시 영향을 미칩니다. 일반적인 GRUB 메뉴는 다음과 같이 표시됩니다.

default 0
timeout 10
serial --unit=0 --speed=9600
terminal serial
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris
  root (hd0,0,a)
  kernel /platform/i86pc/multiboot -B console=ttya
  module /platform/i86pc/boot_archive
#---------------------END BOOTADM--------------------
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris failsafe
  root (hd0,0,a)
  kernel /boot/multiboot -B console=ttya -s
  module /boot/x86.miniroot.safe
#---------------------END BOOTADM--------------------

"default" 행은 타이머가 끝나면 부트할 항목을 지정하며, "timeout" 행은 기본 항목을 부트하기 전에 사용자 출력을 위해 기다려야 하는 대기 시간(초)을 지정합니다. timeout-1인 경우에는 사용자 출력이 필요합니다. serialterminal 명령은 함께 GRUB 출력을 serial --unit 행에서 지정한 직렬 포트로 전환합니다. root 명령은 파일을 로드할 디스크, 분할 영역 및 슬라이스를 지정합니다. GRUB는 파일 시스템 유형을 자동으로 감지합니다. 멀티부트 프로그램에는 항상 kernel 명령을 사용해야 합니다. multiboot 이후의 문자열은 해석되지 않고 Solaris OS에 전달됩니다.

64비트 커널을 명시적으로 지정하려면 GRUB 커널 명령을 다음과 같이 수정합니다.

kernel /platform/i86pc/multiboot kernel/amd64/unix

이와 비슷하게, 다음 명령은 32비트 커널을 부트합니다.

kernel /platform/i86pc/multiboot kernel/unix

A.4 GRUB 명령 모드

GRUB 프롬프트에서 명령을 입력하여 OS를 부트할 수 있습니다. GRUB 프롬프트로 이동하려면 GRUB 메뉴에서 'c'를 누르십시오. 사용 가능한 명령 목록을 보려면 'help'를 입력합니다. Esc 키를 누르면 메뉴로 돌아갑니다. 'e'를 눌러 기존 메뉴 항목을 편집할 수도 있습니다. 편집이 완료되면 'b'를 눌러 수정된 GRUB 항목으로 시스템을 부트하십시오.


부록 B. 네트워크 배포

이 부록에서는 네트워크를 통해 x86 플랫폼에서 Solaris OS를 배포하는 모범 사례에 대해 설명합니다. 이 부록의 내용 중 일부는 공지 없이 변경될 수 있습니다. 지원되는 인터페이스에 대한 내용은 매뉴얼 페이지 및 Solaris 관리 문서를 참조하십시오.

B.1 Solaris 네트워크 배포 개요

네트워크에서 Solaris OS를 배포하는 작업 이면에는 중앙 집중식 위치에 Solaris OS 이미지를 배치하는 개념이 있습니다. 네트워크에 연결된 시스템은 관리자 개입이 거의 없거나 전혀 없는 상태로 원하는 릴리스를 부트하고 설치할 수 있습니다. 설치 프로세스는 Solaris JumpStart 소프트웨어를 통해 자동 방식으로 수행할 수도 있습니다.

네트워크에서 부트하려면 일반적으로 PXE 클라이언트 용으로 구성된 DHCP 서버와 tftp 서비스를 제공하는 파일 서버가 필요합니다. DHCP 서버에서는 클라이언트가 네트워크 인터페이스를 구성하는 데 필요한 정보를 제공합니다. DHCP 응답에는 파일 서버의 IP 주소와 부트 파일 이름(pxegrub)도 포함되어 있습니다. 파일 서버는 pxegrub 이진, GRUB 메뉴, 멀티부트 프로그램 및 부트 아카이브 제공을 담당합니다. 기본적으로 GRUB 메뉴 파일은 menu.lst.01<eth_addr>입니다. 이 파일이 없으면 pxegrub는 DHCP 옵션 150(지정된 경우) 또는 /tftpboot/boot/grub/menu.lst로 폴백됩니다.

PXE를 사용하는 Solaris OS 부트 작업은 다음과 같이 작동합니다.

  1. 사용자는 네트워크 인터페이스에서 부트되도록 BIOS를 구성합니다.
  2. BIOS에서는 DHCP 요청을 전송합니다.
  3. DHCP 서버는 서버 주소와 부트 파일 이름이 있는 응답을 수행합니다.
  4. BIOS는 tftp를 통해 서버에서 pxegrub를 다운로드하고 pxegrub를 실행합니다.
  5. 시스템은 tftp를 통해 GRUB 메뉴 파일을 다운로드하고 메뉴 항목을 표시합니다.
  6. 사용자는 메뉴 항목을 선택하고 Solaris OS 로드를 시작합니다.

일반적인 배포 시나리오에서 pxegrub는 멀티부트 프로그램과, 메모리 내장 미니루트로 압축된x86.miniroot 파일을 다운로드합니다. 미니루트가 실행 중인 경우 미니루트가 /cdrom에서 Solaris 이미지(GRUB 메뉴의 install_media 등록 정보에서 지정됨)를 마운트하면 설치 프로세스가 시작됩니다.

다음 섹션에서는 DHCP 서버 설정, 클라이언트 요구 사항 및 여러 다양한 배포 시나리오에 대해 상세히 설명하겠습니다.

B.2 DHCP 서비스

클라이언트에서 DHCP 요청을 전송하면 서버는 클라이언트의 ID(일반적으로 이더넷 주소), 요청 "클래스" 및 클라이언트가 위치한 서브넷에 대한 알림을 받습니다. Solaris DHCP 서버는 클라이언트 요청을 일치시키는 다음 응답 기반 매크로를 형성합니다.

  • 클래스 매크로

  • 네트워크 매크로

  • IP 매크로

  • 클라이언트 매크로

클래스 매크로의 이름은 "class string"으로 지정되며 DHCP 요청에 포함되어 있습니다. x86 플랫폼에서 BIOS는 항상 클래스가 PXEClient:Arch:00000:UNDI:002001인 DHCP 요청을 만듭니다. 이 이름으로 된 매크로가 DHCP 서버 구성에서 정의되면 매크로 내용은 섹션 B.1의 (c) 단계에서 x86 클라이언트로 전송됩니다.

네트워크 매크로 이름은 서브넷의 IP 주소로 지정됩니다. 매크로 129.146.87.0이 DHCP 서버에서 정의되면 매크로 내용은 요청 클래스에 상관없이 해당 서브넷에 있는 모든 클라이언트로 전송됩니다. 클래스 매크로와 네트워크 매크로에 모두 옵션이 정의되어 있으면 네트워크 매크로가 우선적으로 적용됩니다.

IP 매크로 이름은 IP 주소로 지정되며, x86 플랫폼에서 Solaris OS를 부트하는 과정에서는 거의 사용되지 않습니다.

클라이언트 매크로 이름은 클라이언트의 유형(이더넷의 경우 01)과 대문자로 된 MAC 주소로 지정됩니다. 이더넷 주소가 0:0:39:fc:f2:ef인 클라이언트인 경우 해당 매크로 이름은 01000039FCF2EF입니다.

이더넷 주소가 0:0:39:fc:f2:ef인 클라이언트가 서브넷 129.146.87.0에 있고 클래스가 PXEClient인 DHCP 요청을 만든다고 가정해봅시다.

DHCP 서버에는 이와 맞는 매크로가 있습니다.

- PXEClient
BootSrvA:  129.146.87.194
BootFile:  pxegrub
- 129.146.87.0
Router:    129.146.87.1
NISdmain:  sunsoft.eng.sun.com
- 01000039FCF2EF
BootFile:  01000039FCF2EF

실제 DHCP 응답은 다음과 같습니다.

BootSrvA:  129.146.87.194
BootFile:  01000039FCF2EF
Router:    129.146.87.1
NISdmain:  sunsoft.eng.sun.com

클라이언트 매크로의 BootFile은 클래스 매크로의 BootFile을 오버라이드합니다.

B.3. 가장 간단한 넷 부트 설정

최소한 서버와 클라이언트가 한 대씩 필요합니다. 서버에는 실행 중인 DHCP 서버와 사용할 수 있는 Solaris 배포 이미지가 있어야 합니다. 클라이언트 시스템은 PXE 부트 요청을 지원할 수 있는 서버와 동일한 서브넷에 연결됩니다. 서버 IP 주소가 192.168.0.123이고, 클라이언트 이더넷 주소가 0:0:39:fc:f2:ef라고 가정할 때 서버 설정을 위한 단계는 다음과 같습니다.

a. Solaris 배포 이미지의 Tools 디렉토리로 이동하여 다음과 같이 실행합니다.

# add_install_client -d -e 0:0:39:fc:f2:ef i86pc

b. DHCP 서비스용 클라이언트 매크로 이름을 01000039FCF2EF를 다음과 같이 만듭니다.

BootSrvA:  192.168.0.123
BootFile:  01000039FCF2EF

이 작업은 dhcpmgr GUI 또는 명령줄 인터페이스에서 수행할 수 있습니다.

이제 클라이언트를 부트하여 Solaris OS를 설치할 수 있습니다.

B.4. PXE/DHCP없이 넷 설치

플로피, CD-ROM 또는 로컬 디스크를 로드하고, GRUB에서 네트워크를 수동으로 구성하고, 파일 서버에서 multibootboot_archive를 다운로드할 수 있습니다. 이 작업은 다음과 같은 여러 가지 이유에서 수행할 필요가 있을 수 있습니다.

  • 클라이언트의 BIOS가 PXE를 지원하지 않습니다.
  • 네트워크 카드에 UNDI ROM이 없습니다.
  • 네트워크에 DHCP 서비스가 없습니다.
  • BIOS에서 부트 장치 순서를 다시 구성하지 않고도 설치/재부트 시퀀스를 자동화할 수 있습니다.

Solaris OS에 설치된 표준 GRUB stage2에는 넷 부트 지원이 포함되어 있습니다. GRUB 메뉴에서 'c'를 누르면 명령 모드로 이동하여 기능을 사용할 수 있습니다. 다음은 작업 예입니다.

grub> ifconfig --address=192.168.0.02 --gateway=192.168.0.1 
   --mask=255.255.255.0 --server=192.168.123.110
grub> root (nd)
grub> kernel /multiboot.I86PC.Solaris_10-1 kernel/unix -B
   install_media=192.168.123.110:/export/setje/boot_74L2
grub> module /x86.miniroot
grub> boot

물론 ifconfig 명령은 로컬 네트워크 환경에 적절한 값으로 지정되어야 합니다. 디스크 또는 플로피의 menu.lst 파일에 위의 명령이 있는 메뉴 항목을 추가할 수도 있습니다.

사용하기 전에 플로피에서 /boot/grub/menu.lst를 편집해야 합니다. 네트워크 카드에 UNDI ROM이 포함되어 있으면 UNDI 기반 플로피 이미지를 선택하기만 하면 됩니다. 그렇지 앟으면 일치하는 Solaris 드라이버 이름(bge, e1000g 등)이 있는 플로피 이미지를 선택해야 합니다. 특수 GRUB stage2가 있고 사용자 고유의 플로피를 작성하려는 경우 지침은 다음과 같습니다.

<format floppy>
# mount -F pcfs /dev/diskette /mnt (you may have to disable vold prior to doing this)
# cd /boot/grub
# /sbin/installgrub stage1 stage2 /dev/rdiskette
stage1 written to boot sector on floppy
first 2 sectors of stage2 written on floppy

/mnt/boot/grub/menu.lst를 편집하여 다음 항목을 포함시킵니다.

title Solaris
  ifconfig --address=192.168.0.2 --gateway=192.168.0.1 
     --mask=255.255.255.0 --server=192.168.123.110
  root (nd)
  kernel /multiboot.I86PC.Solaris_11-1 kernel/unix -B
     install_media=192.168.123.110:/export/setje/boot_74L2
  module /x86.miniroot

B.5. 여러 Solaris 이미지 관리

Solaris 이미지가 여러 개 있는 경우 각 클라이언트에 설치할 릴리스 또는 빌드를 선택하는 방법이 필요합니다. 다음은 이를 수행하는 몇 가지 가능한 방법입니다.

  1. DHCP 서버를 변경되지 않은 상태로 유지한 다음 부트 서버에서 add_install_client를 실행합니다.
  2. 부트 서버를 변경되지 않은 상태로 유지한 다음 웹 인터페이스를 통해 DHCP 클라이언트 매크로를 수정하여 릴리스/빌드를 선택합니다.
  3. 부트 서버와 DHCP 서버를 모두 변경되지 않은 상태로 유지한 다음 클라이언트가 GRUB 메뉴에서 릴리스/빌드를 선택합니다.

(a)의 경우는 부트 서버를 관리하는 표준 방식입니다. 네트워크 관리자는 각 클라이언트에 대해 일회성 DHCP 서비스 설정을 수행합니다. 그런 다음 클라이언트 사용자는 부트 서버에 로그인하여 add_install_client를 실행합니다. Solaris 10 FCS 클라이언트용 작업 DHCP 설정이 있는 경우에는 동일한 설정이 pxegrub 기반 부트에 작동합니다.

(b)의 경우에서는 GRUB 메뉴 파일을 제공하려면 DHCP 옵션 150을 사용해야 합니다. 사용자가 클라이언트용 릴리스/빌드를 선택하면 DHCP 구성이 수정되어 선택한 릴리스/빌드가 들어 있는 메뉴 파일에 옵션 150을 설정합니다. 각 릴리스/빌드에 대한 메뉴 파일은 부트 서버에서 선험적으로 만들어져야 합니다. 선택한 릴리스/빌드에서 부트를 위해 pxegrub를 사용하지 않으면 이전 Solaris 설정이 구성됩니다.

(c)의 경우는 pxegrub 기반의 릴리스 또는 빌드용으로만 작동합니다. 새 이미지가 서버측에 추가되면 메뉴 항목이 추가됩니다. 클라이언트가 부트되면 이 새 메뉴 항목을 사용하여 선택할 수 있습니다. 하지만 pxegrub는 이전 Solaris 넷 부트 프로그램(nbp라고 함)을 체인로드할 수 없습니다. 클라이언트 선택이 nbppxegrub에서 작동하게 하려면 서버에 pxelinux를 구성합니다. 이렇게 하면 nbp 또는 pxegrub를 로드할 수 있습니다. pxelinux에 대한 자세한 내용은 이 문서에서는 다루지 않습니다.

B.6. 자동화된 배포 시퀀스

자동화된 배포는 종종 다음 시퀀스로 수행됩니다.

  • Solaris JumpStart 소프트웨어를 통해 디스크에서 넷 부트를 수행하고 Solaris OS를 설치합니다.
  • 디스크를 재부트하고 미리 구성된 작업 세트를 실행합니다.

배포가 끝나면 시스템은 유휴 상태가 되어 사용자 작업을 기다립니다.

대부분의 경우 초기 넷 부트는 F12 키(또는 플랫폼에 따라 다른 키 시퀀스)를 눌러 수동으로 초기화할 수 있습니다. 하지만 일부 시스템은 BIOS 직렬 콘솔 리디렉션을 지원하지 않으며, 사용자가 물리적 콘솔에 있어야 한다는 요건은 합당하지 않습니다. 또한 일부 BIOS는 넷 부트 요청을 위해 시간이 매우 짧은 창을 제공하는 데 이렇게 되면 사용자 경험이 부족해집니다. 한가지 방법으로는 플로피에서 넷으로 부트한 다음 플로피를 재작성하여 디스크에 부트하는 것입니다. 새 플랫폼에서는 플로피 드라이브가 제공되지 않으므로 이 방법은 더 이상 표시되지 않습니다.

디스크에서 GRUB를 로드하는 것이 좋습니다. /boot/grub/menu.lst에서 다음 메뉴 항목을 추가하여 JumpStart용 네트워크에 부트한 다음 이 명령을 통해 이 항목을 기본 부트 항목으로 설정합니다.

 # bootadm set-menu default=<menu_entry_number>

여기서 <menu_entry_number>는 아래에 추가하는 옵션의 메뉴 항목(0부터 번호가 매겨짐)입니다.

title Solaris Jumpstart
        dhcp
        root (nd)
        kernel .../multiboot kernel/unix - install -B console=...
        module ../x86.miniroot

시스템이 설치되고 나면 기본 boot =. 항목이 수정되어 디스크에서 자동으로 부트가 수행됩니다. 이러한 방법으로 전체 배포 시퀀스를 전원 순환을 통해 초기화할 수 있습니다.

B.7. 문제 해결

이제 이 작업이 작동하지 않으면 어떻게 됩니까? 다음은 문제 해결을 위한 몇 가지 팁입니다.

a. 클라이언트가 넷 부트를 시도하지 않고 곧바로 디스크로 부트합니다.

이 문제는 보통 클라이언트의 PXE ROM이 비활성화되거나, BIOS가 네트워크 전에 디스크에서 부트하도록 구성된 경우를 의미합니다. 수정 방법은 BIOS로 이동하여 구성을 수정하는 것입니다. 자세한 내용은 시스템에 따라 달라집니다.

b. 클라이언트에서 넷 부트를 시도하지만 응답이 없습니다.

네트워크 케이블, 인터페이스 카드에 있는 LED 등에 대해 일반적인 검사를 수행합니다. 서버에서 snoop을 실행합니다.

# snoop -v [-d <interface>] 0:0:39:fc:f2:ef

여기서 <interface>bge0과 비슷합니다. -d 옵션은 서버에 네트워크 인터페이스 카드가 2개 이상 있는 경우에만 필요합니다. 다음은 확인해야 할 항목입니다.

  • DHCPDISCOVER (client -> server)
  • DHCPOFFER (server -> client)
  • DHCPREQUEST (client -> server)
  • DHCPACK (server -> client)

DHCPDISCOVER 메시지가 없으면 보통 잘못된 케이블 및 네트워크 카드로 인해 클라이언트가 전송하지 않습니다.

DHCPDISCOVER 패킷이 표시되지만 DHCPOFFER 메시지가 없으면 서버가 응답하지 않음을 의미합니다. DHCPDISCOVER 메시지를 살펴보고 이더넷 주소가 DHCP 서버의 매크로 이름과 일치하는지 확인합니다. 서버에서 클래스 매크로를 사용하는 경우에는 클래스 문자열이 일치하는지 확인하십시오. BIOS DHCP 요청에서 클래스 문자열은 항상 다음과 같습니다.

PXEClient:Arch:00000:UNDI:002001

c. 클라이언트에 TFTP 시간 초과 메시지가 표시됩니다.

이 문제는 tftp 서비스가 제대로 설정되어 있지 않을 때 발생할 수 있습니다. 서버를 검사하여 tftp가 활성화되어 있는지(in.tftpd가 실행 중인지), 그리고 파일 /tftpboot/01000039FCF2EF가 존재하여 pxegrub 이진에 연결되는지 확인합니다. add_install_client 단계에서는 tftp 파일과 tftp 서비스를 모두 설정해야 합니다.

d. 클라이언트가 x86.miniroot 다운로드 중에 중단됩니다.

TFTP 프로토콜은 최대 65K의 블록을 전송할 수 있습니다. 일부 tftp 서버(예: Solaris 8 OS를 실행 중인 서버)가 적은 블록 크기(512)만 지원하여 이로 인해 최대 파일 크기가 32MB가 되며, 이는 x86.miniroot 크기(약 45MB)보다 작습니다. tftp 서버를 업그레이드하면 이 문제가 해결됩니다.

서버가 Solaris 8 OS를 실행 중인 경우에는 Solaris 8 OS용 TFTP 패치를 사용할 수 있을 때까지 Solaris 9 OS에서 /usr/sbin/in.tftpd를 복사할 수 있습니다.

e. 클라이언트에서 x86.miniroot 다운로드를 완료하고 난 다음 클라이언트가 중단됩니다.

이 문제의 대부분은 콘솔 출력이 다른 위치로 이동한 경우에 발생할 수 있습니다. console 변수가 GRUB 메뉴 행에서 제대로 설정되어 있는지 확인합니다. 입/출력 장치를 설정해도 작동됩니다. 섹션 4.2를 참조하십시오.

f. 클라이언트에 "No ethernet card found"라는 메시지가 표시됩니다.

이 문제는 로컬 매체에서 GRUB를 부트하고 네트워크에서 Solaris OS를 로드할 때 발생할 수 있습니다. 이는 GRUB에서 PCI BIOS32 서비스를 사용하는 네트워크 인터페이스를 찾을 수 없음을 나타냅니다.

g. 클라이언트에 "No PnPBios found"라는 메시지가 표시됩니다.

이 문제는 로컬 매체에서 GRUB를 부트하고 네트워크에서 Solaris OS를 로드할 때 발생할 수 있습니다. 이 경우 GRUB가 네트워크 인터페이스에 있지만, 네트워크 인터페이스 카드에서 UNDI ROM을 설치하는 PnP Bios 서비스를 찾지 못했습니다.


참조
  1. GNU GRUB 웹 페이지(http://www.gnu.org/software/grub/grub.html)
  2. GNU 사이트(http://www.gnu.org/software/grub/manual/multiboot/multiboot.html)의 멀티부트 사양 웹 페이지
  3. GRUB 및 Solaris 10 1/06 OS에 대한 FAQ: x86 플랫폼용 새 부트로더(http://www.sun.com/bigadmin/features/articles/grub_boot_faq.html)

Comments (latest comments first)

Discuss and comment on this resource in the BigAdmin Wiki

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin
  
 
BigAdmin Upgrade Hub