initrdを使用せずにLVMにルートを配置することは可能ですか?


12

Gentooベースシステムをセットアップしたところです(つまり、ブートしてログインし、それで何かをできるようになりました)。私のルートパーティションはLVM2仮想グループにあります(/bootパーティションが分離されています)。起動するには、以下のパラメーターをカーネルに渡す必要があります。

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

どうやら、rootをマウントする前に、最初のramdiskを使用して何かを実行しているようです(LVMを読み込んでいると思います)。initrdが必要ないように、このコードをカーネル自体に配置する方法はありますか?そうでない場合、どのようにinitrdを自分で作成できますか?

initrdを使用せずに、LVM以外のルート用にカーネルをコンパイルしてみて、完全に機能したことを付け加えると便利かもしれません。それから私はすべてをLVMの下に置こうとしましたが、マシンをブートすることができませんでした(LVMを処理できないと思います)。次に、このgenkernelツールと--lvmオプションを使用し、現在使用している動作中のカーネルとinitrdを作成します。

ここでgenkernel、できればinitrdを使用せずにすべてをスキップして自分で実行したいので、マシンの起動が多少速くなります(柔軟性は必要ありません)。


initrdはブート時間にわずかな影響を与える可能性がありますが、システムが起動して実行されると、システムのパフォーマンスには影響しません。
クリストフプロボスト

そうそう、私は実際に編集されたブート時間を意味した
-phunehehe

回答:


6

簡単な答え:いいえ。LVMが必要な場合は、initrdが必要です。

しかし、他の人が以前に言ったように:LVMはシステムを遅くしたり、別の方法で悪いことをしたりせず、カーネルがロードしてその仕事を行える環境を作成することができます。

initrdを使用すると、カーネルをロードできます。カーネルがLVMドライブ上にある場合、カーネルを含むバイナリをロードする前に、LVM環境全体を確立する必要があります。

initrdの機能と、それがなぜ必要なのかを説明するinitrdWikipediaエントリをご覧ください。

別のメモ:自分で物事をやりたいというあなたのポイントがわかりますが、genkernelでも手を汚すことができます。genkernel --menuconfig allを使用すると、ツールサポートなしでカーネルを完全にビルドするかのように基本的にすべてを設定できます。

ここでinitramfsについてまたはinitrdについて概説されているように、明らかに自分でinitrdをビルドできます。


確認に感謝しますが、「そうでなければ、どうやってinitrdを自分で作ることができますか?」という部分を見逃しています。
プネヘヘ

いくつかの情報を追加し、他の回答をこの情報に統合しました。
10

8
軽微な修正:initrdはカーネルのロードには使用されません。カーネルはブートローダー(GRUB、LILOなど)によってロードされます。initrdは、初期ルートファイルシステムを提供するRAMディスクの一種です。システムを実際に動作させるために必要なすべてのバイナリ(カーネルモジュール、ユーザー空間サポートプログラムなど)が含まれている必要があります。これが、LVMルートに必要な理由です。LVMサブシステムを初期化する必要があり、その初期化は複雑すぎて、カーネルブートパラメータだけでは便利に行えません。したがって、linuxrcinitrd のスクリプトはこのタスクを実行します。
リッカルドムリ

あなたはもちろん正しいです、私は私の言い回しにややずさんでした。
タント

2
答えにかなり大きな間違いがあるため、投票できません(initrdではカーネルをロードできません)。
wzzrd

5

編集:あなたがLVMで起動しようとしていることに気付いた、私はLVMをセットアップしたことも、それらを必要としたこともないので、おそらくここでのアプローチはうまくいかないかもしれない

