web-dev-qa-db-ja.com

initrdを使用せずにLVMにrootを置くことは可能ですか?

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を使用せずに、マシンの起動が少し速くなるようにします(とにかく柔軟性は必要ありません)。

12
phunehehe

簡単な答え:いいえ。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を自分で構築できます。

6
tante

編集:LVMで起動しようとしていることに気づきました。LVMをセットアップしたことがないので、LVMを必要としなかったため、おそらくここでのアプローチが機能しない可能性があります

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

  1. カーネルを再コンパイルし、カーネルに組み込まれていることを確認してください(重要:モジュールではありません!):

    1. マザーボードドライバーとハードドライブドライバー(どちらもDevice Driversの下)
    2. //etc/*/lib/modules/*File systemsの下)用のファイルシステムドライバー

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

  2. カーネルからinitrdを無効にします "一般的なセットアップ>初期RAMファイルシステムとRAMディスク(initramfs/initrd)サポート".

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

それで全部だと思います。何かが発生した場合に備えて、バックアップカーネルと、起動可能なLive CDの適切なコピーを保管することを忘れないでください。

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

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

5
Lie Ryan

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

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

このサイクルを打破するために、initrdまたはinitramfsは、カーネルと共に(/ bootまたはカーネル自体の内部に)保存される圧縮ファイルシステムであり、LVMやMDなどのサービスを開始するのに十分なLinuxシステムが含まれていますあなたが欲しい。これは一時的なファイルシステムであり、実際のルートをロードするのに十分な長さのルートファイルシステムとしてのみ機能します。

実際に作成する限り、このトピックに関するほとんどのドキュメントは驚異的なほど古くなっています。たとえば、lvm2create_initrdは、Gentooでは動作しません。 (私は数か月前に同じものをセットアップしましたが、スクリプトを実行する前にスクリプトを書き直す必要がありました。)独自のinitramfsを作成するのは楽しいかもしれません。これは、完全に最小限のブートを取得する唯一の方法ですプロセス(およびLinuxがプロセスで起動する方法についての詳細を学びます)が、それは多くの作業です。

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

2
p-static

ある種の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}
2

はい、そうです。

Grub2をインストールして使用する場合、initrdsの作成と処理から生じる複雑さは問題になります。 grub2 wiki http://grub.enbug.org/LVMandRAID は、grub.cfgのinsmod lvmだけを使用して、lvmで/ bootを作成する方法を説明しています。 initrdが必要です。

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

楽しい!

1
chiguire