Arch Linuxをディスクレスマシンとして立ち上げる。NFS使用。(20154)

ブート出来るまで

Arch wiki の 既存の Linux からインストール に従って、適当なパーティションにrootファイルシステムイメージを構築する。

ssh越しなどで、キーリングの初期化に長時間かかるのを避けるには、havegedを用いてエントロピーを注入する。

  • pacstrapが終わったら、ターゲットにarch-chrootする。

    • /etc/fstabはひとまず放置。
    • ブートローダのインストールも不要。

コアなホスト設定

echo sawara > /etc/hostname
echo "KEYMAP=jp106" >> /etc/vconsole.conf
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
locale-gen
echo LANG=C > /etc/locale.conf

passwd

initrd作成 (nfsroot用)

mkinitcpio.confの HOOKSから fsckを外し netを追加する。パッケージmkinitcpio-nfs-utilsが必要。ルートパーティションにアクセスする上で必要なモジュールがあれば、MODULESに加えれば initramfsに取り込んでくれる。

pacman -S mkinitcpio-nfs-utils
vi /etc/mkinitcpio.conf
MODULES="e1000"  # Intel/Pro 1000を使用する場合(VirtualBoxゲストなど)。
HOOKS=" ... fsck^H^H^H^H   net"
mkinitcpio -p linux

/boot内にカーネルとinitramfsイメージが作成される。

母艦のtftp用に 所有者を設定

私はディスクレスマシンの/boot/に生成されるカーネル等へのsymlinkをtftprootに置いているので、ディスクレスマシン側で所有者を設定する必要がある。 利便性のため、先に母艦とディスクレスのdnsmasqのuid,gidを共通にしておく。

groupadd -g 121 dnsmasq  # 母艦と同じgidに
useradd -u 102 dnsmasq   # 母艦と同じuidに

但し、上記の数字だと、後で polkitサービスが失敗する不具合がでた。 Archの方では 決まった uidかgidを使用するためか?これを避けるにはArch側はuseraddで自動割り振りの値を貰い、母機側を uid gidを修正する方が良いかもしれない。(あればファイルの所有者も)

カーネル等のuid, gidを設定

cmown dnsmasq.dnsmasq  /boot/vmlinuz*  initramfs*

母艦側でカーネル等イメージをtftprootへコピーする場合は、母艦で所有者を設定する。

ブート

カーネル起動パラメータには、dhcpによるkernel autoconfigurationと nfsrootを指定する。

  • ip=:::::eth0:dhcp
  • nfsroot=<nfs server IP>:<path>

pxelinuxでの例

kernel vmlinuz-linux
append initrd=initramfs-linux.img ip=:::::eth0:dhcp nfsroot=192.168.7.1:/var/diskless/sawara vga=0x344

ネットワーク関連

IPアドレス・ゲートウェイなどは DHCPで決まるので、 リゾルバの設定のみ。インターフェース名はカーネルが決めたeth0などで、udevは変更できない。

vi /etc/resolv.conf
search ...... 
nameserver 192.168.x.x

yaourt

chachefilesdがAURにあるため、yaourtをインストール。

cat >> /etc/pacman.conf <<'EOF'
[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch
EOF
pacman --sync --refresh yaourt

nfsのローカルキャッシュ(オプション)

cachefilesdを使用する。ローカルにext4のストレージを置き、/var/cache/fscacheにマウントする。

$ yaourt -S cachefilesd
mkfs.ext4 /dev/sd?? -L fscache
mount /var/cache/fscache
echo "/dev/??  /var/cache/fscache  ext4  auto,noatime  0 0" >> /etc/fstab
systemctl start cachefilesd
systemctl enable cachefilesd

以上