Gentooベースシステムをセットアップしたところです(つまり、起動してログインし、今すぐシステムを操作できます)。私のルートパーティションはLVM2仮想グループにあります(区切られた/boot
パーティション)。起動するには、以下のパラメーターをカーネルに渡す必要があります。
root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm
どうやら、それはルートをマウントする前に何かをするために初期のramdiskを使用していると思います(LVMのものをロードしていると思います)。このコードをカーネル自体に配置して、initrdが不要になる方法はありますか?そうでない場合、どうすればinitrdを自分で作成できますか?
Initrdを使用せずに、LVM以外のルート用にカーネルをコンパイルしてみたところ、完全に機能したことを付け加えると便利です。それから私はすべてをLVMの下に置いてみましたが、マシンを起動できませんでした(LVMのものを処理できないと思います)。次に、genkernel
ツールと--lvm
オプションを指定すると、現在使用している作業用カーネルとinitrdが作成されます。
ここで、genkernel
をスキップしてすべてを自分で実行したいと思います。できればinitrdを使用せずに、マシンの起動が少し速くなるようにします(とにかく柔軟性は必要ありません)。
簡単な答え:いいえ。LVMが必要な場合は、initrdが必要です。
しかし、他の人が以前に言ったように:LVMはシステムを遅くしたり、別の方法で何か悪いことをしたりせず、カーネルがロードしてその機能を実行できる環境を作成できるようにします。
Initrdを使用すると、カーネルをロードできます。カーネルがLVMドライブ上にある場合、カーネルを含むバイナリをロードする前に、LVM環境全体を確立する必要があります。
Wikipediaのinitrdのエントリ を確認してください。initrdの機能と必要な理由が説明されています。
別のメモ:自分でやりたいというのはあなたの考えですが、genkernelを使用しても手を汚す可能性があります。 genkernel --menuconfig allを使用すると、基本的にすべてをツールサポートなしで完全にカーネルを構築するかのように設定できます。genkernelはmake bzImage、make modules、make modules_install行を追加するだけで、厄介なinitrdのことを行います。
ここではinitramfs または ここではinitrd のように、明らかにinitrdを自分で構築できます。
編集:LVMで起動しようとしていることに気づきました。LVMをセットアップしたことがないので、LVMを必要としなかったため、おそらくここでのアプローチが機能しない可能性があります
以下は、initrdのないカーネルを作成するために必要な基本的なルールです(メモリから、正確には覚えていません)。
カーネルを再コンパイルし、カーネルに組み込まれていることを確認してください(重要:モジュールではありません!):
Device Drivers
の下)/
、/etc/*
、/lib/modules/*
(File systems
の下)用のファイルシステムドライバー基本的に、カーネルはルートファイルシステムをマウントし、/ etc/fstabを読み取り、他のドライバーモジュールをロードし(必要な場合)、他の非ルートファイルシステムをマウントして残りのブートプロセスを完了する必要があります。より複雑な起動プロセスがある場合、例えば次に、ネットワークブートを行うには、それらのドライバーも組み込む必要があります。
カーネルからinitrdを無効にします "一般的なセットアップ>初期RAMファイルシステムとRAMディスク(initramfs/initrd)サポート".
GRUB configを変更すると、init =とrealroot =が不要になり、root =をセットアップして、ルートファイルシステムデバイスを指すようにします。
それで全部だと思います。何かが発生した場合に備えて、バックアップカーネルと、起動可能なLive CDの適切なコピーを保管することを忘れないでください。
うまくいかない可能性があること:間違ったドライバーでコンパイルした場合、または基本的なドライバーをモジュールとしてコンパイルした場合、カーネルはファイルシステムを読み取ることができません。新しいカーネルまたはLive CDで再起動し、正しいドライバーでカーネルを再コンパイルします。
唯一の難しい部分は、どのドライバーがハードウェアに関連しているかを理解することです。 lspci
およびlshw
を使用して、ハードウェアを識別できます。これらのツールをまだお持ちでない場合は、emerge lshw pciutils
。
はい、initrdが必要です。理由は次のとおりです。
通常のブートプロセスは、ブートローダーから始まります。ブートローダーは、カーネルを見つけて実行するのに十分なシステムを認識しています。 (GRUB2はLVM2またはRAIDパーティションにあるカーネルを見つけるのに十分スマートですが、GRUB1はそうではないので、通常、/ bootを単純化されたレイアウトの個別のパーティションとして作成することをお勧めします。)いったんロードされると、カーネルはルートファイルシステムを見つけられるようにして、ブートプロセスを開始できるようにします。ただし、LVMは、ルートファイルシステムに存在するユーザー空間ツールによってトリガーされなければ起動できません。これは、ルートファイルシステムに存在するLVMツールなしではロードできません...;)
このサイクルを打破するために、initrdまたはinitramfsは、カーネルと共に(/ bootまたはカーネル自体の内部に)保存される圧縮ファイルシステムであり、LVMやMDなどのサービスを開始するのに十分なLinuxシステムが含まれていますあなたが欲しい。これは一時的なファイルシステムであり、実際のルートをロードするのに十分な長さのルートファイルシステムとしてのみ機能します。
実際に作成する限り、このトピックに関するほとんどのドキュメントは驚異的なほど古くなっています。たとえば、lvm2create_initrdは、Gentooでは動作しません。 (私は数か月前に同じものをセットアップしましたが、スクリプトを実行する前にスクリプトを書き直す必要がありました。)独自のinitramfsを作成するのは楽しいかもしれません。これは、完全に最小限のブートを取得する唯一の方法ですプロセス(およびLinuxがプロセスで起動する方法についての詳細を学びます)が、それは多くの作業です。
短い答え:Dracutを使用します。これは、ほとんど自動化された方法でinitramfsを生成するために作成されている新しいフレームワークであり、移植されています。ドキュメンテーションは少し疎ですが、物事を理解するのに十分な量がそこにあります、そしてそれは確実なinitramfsとLVMルートを取得するのに断然最も簡単な方法です。
ある種の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}
はい、そうです。
Grub2をインストールして使用する場合、initrdsの作成と処理から生じる複雑さは問題になります。 grub2 wiki http://grub.enbug.org/LVMandRAID は、grub.cfgのinsmod lvmだけを使用して、lvmで/ bootを作成する方法を説明しています。 initrdが必要です。
grub2はバージョン1.98になりましたが、gentooの実験ブランチにまだあります。ただし、別のスロットに取り付けることができ、完全に使用できます。
楽しい!