initrd를 사용하지 않고 LVM에 루트를 넣을 수 있습니까?


12

방금 Gentoo 기본 ​​시스템을 설정했습니다 (지금 부팅하고 로그인하여 작업 할 수 있음). 내 루트 파티션은 LVM2 가상 그룹 (분리 된 /boot파티션)에 있습니다. 부팅하려면 아래 매개 변수를 커널에 전달해야합니다.

root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm

분명히 루트를 마운트하기 전에 초기 램 디스크를 사용하여 무언가를 수행하고 있습니다 (LVM을로드하는 것 같습니다). initrd가 필요하지 않도록이 코드를 커널 자체에 넣을 수있는 방법이 있습니까? 그렇지 않다면 어떻게 initrd를 직접 만들 수 있습니까?

initrd없이 비 LVM 루트에 대한 커널 컴파일을 시도했으며 완벽하게 작동했다는 것을 추가하는 것이 유용 할 수 있습니다. 그런 다음 모든 것을 LVM 아래에 두려고 시도했지만 시스템을 부팅 할 수 없었습니다 (LVM 항목을 처리 할 수 ​​없습니다). 그런 다음 옵션과 genkernel함께 도구를 사용했으며 --lvm현재 사용중인 커널과 initrd를 만듭니다.

이제 genkernelinitrd없이 모든 것을 건너 뛰고 스스로 수행 하고 싶습니다. 따라서 기계가 다소 빨리 부팅됩니다 (어쨌든 유연성이 필요하지 않습니다).


initrd는 부팅 시간에 약간의 영향을 줄 수 있지만 시스템이 시작되어 실행되면 시스템 성능에는 영향을 미치지 않습니다.
Kristof Provost

오, 그래요, 부팅 시간을 의미했습니다. 편집
phunehehe

답변:


6

간단한 대답 : 아닙니다. LVM을 원한다면 initrd가 필요합니다.

그러나 다른 사람들이 전에 말했듯이 LVM은 시스템 속도를 늦추거나 다른 방식으로 나쁜 일을하지 않으므로 커널을로드하고 작업을 수행 할 수있는 환경을 만들 수 있습니다.

initrd를 사용하면 커널을로드 할 수 있습니다. 커널이 LVM 드라이브에 있으면 커널이 포함 된 바이너리를로드하기 전에 전체 LVM 환경을 설정해야합니다.

initrd의 기능과 필요한 이유를 설명하는 initrdWikipedia Entry를 확인하십시오 .

또 다른 참고 사항 : 나는 당신이 스스로 일하고 싶어한다는 것을 알지만 genkernel로도 손이 더러워 질 수 있습니다. genkernel --menuconfig all을 사용하면 도구 지원없이 커널을 완전히 빌드하는 것처럼 기본적으로 모든 것을 설정할 수 있습니다.

여기에 initramfs 또는 initrd에 대해 설명되어 있으므로 initrd를 직접 빌드 할 수 있습니다 .


확인해 주셔서 감사합니다. "아니라면 어떻게 initrd를 직접 만들 수 있습니까?"
phunehehe

정보를 추가하고 다른 답변을이 정보에 병합했습니다.
tante

8
사소한 수정 : initrd는 커널 을로드하는 데 사용되지 않습니다 : 커널은 부트 로더 (GRUB, LILO 등)에 의해로드됩니다. initrd는 초기 루트 파일 시스템을 제공하는 일종의 램 디스크입니다. 시스템을 실제로 작동시키는 데 필요한 모든 바이너리 (예 : 커널 모듈, 사용자 공간 지원 프로그램)를 포함해야합니다. 이것이 LVM 루트에 필요한 이유입니다. LVM 하위 시스템을 초기화해야하며 커널 부팅 매개 변수만으로 편리하게 초기화 할 수없는 초기화가 너무 복잡합니다. 따라서 linuxrcinitrd 의 스크립트가이 작업을 수행합니다.
Riccardo Murri

당신은 물론 그렇습니다, 나는 나의 어구에 다소 조잡했습니다.
tante

2
대답에서 꽤 큰 실수로 인해 투표 할 수 없습니다 (initrd는 커널을로드 할 수 없습니다).
wzzrd

5

편집 : 방금 LVM에서 부팅하려고한다는 것을 깨달았습니다 .LVM을 설정 한 적이 없으며 절대 필요하지 않으므로 아마도 접근 방식이 작동하지 않을 수 있습니다

