質問

質問

ディスクレス設定を試しています。ノード/ワークステーション/システム、ユーザーガイドに記載されているガイドラインディスクレスシステム~のためアーキテクチャLinux(4.13.12-1-ARCH).

質問

クライアントがTFTPに正常に接続されました(FTPプロトコル)、すべてのファイルを転送し、GRUB選択メニューを表示します(関連する抜粋grub.cfg):

load_video
set gfxpayload=keep
insmod gzip
insmod ext3
insmod net
insmod tftp
insmod efinet

set root=(tftp,192.168.0.101)
set prefix=(tftp,192.168.0.101)/netboot/grub

linux /netboot/vmlinuz-linux add_efi_memmap root=/dev/nfs rootfstype=nfs nfsroot=192.168.0.101:/srv/[CLIENT OS] nfsrootdebug rw ip=dhcp
initrd /netboot/initramfs-linux.img

前に試してみましたiphttps://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt)

 ip=:::::efinet0:dhcp
 ip=:::::eno1s0:dhcp
 ip=:::::eth0:dhcp
 ip=[CLIENT IP]:[SERVER IP]:[GATEWAY IP]:[NETMASK]:[HOSTNAME]:[DEVICE]:dhcp

linuxinitrd両方が読み込まれた場合、続行すると、次の結果が発生します。

[FAILED] "Failed to start Switch Root."
See 'systemctl status initrd-switch-root.service' for details.
You are in emergency mode. After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reobot, "systemctl default or ^D to enter into default mode.
Press Enter for maintenance
(or press Control-D to continue):

トラブルシューティング

add_efi_mmapの削除

代わりにFailed to start Switch Root.カーネルがパニック状態になります。

[    1.114386] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,255)
[    1.114458] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 4.13.12-1-ARCH #1 
[    1.114509] Hardware name: ASUSTeK COMPUTER INC. UX51V2A/UX51VZA, BIOS UX51VZA.204 12/03/2012
[    1.114573] Call Trace:
[    1.114604]  dump_stack+0x63/0x8b
[    1.114637]  panic+0xe4/0x23d
[    1.114667]  mount_block_root+0x1f4/0x2ab
[    1.114703]  ? set_debug_rodata+0x17/0x17
[    1.114737]  mount_root+0x6a/0x6d
[    1.114767]  prepare_namespace+0x134/0x16c
[    1.114802]  kernel_init_freeable+0x1ec/0x205
[    1.114840]  ? rest_init+0xe0/0xe0
[    1.114872]  kernel_init+0xc/0xfc
[    1.114904]  ret_from_fork+0x25/0x30
[    1.114957] Kernel Offset: 0x3000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[    1.115040] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,255)

システムデバッグ

Journalctlにアクセスできません。キーボードが検出されない、押す、またはEnter続行^Dできないため、システムは停止します。

カーネルCLIにsystemd.unit=emergency.targetまたはを追加して緊急モードで直接起動しようとすると機能しないようです。emergency

+(UPDATE 2)このmkinitcpioパラメータは開始をbreak=premount変更しませんsystemd

ネットワーク

Wiresharkを使用すると、初期PXE起動後のネットワークアクティビティはありません。つまり、ロードlinuxおよびinitrdアンロード時にクライアントとサーバー間の通信はもはやありません。

SERVER IP: 192.168.2.101/24
CLIENT IP: 192.168.2.102/24

幼虫

GRUBネットワーク_*注文するそして環境変数すべてが正常に動作していることを示すようです。

net_ls_cards  efinet0 [CLIENT NETWORK DEVICE MAC]
net_ls_addr   efinet0 [CLIENT NETWORK DEVICE MAC] 192.168.2.102
net_ls_routes efinet0:local 192.168.2.0/24 efinet0
              efinet0:default 0.0.0.0/0 gw 192.168.2.101

