「Kexec」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「http://www.ibm.com/」を「https://www.ibm.com/」に置換) |
(同期) |
||
| 5行目: | 5行目: | ||
{{Related|Systemd}} |
{{Related|Systemd}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
| − | + | [[Wikipedia:ja:Kexec|Kexec]] は動作中のカーネルから他のカーネルをロード・起動するためのシステムコールです。カーネル開発者など、BIOS のブートプロセスが終わるまで待たないで素早く再起動する必要がある場合に有用です。デバイスが完全に再初期化されず、kexec が上手く動作しないこともありますが、それはとてもレアなケースです。 |
|
== インストール == |
== インストール == |
||
| − | + | {{pkg|kexec-tools}} パッケージをインストールしてください。 |
|
== kexec で再起動 == |
== kexec で再起動 == |
||
| + | |||
| + | === 手動 === |
||
| + | |||
| + | kexec を手動で実行するには: |
||
| + | |||
| + | # kexec -l /boot/vmlinuz-linux --initrd=/boot/initramfs-linux.img --reuse-cmdline |
||
| + | # kexec -e |
||
| + | |||
| + | {{Warning|{{ic|kexec -e}} を直接実行するとアクティブなファイルシステムがアンマウントされません。また、実行中のサービスが安全に終了されません。}} |
||
| + | |||
| + | 手動でカーネルをロードしてから systemd でサービスのシャットダウンや kexec を処理させることも可能です: |
||
| + | |||
| + | # kexec -l /boot/vmlinuz-linux --initrd=/boot/initramfs-linux.img --reuse-cmdline |
||
| + | # systemctl kexec |
||
=== Systemd === |
=== Systemd === |
||
| 50行目: | 64行目: | ||
{{ic|/boot}} が root ファイルシステム上にない場合、上記の systemd ユニットファイルは動作しません。{{ic|kexec-load}} ユニットファイルを実行する前に {{ic|/boot}} が systemd によってアンマウントされてしまうからです。その場合、起動時には何もせず終了時に kexec を呼び出す "hook" ユニットファイルをロードします。このユニットファイルを {{ic|kexec.target}} と衝突させるようにすることで、新しいカーネルを {{ic|systemctl kexec}} コマンドの直後に確実にロードさせることができます。上記の規定どおりに作成した {{ic|/etc/systemd/system/kexec-load@.service}} ファイルは以下のようになります: |
{{ic|/boot}} が root ファイルシステム上にない場合、上記の systemd ユニットファイルは動作しません。{{ic|kexec-load}} ユニットファイルを実行する前に {{ic|/boot}} が systemd によってアンマウントされてしまうからです。その場合、起動時には何もせず終了時に kexec を呼び出す "hook" ユニットファイルをロードします。このユニットファイルを {{ic|kexec.target}} と衝突させるようにすることで、新しいカーネルを {{ic|systemctl kexec}} コマンドの直後に確実にロードさせることができます。上記の規定どおりに作成した {{ic|/etc/systemd/system/kexec-load@.service}} ファイルは以下のようになります: |
||
| − | |||
| − | {{bc|1= |
||
| − | [Unit] |
||
| − | Description=hook to load vmlinuz-%i kernel upon kexec |
||
| − | Documentation=man:kexec(8) |
||
| − | DefaultDependencies=no |
||
| − | RequiresMountsFor=/boot/vmlinuz-%i |
||
| − | Conflicts=kexec.target |
||
| − | |||
| − | [Service] |
||
| − | Type=oneshot |
||
| − | ExecStart=-/usr/bin/true |
||
| − | RemainAfterExit=yes |
||
| − | ExecStop=/usr/bin/kexec -l /boot/vmlinuz-%i --initrd=/boot/initramfs-%i.img --reuse-cmdline |
||
| − | |||
| − | [Install] |
||
| − | WantedBy=basic.target |
||
| − | }} |
||
| − | |||
| − | 残念ながら、上記のファイルは問題なく動作することもありますが、マシンによっては ExecStop コマンドが動作しないことがあります。従って、今のところ、全てのマシンで {{ic|systemctl kexec}} を確実に動作させることができる方法はありません。 |
||
| − | |||
| − | sysinit による順番を使用する方法 (アンマウントが行われる前にサービスが確実にシャットダウンされます): |
||
{{bc|1= |
{{bc|1= |
||
| 92行目: | 84行目: | ||
{{ic|1=Conflicts=shutdown.target}} は省略してもかまいません。{{ic|systinit.target}} を指定するだけで暗示的に {{ic|1=Conflicts=}} が {{ic|shutdown.target}} に設定されるためです。 |
{{ic|1=Conflicts=shutdown.target}} は省略してもかまいません。{{ic|systinit.target}} を指定するだけで暗示的に {{ic|1=Conflicts=}} が {{ic|shutdown.target}} に設定されるためです。 |
||
| − | |||
| − | === 手動 === |
||
| − | |||
| − | kexec を手動で実行することもできます: |
||
| − | |||
| − | # kexec -l /boot/vmlinuz-linux --initrd=/boot/initramfs-linux.img --reuse-cmdline |
||
| − | # kexec -e |
||
| − | |||
| − | {{Warning|{{ic|kexec -e}} を直接実行するとアクティブなファイルシステムがアンマウントされません。また、実行中のサービスが安全に終了されません。}} |
||
| − | |||
| − | 手動でカーネルをロードしてから systemd でサービスのシャットダウンや kexec を処理させることも可能です: |
||
| − | |||
| − | # kexec -l /boot/vmlinuz-linux --initrd=/boot/initramfs-linux.img --reuse-cmdline |
||
| − | # systemctl kexec |
||
== 参照 == |
== 参照 == |
||
2018年3月29日 (木) 21:44時点における版
関連記事
Kexec は動作中のカーネルから他のカーネルをロード・起動するためのシステムコールです。カーネル開発者など、BIOS のブートプロセスが終わるまで待たないで素早く再起動する必要がある場合に有用です。デバイスが完全に再初期化されず、kexec が上手く動作しないこともありますが、それはとてもレアなケースです。
インストール
kexec-tools パッケージをインストールしてください。
kexec で再起動
手動
kexec を手動で実行するには:
# kexec -l /boot/vmlinuz-linux --initrd=/boot/initramfs-linux.img --reuse-cmdline # kexec -e
手動でカーネルをロードしてから systemd でサービスのシャットダウンや kexec を処理させることも可能です:
# kexec -l /boot/vmlinuz-linux --initrd=/boot/initramfs-linux.img --reuse-cmdline # systemctl kexec
Systemd
ユニットファイル kexec-load@.service を作成して、kexec するカーネルをロードさせる必要があります:
/etc/systemd/system/kexec-load@.service
[Unit] Description=load %i kernel into the current kernel Documentation=man:kexec(8) DefaultDependencies=no Before=shutdown.target umount.target final.target [Service] Type=oneshot ExecStart=/usr/bin/kexec -l /boot/vmlinuz-%i --initrd=/boot/initramfs-%i.img --reuse-cmdline [Install] WantedBy=kexec.target
ロードしたいカーネルを指定してサービスファイルを有効化してください、例えばデフォルトカーネル linux を使用する場合:
# systemctl enable kexec-load@linux
ln -s '/etc/systemd/system/kexec-load@.service' '/etc/systemd/system/kexec.target.wants/kexec-load@linux.service'
/etc/mkinitcpio.conf の HOOKS 行から shutdown フックを削除して initramfs イメージにフックを含めないようにしてください。削除したら mkinitcpio -p linux で initrd イメージを再生成します。
その後 kexec を実行します:
# systemctl kexec
別のカーネルをロードしたいときは (例: linux-lts)、現在のカーネルのサービスを無効化してから新しいカーネルのサービスを有効化してください:
# systemctl disable kexec-load@linux # systemctl enable kexec-load@linux-lts
/boot パーティションの分割
/boot が root ファイルシステム上にない場合、上記の systemd ユニットファイルは動作しません。kexec-load ユニットファイルを実行する前に /boot が systemd によってアンマウントされてしまうからです。その場合、起動時には何もせず終了時に kexec を呼び出す "hook" ユニットファイルをロードします。このユニットファイルを kexec.target と衝突させるようにすることで、新しいカーネルを systemctl kexec コマンドの直後に確実にロードさせることができます。上記の規定どおりに作成した /etc/systemd/system/kexec-load@.service ファイルは以下のようになります:
[Unit] Description=hook to load vmlinuz-%i kernel upon kexec Documentation=man:kexec(8) DefaultDependencies=no Requires=sysinit.target After=sysinit.target [Service] Type=oneshot ExecStart=-/usr/bin/true RemainAfterExit=yes ExecStop=/usr/bin/kexec -l /boot/vmlinuz-%i --initrd=/boot/initramfs-%i.img --reuse-cmdline [Install] WantedBy=basic.target
Conflicts=shutdown.target は省略してもかまいません。systinit.target を指定するだけで暗示的に Conflicts= が shutdown.target に設定されるためです。