저는 다양한 Linux 설치(iso, 플래시, 플래시의 iso, 플래시의 커널, 플래시의 iso 파일의 루트 FS...)를 시도하고 있으며 무슨 일이 일어나고 있는지 이해하고 싶습니다.
내 질문은: 배포판(vmlinuz 및 initrd)에서 빌드된 커널 및 ramfs 파일이 주어지면 "/" 파일 시스템을 찾을 위치를 찾을 수 있습니까? 커널을 다시 컴파일하지 않고 이를 구성할 수 있습니까?
한 가지 더: 커널이 .iso 파일 시스템에 의해 생성된 루프백 장치에서 루트 파일 시스템을 로드할 때 이 프로세스를 어떻게 구성합니까? 감사해요!
편집하다: 실제로 GRUB 구성에는 GRUB 루트가 포함되어 있습니다.실제 커널 루트 파일 시스템이 아닙니다.위치는 GRUB 콘텐츠가 포함된 폴더일 뿐입니다.
init
initrd
실제 루트는 설명된 대로 스크립트에서 구성됩니다 .여기.
이것은 데비안 커널이 하드 드라이브에서 부팅할 때 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 구성 파일은 설치된 시스템에서 루트 장치(사용)를 채우는 스크립트에 의해 생성 됩니다 .root
set root=(hd0,1)
update-grub
/boot/grub/device.map
- U-Boot: 루트 장치는 명령줄 인수의 일부로
bootargs
환경 변수 에 전달됩니다. U-Boot 바이너리에는 컴파일 타임에 내장된 기본값이 포함되어 있으며, 이는 플래시 메모리의 설정을 통해 재정의될 수 있습니다(장치에서 허용하는 경우).
명령줄 인수가 없으면 root
initrd 또는 initramfs(사용된 경우)는 마운트할 루트 파티션을 찾으려고 시도할 수 있습니다. root
매개변수가 존재 하더라도 initrd 또는 initramfs는 다른 장치를 사용하기로 결정할 수 있습니다. 코드콜switch_root
initrd에서 실제 루트 디렉터리로 전환합니다.
명령줄 인수가 없는 기본 루트 장치는 root
컴파일 타임에 결정됩니다. 다음을 사용하여 이진 이미지에서 이 값을 변경할 수 있습니다.rdev
유용.
시작된 커널에서 root
커널에 전달된 인수(있는 경우)를 볼 수 있습니다 /proc/cmdline
. /
실제 설치된 장치를 에서 볼 수 있습니다 /proc/mounts
.
답변4
이것이 여전히 흥미로운지는 확실하지 않지만, 저와 같은 미래의 Google 사용자를 위한 내용은 다음과 같습니다.
root
grub에서 부팅/설치할 때 두 개의 별도 디렉터리가 사용됩니다. 일부는그럽 루트그리고리눅스 루트 디렉토리(기술적인 용어인지는 잘 모르겠습니다.)
이것그럽 루트grub.cfg
grub에 표시되는 파일을 설정하고 결정할 수 있습니다 . 기본 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)