echo $net_default_ip               192.168.2.102
echo $net_default_mac              [CLIENT NETWORK DEVICE MAC]
echo $net_default_server           192.168.2.101
echo $net_efinet0_ip               192.168.2.102
echo $net_efinet0_mac              [CLIENT NETWORK DEVICE MAC]
echo $net_efinet0_hostname         (empty)
echo $net_efinet0_domain           (empty)
echo $net_efinet0_dhcp_server_name (empty
echo $net_efinet0_next_server      192.168.0.101
echo $net_efinet0_root_path        102.168.0.101:/srv/[CLIENT OS]
echo $net_efinet0_extensionpath    (empty)

カーネルサポートnfsrootip

ネットワークアクティビティがなかったため、実行されたか実行されていないとip推定されます。nfsroot

実際、私が経験している問題は質問で説明されています。NFSサポートでカーネルを構築しましたが、/dev/nfsを取得できませんでした

この質問に対する答えは次のとおりです(Andreas Wiese、2014年7月1日14:58)。

...モジュール以外のカーネルバイナリにNFSサポートが組み込まれていることを確認してください(またはinitramfsそれを処理できるものが必要です)。ネットワークドライバも同様です。カーネルイメージにイーサネットネットワークカード用のドライバが組み込まれているはずです。それ以外の場合は、次のように始める必要がありますinitramfs。 1. 以下に従ってください。上記のリンクは、次のことを示しています:設定、正しいパラメータを提供し、パラメータを介してカーネルにネットワーク設定を知らせます(これが正しく機能していることを確認するための最善の方法です。つまり、誤って設定されたDHCPサーバーを除外するです)。 2. DHCPデーモンを有効にして設定し、クライアントに使用するIPアドレスとNFSルートを見つけることができる場所を示します。 3. 適切な構成および NFS インストールのために initramfs をビルドします。



root=/dev/nfsnfsrootip

CONFIG_IP_PNPCONFIG_IP_PNP_DHCP

Archlinuxカーネル研究

zgrep CONFIG_NFS_FS= /proc/config.gz -> CONFIG_NFS_FS=m
zgrep DHCP /proc/config.gz           -> (nothing)
zgrep _IP_PNP_ /proc/config.gz       -> CONFIG_IP_PNP is not set

ipArchlinuxがカーネルコンパイルをサポートしていないことを示します。

バグレポート(2006)のコメントでFS#5056 - デフォルトのカーネルはNFSルートマッピングを無効にします。

mkinitcpioは、すでにカーネルを変更せずにネットワークブートをサポートしています。

これは、上記の質問で許可されている回答のコメントと比較できます。

約10年間、カーネルはnfsを直接起動せず、代わりにカーネルコマンドラインを再解釈し、目的の場所から起動する初期のRAMディスクをインストールします。 – ピーター 2016-06-17 13:54

mkinitcpio

~からlsinitcpio -a

...
Created with mkinitcpio 24
Kernel: 4.13.12-1-ARCH
Size: 55,63 MiB
Compressed with: gzip
  ...

Included modules:
... nfs ... nfsv3 nfsv4 [explicit] ...

Included binaries:
... ipconfig ... mount.nsf4 ... nfsmount ...  

Early hook run order:
udev

Hook run order:
udev net net_nsf4 nbd

Cleanup hook order:
udev

ネットワークデバイスのmkinitcpioサポート(アップデート#1)

ネットワークカード用のドライバをロードする必要がありますが、読んでから確認したかったです。[解決済み] Diskless - ipconfig: 構成するデバイスがありません

ネットワークモジュールドライバを/etc/mkinitcpio.confに配置します。

MODULES=(atl1c nbd nfsv4)

initramfs.imgモジュールを明示的に宣言しても、クライアントからモジュール全体をビルドしても、何も変わりません。

画像を別のマシンで実行する必要がある場合は、自動検出を使用しないでください。自動検出は、現在実行中のシステムで起動するために必要とされていないすべてのドライバを削除します。

フックから取り外すと、以前に観察されたアンインストール時にカーネルパニックが発生するautodetect興味深い結果が得られます。ロード中に削除しても効果はありません。 add_efi_mmapadd_efi_mmapautodetect initramfs

mkinitcpioのサポートnfs

Archlinux は nsf4 をサポートする場合もありません。

私が知る限り、これはマイナーな問題です。 nfsをマウントする前に、ネットワークが正しく機能している必要があります。

mkinitcpioのサポートip

ちょうど見つけた

追加情報

これは関係があるかもしれませんし、そうでないかもしれません。

「BIOS PXE boot」の代わりに「UEFI PXE boot」を使用する理由は、GRUB i386-pcがgrub.cfgをロードできないためです。 「GRUBへようこそ!」というメッセージが表示されると、コンピュータが再起動または停止し、画面がカラーピクセルで覆われ、結果がランダムに表示されることがあります。 Wireshark ログには、tftpすべての grub モジュールがロードされる場合もあり、ロードされない場合もあることが表示されます。最後のログエントリは通常、サーバーネットワークデバイスへのクライアント要求です。ARP 60 Who has [SERVER IP]? Tell [CLIENT IP]?

答え1

Arch Linux Wikiの指示に従ってディスクレスシステム

クライアントインストールの場合

サーバーのサブディレクトリに完全なArch Linuxインストールを作成します。

それから

$root/etc/mkinitcpio.confを編集し、nfsv4をMODULESに、net_nfs4をHOOKSに、/usr/bin/mount.nfs4をBINARIESに追加します。

私が理解する限り、net_nfs4ちょうどmkinitcpio.confnet

ついに会ったネットワークでのArchLinuxロード処理 Rosharsky 2015年3月22日 16:14

この記事にはタイトルがあります。initramfsを準備するこれはArch Linux Wikiであなたになじみのあるものです。

# sed s/nfsmount/mount.nfs4/ "$root/usr/lib/initcpio/hooks/net" > "$root/etc/initcpio/hooks/net_nfs4"
# cp $root/usr/lib/initcpio/install/net $root/etc/initcpio/install/net_nfs4

しかし、いくつかの重要な点が異なります。

まず、Arch Linuxでnet_nfs4ファイルを編集します。

nano $root/usr/lib/initcpio/install/net_nfs4

build() {
    add_checked_modules '/drivers/net/'
    add_module nfsv4?

    add_binary "/usr/lib/initcpio/ipconfig" "/bin/ipconfig"

    # Not sure if it is an Arch Linux specific, but nfsmount is correct;
    # mount.nsf4 causes mkinitcpio during build to throw an error like "file not found".
    # add_binary "/usr/bin/mount.nfs4" "/bin/mount.nfs4"
    add_binary "/usr/bin/nfsmount" "/bin/mount.nfs4"

    add_runscript
}

第二に、

mkinitcpio.conf ファイルの行を変更して initramfs にプロセッサを追加します。

nano $root/etc/mkinitcpio.conf

HOOKS="base udev net_nfs4"

アップデート+(20171210)

解決しようとしています別の問題/usr/lib/initcpio/hooks/net_nfs4定義された関数で次の行が見つかりましたnfs_mount_handler

mount.nfs4 ${nfs_option:+-o ${nfs_option}} "${nfs_server}:${nfs_path}" "$1"

によるとman mount.nfs4

SYNOPSIS
   mount.nfs remotetarget dir [-rvVwfnsh ] [-o options]

DESCRIPTION
   ...
   remotetarget is a server share usually in the form of servername:/path/to/share.  dir is the directory on which the file system is to be mounted.
   ...

だから、行を次のように変更しました。

mount.nfs4 "${nfs_server}:${nfs_path}" "$1" ${nfs_option:+-o ${nfs_option}}

関連情報