vmlinuzとinitrd.gzが与えられたら、カーネルが/(ルート)ファイルシステムをロードする場所をどうやって知ることができますか?

vmlinuzとinitrd.gzが与えられたら、カーネルが/(ルート)ファイルシステムをロードする場所をどうやって知ることができますか?

私はさまざまなLinuxインストール(iso、Flash、Flashのiso、Flashのカーネル、FlashのisoファイルのルートFS...)を試しており、何が起こっているのか理解したいと思います。

私の質問は:ディストリビューション(vmlinuzとinitrd)で構築されたカーネルとramfsファイルが与えられたら、「/」ファイルシステムを見つける場所を見つけることができますか?カーネルを再コンパイルせずにそれを設定できますか?

もう1つ:カーネルが.isoファイルシステムによって生成されたループバックデバイスからルートファイルシステムをロードするときにこのプロセスをどのように設定しますか?ありがとうございます!

編集する: 実際、GRUB 構成には GRUB ルートが含まれています。実際のカーネルルートファイルシステムではありません。場所はGRUBコンテンツを含むフォルダです。

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

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

答え1

起動時に提供されます。ブートローダー、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/grubいくつかの点を直接設定し、次の手順をGRUB_CMDLINE_LINUX="root=/dev/mydevice"実行してGrubを更新しますupdate-grub

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

答え2

ブートイメージが提供されたら、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

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

  • Lilo:設定ファイル()には、Linuxルートデバイスを表すディレクティブが/etc/lilo.confあります。root
  • Grub Legacy(バージョン0.9x):ルートデバイスは通常、設定ファイルからカーネルコマンドライン(ガイドライン)の一部として渡されます/boot/grub/menu.lst。 Grub自体にはkernel異なるディレクティブがあります。rootこれにより、Grub にカーネルなどのファイルを探す場所を伝えます。多くのシステムでは、Grub設定ファイルは、インストールされているupdate-grubシステムのルートデバイス(使用)を埋めるスクリプトによって生成されます/boot/grub/device.map
  • Grub 2(バージョン1.9x):ルートデバイスは(通常は)設定ファイルからカーネルコマンドライン(ガイドライン)の一部として渡されます/boot/grub/grub.cfg。 Grubにファイル(カーネルなど)を見つける場所を知らせる別の変数()があるlinuxことに注意してください。多くのシステムでは、Grub設定ファイルは、インストールされているシステムでルートデバイス(使用)を埋めるスクリプトによって生成されます。rootset root=(hd0,1)update-grub/boot/grub/device.map
  • U-Boot:ルートデバイスは、コマンドライン引数の一部としてbootargs環境変数に渡されます。 U-Bootバイナリには、コンパイル時に組み込まれたデフォルト値が含まれています。これはフラッシュメモリの設定で上書きできます(デバイスで許可されている場合)。

コマンドライン引数がない場合、rootinitrdまたはinitramfs(使用されている場合)はマウントするルートパーティションを見つけようとします。rootパラメーターが存在しても、initrdまたはinitramfsは他の装置を使用することを決定できます。コードコールswitch_rootinitrdから実際のルートディレクトリに切り替えます。

コマンドライン引数を持たないデフォルトのルートデバイスは、rootコンパイル時に決定されます。以下を使用して、バイナリイメージでこの値を変更できます。rdev便利です。

開始カーネルからrootカーネルに渡された引数(存在する場合)を表示できます/proc/cmdline/実際に取り付けられているデバイスを で見ることができます/proc/mounts

答え4

これがまだ興味深いかどうかはわかりませんが、私のような将来のGoogleユーザーのための内容は次のとおりです。

rootgrubから起動/インストールするときは、2つの別々のディレクトリが使用されます。一部はグラップルートそしてLinuxのルートディレクトリ(技術的な用語なのかはよくわかりません。)


これグラップルートgrub.cfggrubに表示されるファイルを設定して決定できます。デフォルトの grub ルートは、grub が起動するドライブのルートでなければなりません。したがって、起動可能なドライブの内容は次のとおりです。

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

その後、grub.cfgの位置グラップルートはい/boot/grub2/grub.cfg

grub.cfgを使用してgrubルートディレクトリを変更できますset root=

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

現在のルートディレクトリを別のドライブに変更することもできます(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のルートディレクトリ、カーネル(vmlinuz)のロード時に渡すことができるパラメータ。これを行うには、パラメータをカーネルに渡しますroot=(値は/ proc / cmdlineに表示されます)。

ただし、この新しいルートディレクトリには、Linuxルートファイルシステム(/ etc / / var /などを探してください)が含まれると予想されることに注目する価値があります。インストール時にこれらの要素を含むinitrd(INITial Ram Disk)を提供するため、インストール中にLinuxのルートディレクトリを変更したり変更したりする必要がない場合があります。

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


ISOのファイルをカーネルの引数として使用したい場合は、解決策があります。 grubからループバックデバイスを作成すると、デバイスはカーネル起動時にも保持されます/dev/loop0Linuxのルートディレクトリインストール中)

特に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#紹介)

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

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

関連情報