다음은 initrd-less 커널을 만들기 위해 수행해야 할 기본 규칙입니다 (메모리에서 정확히 기억하지 못했습니다).

  1. 커널을 다시 컴파일하고 커널에 내장해야합니다 (중요 : 모듈이 아님).

    1. 마더 보드 드라이버 및 하드 드라이브 드라이버 (아래 Device Drivers)
    2. 파일 시스템 드라이버 /, /etc/*/lib/modules/*(아래 File systems)

    기본적으로 커널은 루트 파일 시스템을 마운트하고 / etc / fstab을 읽고 다른 드라이버 모듈을로드하고 (필요한 경우) 다른 비 루트 파일 시스템을 마운트하여 나머지 부팅 프로세스를 완료 할 수 있어야합니다. 네트워크 부팅과 같이 부팅 과정이 더 복잡하다면 해당 드라이버도 내장해야합니다.

  2. 커널 "일반 설정> 초기 RAM 파일 시스템 및 RAM 디스크 (initramfs / initrd) 지원"에서 일명 CONFIG_BLK_DEV_INITRD = n에서 initrd를 비활성화하십시오.

  3. GRUB 구성을 수정하면 더 이상 init = 및 realroot =가 필요하지 않으며 root = system 장치를 가리키는 root = 설정이 필요합니다.

나는 그것이 전부라고 생각합니다. 문제가 발생할 경우를 대비하여 백업 커널과 부팅 가능한 라이브 CD를 잘 보관하십시오.

잘못된 일 : 잘못된 드라이버로 컴파일하거나 기본 드라이버를 모듈로 컴파일하면 커널이 파일 시스템을 읽을 수 없습니다. 최신 커널 또는 Live CD로 재부팅하고 올바른 드라이버로 커널을 다시 컴파일하십시오.

가장 어려운 부분은 하드웨어와 관련된 드라이버를 파악하는 것입니다. 하드웨어를 사용 lspci하고 lshw식별하는 데 도움을 줄 수 있습니다. 이러한 도구가없는 경우 emerge lshw pciutils.


커널 컴파일에서 내장 대 모듈을 언급하면 ​​+1입니다.
amphetamachine

lsmod실행중인 커널에서 유용합니다.
LawrenceC

2

네, 당신은 initrd가 필요합니다. 이유는 다음과 같습니다.

일반적인 부트 프로세스는 부트 로더로 시작하는데, 이는 커널을 찾아서 실행할 수있는 충분한 시스템을 알고 있습니다. GRUB2는 LVM2 또는 RAID 파티션에있는 커널을 찾을 수있을만큼 똑똑하지만 GRUB1은 그렇지 않으므로 일반적으로 레이아웃이 단순화 된 별도의 파티션으로 / boot를 작성하는 것이 좋습니다. 일단로드되면 커널이 필요합니다. 루트 파일 시스템을 찾을 수 있도록 부팅 프로세스를 시작할 수 있습니다. 그러나 루트 파일 시스템에 존재하는 일부 사용자 공간 도구에 의해 트리거되지 않고 LVM을 시작할 수 없습니다. 루트 파일 시스템에 존재하는 LVM 도구 없이는로드 할 수 없습니다 ...;)

이 사이클을 중단하기 위해 initrd 또는 initramfs는 커널 (/ boot 또는 커널 자체)에 저장된 압축 파일 시스템이며 LVM 또는 MD 등의 서비스를 시작하기에 충분한 Linux 시스템 만 포함합니다. 당신이 원합니다. 임시 파일 시스템이며 실제 루트를로드 할 수있을 정도로 오랫동안 루트 파일 시스템 역할을합니다.

실제로 만드는 한, 주제에 관한 대부분의 문서는 엄청나게 쓸모가 없습니다. 예를 들어 lvm2create_initrd는 더 이상 젠투에서 작동하지 않습니다. (몇 달 전에 같은 것을 설정했으며, initrd를 사용하기 전에 스크립트를 다시 작성해야했습니다.) 자신 만의 initramfs를 만드는 것은 재미있을 수 있으며, 최소한의 부팅 만하는 유일한 방법입니다. 프로세스 (그리고 프로세스에서 Linux가 부팅되는 방법에 대한 정보를 배우십시오), 그러나 많은 작업이 필요합니다.

짧은 대답 : Dracut을 사용하십시오. 대부분의 자동화 된 방식으로 initramfs를 생성하기 위해 만들어지고있는 새로운 프레임 워크입니다. 문서는 조금 드문 편이지만, 그것을 알아낼 수있는 충분한 양이 있으며, 견고한 initramfs와 LVM 루트를 얻는 가장 쉬운 방법입니다.


2

어떤 종류의 initrd를 사용할 수 없지만 별도의 initrd 파일을 사용하지 않는 것이 가능합니다. (저는 genkernel을 사용한 적이 없으므로 지시를 줄 수 없습니다).

예를 들어 옵션을 설정했습니다.

CONFIG_INITRAMFS_SOURCE="/usr/src/initrd.contents"

어디 /usr/src/initrd.contents처럼 내 경우 외모 (I이 LVM + tuxonice + fbsplash)에서 :

dir /bin                                    0755 0 0
file    /bin/busybox                        /bin/busybox                        0755 0 0
file    /bin/lvm                        /sbin/lvm.static                    0755 0 0
dir /dev                                    0755 0 0
dir /dev/fb                                 0755 0 0
dir /dev/misc                               0755 0 0
dir /dev/vc                                 0755 0 0
nod /dev/console                                0600 0 0    c  5   1
nod /dev/null                               0600 0 0    c  1   3
nod /dev/snapshot                               0600 0 0    c 10 231
nod /dev/tty1                               0600 0 0    c  4   0
dir /etc                                    0755 0 0
dir /etc/splash                             0755 0 0
dir /etc/splash/natural_gentoo                      0755 0 0
dir /etc/splash/natural_gentoo/images                   0755 0 0
file    /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  0644 0 0
file    /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg 0644 0 0
file    /etc/splash/natural_gentoo/1680x1050.cfg        /etc/splash/natural_gentoo/1680x1050.cfg        0644 0 0
slink   /etc/splash/tuxonice                    /etc/splash/natural_gentoo              0755 0 0
file    /etc/splash/luxisri.ttf                 /etc/splash/luxisri.ttf                 0644 0 0
dir /lib64                                  0755 0 0
dir /lib64/splash                               0755 0 0
dir /lib64/splash/proc                          0755 0 0
dir /lib64/splash/sys                           0755 0 0
dir /proc                                   0755 0 0
dir /mnt                                    0755 0 0
dir /root                                   0770 0 0
dir /sbin                                   0755 0 0
file    /sbin/fbcondecor_helper                 /sbin/fbcondecor_helper                 0755 0 0
slink   /sbin/splash_helper                 /sbin/fbcondecor_helper                 0755 0 0
file    /sbin/tuxoniceui_fbsplash               /sbin/tuxoniceui_fbsplash               0755 0 0
file    /sbin/tuxoniceui_text                   /sbin/tuxoniceui_text                   0755 0 0
dir /sys                                    0755 0 0
file    /init                           /usr/src/init

그리고 /usr/src/init:

#!/bin/busybox ash
local X ROOT RUNLEVEL INIT PARAM
# Preliminary stuff
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
/bin/lvm vgchange -ay picard-main

# Try to resume. This never returns if it succeeds
test -e /sys/power/tuxonice/do_resume && echo 1 > /sys/power/tuxonice/do_resume
#/bin/resume

# Parse the command line for relevant options.
INIT=/sbin/init
RESCUE=""
PARAM=" "
for X in `cat /proc/cmdline`
do
        case "$X" in
                root=*) ROOT=${X#root=} ;;
                [0-6Ss]) RUNLEVEL=${X} ;;
                init=*) INIT=${X#init=} ;;
                rescue) RESCUE="rescue" ;;
        splash=*) PARAM="${PARAM} ${X}" ;;
        consol=*) PARAM="${PARAM} ${X}" ;;
        esac
done

if [ x${RESCUE} = xrescue ]
then
        busybox ash
fi

# Mount and switch root.
mount -o ro ${ROOT} /mnt
umount -f /sys || umount -l /sys
umount -f /proc || umount -l /proc

exec switch_root /mnt ${INIT} ${RUNLEVEL} ${PARAM}

1

그렇습니다.

initrd를 생성하고 처리 할 때 발생하는 복잡한 문제는 grub2를 설치하고 사용하면 혼란스러워집니다. grub2 위키 http://grub.enbug.org/LVMandRAID 는 grub 구성 파일 인 grub.cfg에 insmod lvm을 사용하여 lvm에서 / boot를 수행하는 방법을 설명하므로 initrd가 필요 없습니다.

grub2는 현재 버전 1.98이지만 gentoo의 실험 브랜치에 있습니다. 그러나 다른 슬롯에 설치할 수 있으며 완벽하게 사용할 수 있습니다.

즐겨!


이봐, 그거 정말 멋져 보여, 시험 해봐야 해!
phunehehe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.