vmlinuz 및 initrd.gz가 주어지면 커널이 /(루트) 파일 시스템을 로드할 위치를 어떻게 알 수 있습니까?

vmlinuz 및 initrd.gz가 주어지면 커널이 /(루트) 파일 시스템을 로드할 위치를 어떻게 알 수 있습니까?

저는 다양한 Linux 설치(iso, 플래시, 플래시의 iso, 플래시의 커널, 플래시의 iso 파일의 루트 FS...)를 시도하고 있으며 무슨 일이 일어나고 있는지 이해하고 싶습니다.

내 질문은: 배포판(vmlinuz 및 initrd)에서 빌드된 커널 및 ramfs 파일이 주어지면 "/" 파일 시스템을 찾을 위치를 찾을 수 있습니까? 커널을 다시 컴파일하지 않고 이를 구성할 수 있습니까?

한 가지 더: 커널이 .iso 파일 시스템에 의해 생성된 루프백 장치에서 루트 파일 시스템을 로드할 때 이 프로세스를 어떻게 구성합니까? 감사해요!

편집하다: 실제로 GRUB 구성에는 GRUB 루트가 포함되어 있습니다.실제 커널 루트 파일 시스템이 아닙니다.위치는 GRUB 콘텐츠가 포함된 폴더일 뿐입니다.

initinitrd실제 루트는 설명된 대로 스크립트에서 구성됩니다 .여기.

이것은 데비안 커널이 하드 드라이브에서 부팅할 때 ISO 파일을 찾는 방법입니다 - initramfs가 ISO 파일을 찾습니다:http://www.debian.org/releases/stable/i386/apas02.html.en#howto-getting-images-hard-disk;GRUB 구성 참고ISO 위치에 대한 참조가 포함되어 있지 않습니다..

답변1

시작 시 제공됩니다.부트 로더, Grub과 같은.

커널이 어떤 매개변수로 시작되었는지 확인하려면:

$ cat /proc/cmdline

나에게 이 결과는 다음과 같습니다.

BOOT_IMAGE=/vmlinuz-3.5.0-13-generic root=/dev/mapper/crypt-precise--root ro

따라서 initrd/initramfs는 내 /dev/mapper/crypt-precise--root(암호화된 LVM) 논리 볼륨을 /.

동일한 커널(멀티부팅)을 사용하여 하드 드라이브에서 다른 운영 체제를 로드하도록 Grub을 재구성하거나 e(아직 부팅되지 않은) Grub 항목이 선택되었을 때 런타임을 눌러 이 줄을 편집할 수 있습니다.

최근 Debian 기반 배포판의 경우 영구적으로 변경하는 방법은 다음과 같습니다.
(원래 운영 체제로 다시 부팅하지 못할 수도 있으니 주의하세요!)

파일에서 /etc/default/grub몇 가지 사항을 직접 설정 GRUB_CMDLINE_LINUX="root=/dev/mydevice"하고 다음을 수행하여 Grub을 업데이트하세요 update-grub.

그러나 멀티부팅을 구성하는 것이 좋습니다. 그렇지 않으면 Grub 구성을 쉽게 변경하거나 업데이트할 수 없습니다.

답변2

부팅 이미지가 제공되면 file다음 명령을 사용하여 내부 커널 버전 문자열을 찾을 수 있습니다.

%> file /boot/vmlinuz-linux
/boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 3.5.3-1-NAME (X@Y) #1 SMP PREEMPT WEEK MON DAY, RO-rootFS, swap_dev 0x5, Normal VGA

답변3

대부분의 설치에서는 부트 로더의 루트 장치를 지정합니다. 루트 장치는 라는 매개변수로 커널에 전달됩니다 root. 부트로더에 따라 이는 커널 명령줄 매개변수(모양 ro quiet root=/dev/sda1)의 일부이거나 별도의 설정일 수 있습니다. 일부 일반적인 부트로더의 경우:

  • Lilo: 구성 파일( )에는 Linux 루트 장치를 나타내는 지시문이 /etc/lilo.conf있습니다 .root
  • Grub Legacy(버전 0.9x): 루트 장치는 일반적으로 구성 파일에서 커널 명령줄(지침)의 일부로 전달됩니다 /boot/grub/menu.lst. Grub 자체에는 kernel다른 지시어가 있습니다. root이는 Grub에게 커널과 같은 파일을 찾을 위치를 알려줍니다. 많은 시스템에서 Grub 구성 파일은 update-grub설치된 시스템의 루트 장치(사용)를 채우는 스크립트에 의해 생성 됩니다 /boot/grub/device.map.
  • Grub 2(버전 1.9x): 루트 장치는 (일반적으로) 구성 파일에서 커널 명령줄(지침)의 일부로 전달됩니다 /boot/grub/grub.cfg. Grub에게 파일(예: 커널)을 찾을 위치를 알려주는 다른 변수( ) linux가 있다는 점에 유의하세요 . 많은 시스템에서 Grub 구성 파일은 설치된 시스템에서 루트 장치(사용)를 채우는 스크립트에 의해 생성 됩니다 .rootset root=(hd0,1)update-grub/boot/grub/device.map
  • U-Boot: 루트 장치는 명령줄 인수의 일부로 bootargs환경 변수 에 전달됩니다. U-Boot 바이너리에는 컴파일 타임에 내장된 기본값이 포함되어 있으며, 이는 플래시 메모리의 설정을 통해 재정의될 수 있습니다(장치에서 허용하는 경우).

