Linuxのインストールのさまざまな方法(iso、フラッシュ、フラッシュのiso、フラッシュのカーネル、ルートFS ...)から)を試していますが、何が起こっているのかを理解したいと思います。オン。
私の質問は、ディストリビューション(vmlinuzとinitrd)からビルドされたカーネルファイルとramfsファイルが与えられた場合、「/」ファイルシステムをどこで探すかを見つけることは可能ですか?カーネルを再コンパイルせずにこれを構成することは可能ですか?
そしてもう1つ:カーネルが.iso-filesystemから作成されたループバックデバイスからルートファイルシステムをロードする場合、このプロセスをどのように構成できますか?ありがとう!
EDIT:実際、GRUB構成にはGRUB root、つまり- 実際のカーネルルートファイルシステムではありません 場所ですが、GRUBの所有物を含むフォルダです。
実際のルートは、説明されているようにinit
のinitrd
スクリプトで構成されます ここ 。
これが、Debianカーネルがハードドライブから起動するときにハードドライブ上のISOファイルを見つける方法です-initramfsはそれを見つけます: http://www.debian.org/releases/stable/i386/apas02.html.en#howto-getting -images-hard-disk ; GRUB構成 ISOの場所への参照は含まれていません 。
これは、起動時に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/grub
でGRUB_CMDLINE_LINUX="root=/dev/mydevice"
を自分で設定し、update-grub
を実行してGrubを更新します。
ただし、マルチブートを構成することをお勧めします。そうしないと、Grub構成を簡単に変更または更新することができません。
ブートイメージが与えられると、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
これがまだ興味深いものであるかどうかはわかりませんが、私のような将来のグーグルのために:
Grubから起動/インストールする場合、2つの別々のroot
ディレクトリが機能します。 grub rootとlinux 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 )
ほとんどのインストールでは、ルートデバイスをブートローダーに指定します。ルートデバイスは、root
というパラメータとしてカーネルに渡されます。ブートローダーによっては、これはカーネルコマンドライン引数(_ro quiet root=/dev/sda1
_のように見える場合があります)の一部または別の設定である場合があります。いくつかの一般的なブートローダーの場合:
/etc/lilo.conf
_)には、Linuxルートデバイスを示すroot
ディレクティブがあります。/boot/grub/menu.lst
_)で、ルートデバイスはカーネルコマンドライン(kernel
ディレクティブ)の一部として渡されます。 Grub自体には異なるroot
ディレクティブがあることに注意してください。これは、カーネルなどのファイルを探す場所をGrubに指示します。多くのシステムでは、Grub構成ファイルは、インストールされたシステムからルートデバイスに入力する_update-grub
_スクリプトによって生成されます(_/boot/grub/device.map
_を使用)。/boot/grub/grub.cfg
_)で、ルートデバイスがカーネルコマンドライン(linux
ディレクティブ)の一部として渡されます。カーネルなどのファイルを探す場所をGrubに指示する別のroot
変数(set root=(hd0,1)
)があることに注意してください。多くのシステムでは、Grub構成ファイルは、インストールされたシステムからルートデバイスに入力する_update-grub
_スクリプトによって生成されます(_/boot/grub/device.map
_を使用)。bootargs
環境変数のコマンドライン引数の一部として渡されます。 U-Bootバイナリには、コンパイル時にベイクインされたデフォルト値が含まれています。これは、フラッシュメモリの設定によって上書きできます(デバイスで許可されている場合)。root
コマンドライン引数がない場合、initrdまたはinitramfsが使用されている場合、マウントするルートパーティションを見つけようとすることがあります。 root
引数が存在する場合でも、initrdまたはinitramfsは別のデバイスを使用することを決定する場合があります。コードは _switch_root
_ を呼び出して、initrdから実際のルートに切り替えます。
root
コマンドライン引数がない場合のデフォルトのルートデバイスは、コンパイル時に決定されます。 rdev
ユーティリティを使用して、バイナリイメージでその値を変更できます。
起動されたカーネルでは、_/proc/cmdline
_でカーネルに渡されたroot
パラメーター(存在する場合)を確認できます。 _/
_の_/proc/mounts
_にマウントされている実際のデバイスを確認できます。