「Kexec」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「http://www.ibm.com/」を「https://www.ibm.com/」に置換)
(同期)
5行目: 5行目:
 
{{Related|Systemd}}
 
{{Related|Systemd}}
 
{{Related articles end}}
 
{{Related articles end}}
'''Kexec''' は動作中のカーネルから他のカーネルをロード・起動するためのシステムコールです。カーネル開発者など、BIOS のブートプロセスが終わるまで待たないで素早く再起動する必要がある場合に有用です。デバイスが完全に再初期化されず、kexec が上手く動作しないこともありますが、それはとてもレアなケースです。
+
[[Wikipedia:ja:Kexec|Kexec]] は動作中のカーネルから他のカーネルをロード・起動するためのシステムコールです。カーネル開発者など、BIOS のブートプロセスが終わるまで待たないで素早く再起動する必要がある場合に有用です。デバイスが完全に再初期化されず、kexec が上手く動作しないこともありますが、それはとてもレアなケースです。
   
 
== インストール ==
 
== インストール ==
   
kexec をインストールするには、[[公式リポジトリ]]の {{pkg|kexec-tools}} パッケージをインストールしてください。
+
{{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
警告: 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.confHOOKS 行から 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 に設定されるためです。

参照