명령줄 인수가 없으면 rootinitrd 또는 initramfs(사용된 경우)는 마운트할 루트 파티션을 찾으려고 시도할 수 있습니다. root매개변수가 존재 하더라도 initrd 또는 initramfs는 다른 장치를 사용하기로 결정할 수 있습니다. 코드콜switch_rootinitrd에서 실제 루트 디렉터리로 전환합니다.

명령줄 인수가 없는 기본 루트 장치는 root컴파일 타임에 결정됩니다. 다음을 사용하여 이진 이미지에서 이 값을 변경할 수 있습니다.rdev유용.

시작된 커널에서 root커널에 전달된 인수(있는 경우)를 볼 수 있습니다 /proc/cmdline. /실제 설치된 장치를 에서 볼 수 있습니다 /proc/mounts.

답변4

이것이 여전히 흥미로운지는 확실하지 않지만, 저와 같은 미래의 Google 사용자를 위한 내용은 다음과 같습니다.

rootgrub에서 부팅/설치할 때 두 개의 별도 디렉터리가 사용됩니다. 일부는그럽 루트그리고리눅스 루트 디렉토리(기술적인 용어인지는 잘 모르겠습니다.)


이것그럽 루트grub.cfggrub에 표시되는 파일을 설정하고 결정할 수 있습니다 . 기본 grub 루트는 grub이 부팅되는 드라이브의 루트여야 합니다. 따라서 부팅 가능한 드라이브의 내용은 다음과 같습니다.

/boot/
/boot/grub2/
/boot/grub2/grub.cfg
...

그런 다음 grub.cfg의 위치그럽 루트/boot/grub2/grub.cfg

grub.cfg를 사용하여 grub 루트 디렉터리를 변경할 수 있습니다 set root=.

이를 사용하여 루트 디렉터리를 현재 루트 디렉터리 내의 디렉터리로 설정할 수 있습니다( set root=/boot/이렇게 하면 루트 디렉터리가 grub.cfg에 위치하게 됨). 이는 Linux의 /grub2/grub.cfg와 유사하게 작동합니다 .chroot

현재 루트 디렉터리를 다른 드라이브로 변경할 수도 있습니다( set root=(hd0,1)루트 디렉터리를 hd0, 파티션 1로 설정). 사용할 수 있는 장치의 전체 목록은 해당 장치에 대한 grub 페이지를 참조하세요.http://www.gnu.org/software/grub/manual/grub.html#Device-syntax).

grub 루트 디렉터리를 변경하는 것이 유용할 수 있지만 사용하려는 경로를 앞에 추가할 수도 있습니다(예: 첫 번째 경로 linux (hd0,1):/boot/OS/RHEL/isolinux/vmlinuz대신 ). set root=(hd0,1)반품,커널이 부팅되면 grub 루트는 중요하지 않습니다.


에 관해서는리눅스 루트 디렉터리, 커널(vmlinuz) 로딩 시 전달할 수 있는 매개변수입니다. 이렇게 하려면 매개변수를 커널에 전달합니다 root=(값은 /proc/cmdline에 나타납니다).

그러나 이 새로운 루트 디렉토리에는 Linux 루트 파일 시스템(/etc/ /var/ 등을 찾으십시오)이 포함될 것으로 예상된다는 점은 주목할 가치가 있습니다. 설치 시 이러한 요소가 포함된 initrd(INITial Ram Disk)를 제공하므로 설치 중에 Linux 루트 디렉터리를 변경하지 않거나 변경할 필요가 없을 수 있습니다.

Linux 루트 디렉터리를 변경하는 경우 Linux 설치 미디어는 Linux 루트 파일 시스템이 아니지만 그 안에 포함된 initrd.img는 있다는 점에 유의하십시오.


ISO의 파일을 커널에 대한 인수로 사용하려는 경우 해결책이 있습니다. grub에서 루프백 장치를 생성하면 장치는 커널 부팅 시에도 유지됩니다 /dev/loop0.리눅스 루트 디렉터리설치 중)

특히 ISO 및 RHEL과 관련된 grub.cfg의 짧은 조각을 제공하겠습니다.

menuentry "RHEL" {
    set isofile='/boot/iso/RHEL.iso' #this is just a grub variable

    loopback loop $isofile           #mount the $isofile with label=loop as a loopback device

    set root=(loop)                  #set the grub root to the mounted iso (so / is the top level directory in the iso)

    #this starts the kernel and passes the paramter inst.stage2 using the ISO and kickstart as a location on the loopback device created by grub (the syntax for this line is liable to change between distros)
    linux /isolinux/vmlinuz noeject inst.ks=hd:/dev/loop0:/ks/ks.cfg inst.stage2=hd:LABEL=USBDRIVELABEL:/$isofile  

    initrd /isolinux/initrd.img      #provide an initial ramdisk (which will become the **Linux root**
}

grub.cfg의 커널 라인 구문은 다음과 같습니다.

linux [path to kernel] [kernel argument 1] [kernel argument 2] ...

커널 인수는 모두 에 표시됩니다 /proc/cmdline. grub 구문은 커널에 의해 처리되므로 유효하지 않습니다.

이에 대한 자세한 내용은 grub 문서(http://www.gnu.org/software/grub/manual/grub.html#소개)

및 커널 매개변수 Archwiki 페이지(https://wiki.archlinux.org/index.php/kernel_parameters#GRUB)

관련 배포판에 대한 부팅 옵션(RHELhttps://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/chap-anaconda-boot-options.html#list-boot-options-sources)

관련 정보