web-dev-qa-db-ja.com

休止状態から再開するためのユーザースペースコマンドはどれですか?

長い間、私は使用しました

echo disk > /sys/power/state

To/dev/sda10を休止状態にするために、Debianディストリビューションのinitrdを使用して再開しました。

しかし最近、RAIDアレイに切り替えました完全にカスタムのinitramfsを使用する必要があります(既存のinitrdを変更しようとしたため、最初からビルドする必要がありました。ルートパーティションをマウントする前にRAIDアレイをセットアップするために)が機能しました。

再開するには2つの方法があります。カーネルがresume=kernelパラメータを使用してスワップファイルシステムを直接読み取ることができます(初期化を開始する前に再開します);または、スワップパーティションにアクセスできるようにするために、ユーザースペース(モジュールのロードなど)が必要です。

再開するためのユーザースペースコマンドは何ですか/dev/mapper/isw_qfyzrvbsusf_Volume0p9

3
user2284570

ファイルis/sys/power/resume

レジュームをトリガーするには、デバイスのメジャーとそれに続くマイナーをそのファイルに書き込む必要があります。したがって、次のコマンドでそれを実現できます。

echo `stat -c %t /dev/mapper/isw_*_Volume0p9`\:`stat -c %T /dev/mapper/isw_*_Volume0p9` > /sys/power/resume
0
user2284570

簡単な答えは/ sys/power/resumeです

それだけでは何の役にも立たないので、はるかに長い答えです。ほとんどのディストリビューションは、init/PID 1プロセス(初期のユーザースペース)から再開を開始することを推奨しています。ただし、この手順では、ほとんどの場合、resumeターゲットを使用してカーネルcmd行引数をブートローダーに追加するように通知されます。この理由は、ほとんどすべての場合、initramfsビルドツール(dracut/mkinitcpio/initramfs-tools)自体が構成内のその引数によってトリガーされるためです。

あなたの例とディストリビューションに基づいて、サスペンド(swsusp)に低レベルのカーネルインターフェースを使用していると仮定しています。一時停止プロセスを開始するために使用できるユーティリティは他にもたくさんあります。それらはすべて、基本的に最初のアイテムであるswuspのラッパーです。

  • swusp -低レベルのカーネルインターフェイス。ユーザースペースインターフェイスはsysfsを介して行われます
  • swswp -低レベルのユーザースペースソフトウェアサスペンドラッパー-s2disk、s2ramユーティリティを提供します(アクティブに保守されていません)
  • pm-utils -プロセスを構成するための高レベルのスクリプト
  • systemd-suspend --systemdシステムでは、カーネルインターフェイスを介してサスペンド操作を開始するサスペンドターゲットを使用できます。

構成を再開する

Initramfsイメージを使用したLinuxでのブートシーケンスの単純化された概要は次のとおりです。

[BIOS] ==> [ブートローダー] ==> [一時rootfs上のカーネル-initramfs] ==> [rootfs上のカーネル-ドライブ]

Initramfsステージの最後に、再開が発生する可能性のある小さなウィンドウがあります。カーネルがPID1(systemdまたはinit)を開始した後、レイド用のドライバーをロードしましたが、実際のドライブをマウントする前です。

典型的な履歴書構成の例を示しました。これは、指定した再開パスがスワップパーティションであることを前提としています。スワップファイルを含む「通常の」パーティションではありません。スワップファイルには追加の構成が必要です。 systemdメソッドは異なります。resume.targetに基づくudevルールを使用して、再開プロセスをトリガーします。従来のブートローダー/ initramfsイメージアプローチが機能しないかどうかを調べる価値があります。これは、initベースのシステムがそれを行う方法の直接的な核心です。ただし、独自のスクリプトを手動で挿入して、相互依存関係/相対的なタイミングを正しくするのは少し難しいです。

肝心なのは、再開がトリガーされる時点は、カーネルが「実際の」ハードドライブをマウントする直前であるということです。したがって、カーネルがfs全体をマウントできる場合は、スワップパーティションのみをマウントするために必要なすべての機能と情報も備えています。

スワップパーティションがfstabを介してマウントされていることを確認してください。 dracut initramfsツールは特にそれを探し、スワップパーティションがない場合は再開モジュールを含みません。

ブートローダーを構成する

Grub2を使用していると仮定すると、resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9GRUB_CMDLINE_LINUX_DEFAULTフィールドに/etc/default/grubを追加する必要があります。通常はコマンドSudo grub2-mkconfig -o /boot/grub2/grub.cfgを使用してgrubイメージを更新します。

initramfsを再構築します

再開機能(およびすでに行ったレイドの変更)を使用して、initramfsイメージを再構築する必要があります。 Debianは、initramfsを生成するためのdracutとinitramfs-toolsの両方を提供します。再開モジュールを使用して再生成する必要があります。 dracutを使用して、コマンドライン引数--add resumeを追加します。 update-initramfsを使用して、エントリresume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9を構成ファイル/etc/initramfs-tools/conf.d/resumeに追加します。

それはそれであるはずです。私があなたの構成についていくつかの正しい仮定をしたと仮定します。

編集;正しく時間を計ることができれば、スワップパーティションのメジャー/マイナーデバイス番号をinitスクリプトから/ sys/power/resumeにエコーして、再開をトリガーできます。 initramfs(またはinitd)イメージには、再開サポートが必要です。そうでない場合、そのsysfsアイテムとそれが表す機能は存在しません。 https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/983805 を参照してください。

7
Argonauts