initrdのないカーネルを作成するために行う必要がある基本的なルールを以下に示します(メモリから、私は正確に覚えていませんでした):

  1. カーネルを再コンパイルし、カーネルに組み込みます(重要:モジュールとしてではありません!):

    1. マザーボードドライバとハードドライブドライバ(両方ともDevice Drivers
    2. ファイルシステムドライバ//etc/*および/lib/modules/*(下File systems

    基本的に、カーネルは残りの起動プロセスを完了するために、ルートファイルシステムをマウントし、/ etc / fstabを読み取り、他のドライバーモジュールをロードし(必要な場合)、他の非ルートファイルシステムをマウントできる必要があります。ネットワークブートなど、より複雑なブートプロセスがある場合は、それらのドライバーも組み込む必要があります。

  2. CONFIG_BLK_DEV_INITRD = nとして知られるカーネルの「一般設定>初期RAMファイルシステムとRAMディスク(initramfs / initrd)support」からinitrdを無効にします。

  3. GRUB構成を変更します。init=およびrealroot =は不要になり、root =をセットアップして、ルートファイルシステムデバイスを指すようにします。

それがすべてだと思います。何かが起こった場合に備えて、バックアップカーネルと起動可能なLive CDの良いコピーを忘れずに保管してください。

間違っている可能性があること:間違ったドライバーでコンパイルした場合、または基本ドライバーをモジュールとしてコンパイルした場合、カーネルはファイルシステムを読み取ることができません。新しいカーネルまたはLive CDで再起動し、正しいドライバーでカーネルを再コンパイルします。

唯一の難しい部分は、どのドライバーがハードウェアに関連しているかを把握することです。lspciおよびlshwを使用して、ハードウェアを識別できます。これらのツールがまだない場合は、emerge lshw pciutils


カーネルコンパイルで組み込みモジュールと言及する場合は+1。
amphetamachine

lsmod実行中のカーネルからも有用です。
ローレンス

2

はい、initrdが必要です。その理由は次のとおりです。

通常のブートプロセスは、ブートローダーから開始されます。ブートローダーは、カーネルを見つけて実行するためにシステムについて十分に認識しています。(GRUB2はLVM2またはRAIDパーティションにあるカーネルを見つけるのに十分スマートですが、GRUB1はそうではないので、通常は/ bootを単純化されたレイアウトの別のパーティションとして作成することをお勧めします。)ルートファイルシステムを見つけられるようにして、ブートプロセスを開始できるようにします。ただし、LVMは、ルートファイルシステムに存在する一部のユーザースペースツールによってトリガーされない限り起動できません。これは、ルートファイルシステムに存在するLVMツールなしではロードできません。

このサイクルを断ち切るために、initrdまたはinitramfsは、カーネルとともに(/ boot、またはカーネル自体のいずれかに)格納される圧縮ファイルシステムであり、LVMやMDなどのサービスを開始するのに十分なLinuxシステムが含まれます。あなたが欲しい。これは一時ファイルシステムであり、実際のルートがロードされるのに十分な時間だけルートファイルシステムとして機能します。

実際に作成する限り、このトピックに関するほとんどのドキュメントは驚くほど時代遅れです。たとえば、lvm2create_initrdはGentooでも動作しません。(私は数か月前に同じことを設定しましたが、実際にinitrdを取得する前にスクリプトを書き換えるしかありませんでした。)独自のinitramfsを作成するのは楽しいことがあります。プロセス(およびプロセスでのLinuxの起動方法に関する詳細を学ぶ)が、それは多くの作業です。

短い答え:Dracutを使用します。これは、ほとんど自動化された方法でinitramfsを生成するために作成されている新しいフレームワークであり、Portageにあります。ドキュメントは少しまばらですが、物事を理解するのに十分なものがあり、しっかりしたinitramfsとLVMルートを取得する最も簡単な方法です。


2

ある種のinitrdを使用しないことはできませんが、別個のinitrdファイルを使用しないことは可能です。(genkernelを使用したことがないため、指示を出すことはできません)。

たとえば、オプションを設定しました:

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

どこで/usr/src/initrd.contents(私が持っている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

はい、そうです。

grub2をインストールして使用すると、initrdの作成と処理から生じる複雑な問題が生じます。grub2 wiki http://grub.enbug.org/LVMandRAIDでは、grub構成ファイルであるgrub.cfgのinsmod lvmのみでlvmで/ bootを使用する方法について説明しているため、initrdは不要です。

grub2は現在バージョン1.98ですが、gentooの実験ブランチにあります。ただし、別のスロットに取り付けることができ、完全に使用できます。

楽しい!


ちょっとそれは実際に素晴らしく見える、私は試してみなければならない!
プネヘヘ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.