kexecを用いてブートストラップをしつつRAIDアレイ上からLinuxを動作させるメモ
はじめに
現在、市販の中華NUCを用いて新サーバを製作中なのですが、今使っているProLiantのようなリモート管理機能を持たない一般PCにて、外部からOSを自由に入れ替える方法を模索した結果kexec
1に辿り着きました。
kexecはLinuxカーネルの機能で、Linuxカーネル上から別のLinuxカーネルを起動できる機能です。 Dockerやsystemd-nspawnといったコンテナとは全く異なり、再起動したかのような動作を経て新しいカーネルが起動します。
話は変わりますが、RAIDアレイ上のOSを起動する際、(GPTでは)冗長化されていないもしくはRAID1の起動ディスクからブートローダを実行し、RAIDに対応しているLinuxカーネルを読みだした上で起動するという流れが行われると思います。
ここで、このブートストラップ的な場面でkexecを使い、非冗長なSDカード上に踏み台のArch Linuxを設置した上でRAIDアレイ上のOSを起動する事にしました。
というのも、(うまくいけば)近々サーバ製作記を書くと思うのですが、無理やり拡張した都合上利用可能なストレージが
- 「起動できない」SATA
- USBの何か
- 内臓SDカードスロット
に限られてしまっており、割り切って考えてOKだったためです。(本当は良くない)
まあ、この記事を残しておけばいつでも復旧できるはずですし、イメージでバックアップを取れば十分でしょう…
手順
大まかに
- 起動ディスクにArchをインストール
- RAIDアレイを用意
- 本命のOSインストール
- kexecで起動
です。 今更Archのインストールなど説明する必要もないので2まで飛ばします。
ちなみに、今回はRAID1を使います。
RAIDアレイを用意
|
|
本命のOSインストール
debootstrapとかpacstrapとかで自由にインストールします。
systemd-nspawnと異なりAlpine Linuxなどの非systemd環境もインストール可能です。
|
|
ブートローダのインストールは不要です。 vmlinuzとinitramfsが/bootにあるようにします。
ただし、initramfs上のhookは忘れずに有効化します。
(/etc/mkinitcpio.conf
内のHOOKS
にmdadm_udev
を追加2)
(実験)kexecで起動
踏み台OSにて
|
|
私の環境特有なのかわかりませんが、kexecで起動するとHDMI1しか映像出力されずハマりました。
元々nomodesetでないと映像が出ないような不安定さがある環境なので何が悪いのか微妙な所です。。。
自動起動
-
/etc/systemd/system/boot-main.service
[Unit] Description=kexec boot RefuseManualStart=no RefuseManualStop=yes [Service] Type=oneshot ExecStart=/usr/local/bin/boot-main.sh [Unit] Description=delayed kexec boot [Timer] OnBootSec=5min [Install] WantedBy=timers.target
-
/etc/systemd/system/boot-main.timer
[Unit] Description=delayed kexec boot [Timer] OnBootSec=5min [Install] WantedBy=timers.target
-
/usr/local/bin/boot-main.sh
1 2 3
#!/bin/bash kexec -l /var/disk/boot/vmlinuz-linux-lts --initrd=/var/disk/boot/initramfs-linux-lts.img --command-line=root=/dev/md0 md=1,/dev/sda,dev/sdb rw rootwait nomodeset systemctl kexec
のようにファイルを作り
|
|
で有効化します。 この例だと5分後に自動で起動します。
おわりに
kexecを用いる事でRAIDからの起動を可能にしつつ、遠隔でのレスキュー環境を整える事ができました。
自宅サーバ勢でPCサーバな方如何でしょうか(笑)
-
Kexec - ArchWiki, https://wiki.archlinux.jp/index.php/Kexec ↩︎
-
RAID - ArchWiki, https://wiki.archlinux.jp/index.php/RAID#mdadm フックを mkinitcpio.conf に追加する ↩︎