web-dev-qa-db-ja.com

vmlinuzとinitrd.gzが与えられた場合、カーネルがどこから/(ルート)ファイルシステムをロードするのかをどのように見つけることができますか?

Linuxのインストールのさまざまな方法(iso、フラッシュ、フラッシュのiso、フラッシュのカーネル、ルートFS ...)から)を試していますが、何が起こっているのかを理解したいと思います。オン。

私の質問は、ディストリビューション(vmlinuzとinitrd)からビルドされたカーネルファイルとramfsファイルが与えられた場合、「/」ファイルシステムをどこで探すかを見つけることは可能ですか?カーネルを再コンパイルせずにこれを構成することは可能ですか?

そしてもう1つ:カーネルが.iso-filesystemから作成されたループバックデバイスからルートファイルシステムをロードする場合、このプロセスをどのように構成できますか?ありがとう!

EDIT:実際、GRUB構成にはGRUB root、つまり- 実際のカーネルルートファイルシステムではありません 場所ですが、GRUBの所有物を含むフォルダです。

実際のルートは、説明されているようにinitinitrdスクリプトで構成されます ここ

これが、Debianカーネルがハードドライブから起動するときにハードドライブ上のISOファイルを見つける方法です-initramfsはそれを見つけます: http://www.debian.org/releases/stable/i386/apas02.html.en#howto-getting -images-hard-disk ; GRUB構成 ISOの場所への参照は含まれていません

3
Boris Burkov

これは、起動時にbootloader、たとえば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/grubGRUB_CMDLINE_LINUX="root=/dev/mydevice"を自分で設定し、update-grubを実行してGrubを更新します。

ただし、マルチブートを構成することをお勧めします。そうしないと、Grub構成を簡単に変更または更新することができません。

6
gertvdijk

ブートイメージが与えられると、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
daisy

これがまだ興味深いものであるかどうかはわかりませんが、私のような将来のグーグルのために:

Grubから起動/インストールする場合、2つの別々のrootディレクトリが機能します。 grub rootlinux rootがあります(私はそうではありませんこれが専門用語であるかどうかを確認してください)。


grub rootは、_grub.cfg_内で設定でき、grub内ですぐに表示できるファイルを決定します。デフォルトのgrubルートは、ドライブ起動grubのルートディレクトリである必要があるため、起動可能なドライブの内容が次の場合。

_/boot/
/boot/grub2/
/boot/grub2/grub.cfg
...
_

次に、grub rootからのgrub.cfgの場所は_/boot/grub2/grub.cfg_です。

Grubルートは、_set root=_を使用してgrub.cfgで変更できます。

これを使用して、ルートを現在のルート内のディレクトリに設定できます(_set root=/boot/_により、_grub.cfg_は_/grub2/grub.cfg_に配置されます)。これは、chrootと同様に動作します。 Linuxでは。

現在のルートを別のドライブに変更することもできます(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ルートは無関係です


Linux rootは、ロード時にカーネル(vmlinuz)に渡すことができるパラメーターです。このために、カーネルにパラメータ_root=_を渡すことができます(この値は/ proc/cmdlineに表示されます)

ただし、この新しいルートにはLinuxルートファイルシステムが含まれていることが期待されていることに注意することが重要です(/ etc// var /などを探します)。インストール時に、これらの要素を含むinitrd(INITial Ram Disk)を提供するため、インストール中にLinuxルートを変更する必要はおそらくありません。

Linuxルートを変更する場合は、LinuxインストールメディアがLinuxルートファイルシステムではないことに注意してください。ただし、そこに含まれるinitrd.imgはLinuxルートファイルシステムです。


ISO内のファイルをカーネルへの引数として使用しようとしている場合は、解決策があります。 grubでループバックデバイスを作成すると、カーネルの起動時にデバイスが存続します(したがって、Linuxルートに_/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#Introduction )にあります。

およびカーネルパラメーターarchwikiページ( https://wiki.archlinux.org/index.php/kernel_parameters#GRUB

関連するディストリビューションのブートオプション(RHEL https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/chap-anaconda-boot-options.html#list -boot-options-sources

1
Centimane

ほとんどのインストールでは、ルートデバイスをブートローダーに指定します。ルートデバイスは、rootというパラメータとしてカーネルに渡されます。ブートローダーによっては、これはカーネルコマンドライン引数(_ro quiet root=/dev/sda1_のように見える場合があります)の一部または別の設定である場合があります。いくつかの一般的なブートローダーの場合:

  • Lilo:構成ファイル(_/etc/lilo.conf_)には、Linuxルートデバイスを示すrootディレクティブがあります。
  • Grubレガシー(バージョン0.9x):構成ファイル(通常は_/boot/grub/menu.lst_)で、ルートデバイスはカーネルコマンドライン(kernelディレクティブ)の一部として渡されます。 Grub自体には異なるrootディレクティブがあることに注意してください。これは、カーネルなどのファイルを探す場所をGrubに指示します。多くのシステムでは、Grub構成ファイルは、インストールされたシステムからルートデバイスに入力する_update-grub_スクリプトによって生成されます(_/boot/grub/device.map_を使用)。
  • Grub 2(バージョン1.9x):構成ファイル(通常は_/boot/grub/grub.cfg_)で、ルートデバイスがカーネルコマンドライン(linuxディレクティブ)の一部として渡されます。カーネルなどのファイルを探す場所をGrubに指示する別のroot変数(set root=(hd0,1))があることに注意してください。多くのシステムでは、Grub構成ファイルは、インストールされたシステムからルートデバイスに入力する_update-grub_スクリプトによって生成されます(_/boot/grub/device.map_を使用)。
  • U-Boot:ルートデバイスは、bootargs環境変数のコマンドライン引数の一部として渡されます。 U-Bootバイナリには、コンパイル時にベイクインされたデフォルト値が含まれています。これは、フラッシュメモリの設定によって上書きできます(デバイスで許可されている場合)。

rootコマンドライン引数がない場合、initrdまたはinitramfsが使用されている場合、マウントするルートパーティションを見つけようとすることがあります。 root引数が存在する場合でも、initrdまたはinitramfsは別のデバイスを使用することを決定する場合があります。コードは _switch_root_ を呼び出して、initrdから実際のルートに切り替えます。

rootコマンドライン引数がない場合のデフォルトのルートデバイスは、コンパイル時に決定されます。 rdev ユーティリティを使用して、バイナリイメージでその値を変更できます。

起動されたカーネルでは、_/proc/cmdline_でカーネルに渡されたrootパラメーター(存在する場合)を確認できます。 _/_の_/proc/mounts_にマウントされている実際のデバイスを確認できます。