試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Ubuntu Gutsy(7.10)でuswsuspのスワップ「ファイル」からの復帰ができなかった件の対処と、ファイルへの書き込みの流れ

uswsuspでは、復帰時にinitrd(初期RAMディスク/initramfsとも呼ぶ)の中に含まれるresumeコマンドが呼ばれ、その際には、initramfs内の/etc/uswsusp.confが使用されるということが分かり、解決の糸口となった。
以下、スワップファイルの作成からそのファイルへメモリイメージを書き込んで休止し、その後復帰ができるようにするまでの作業の覚え書き。今回も、端末を使用しない方向で作業を進める。*1
なお、この記事では、/swapfileという場所にスワップファイルを作成するものとする。場所や名前は好みに応じて変更。

ファイルとしてのスワップの作成

uswsuspのファイルへのメモリイメージ(「スナップショット」と呼んでいる)の保存には、ファイルとして作成したスワップがそのまま使える。その作成方法の例は以下。
「アプリケーションの実行」で、以下の内容を1つずつ実行する。

  1. gksudo dd if=/dev/zero of=/swapfile bs=1M count=[容量(MiB数)]
  2. gksudo mkswap /swapfile
  3. gksudo gedit /etc/fstab

/etc/fstabの編集に入ったら、以下の行を追加する。
ファイル名: /etc/fstab

/swapfile none swap sw 0 0

その後「gksudo swapon -a」を実行して、スワップファイルを有効化する。

ファイルへ書き込むまでの作業

TuxOnIceと同様、ファイルへの書き込みをする場合、復帰時にどのパーティションのどの場所から読み取ればよいのかを指示する必要があり、書き込み時にも同様にパーティション内の場所を知らせておく(設定しておく)必要がある。

場所情報の取得と指定

「アプリケーションの実行」アイコンで「gksudo "sh -c 'swap-offset /swapfile >> /etc/uswsusp.conf'"」を実行する(端末でもOK)。

swap-offsetというコマンドにより、パーティション内の場所情報を取得し、これを/etc/uswsusp.confへそのまま追記する(設定ファイルの書式で「resume offset = 123542」のように出力される)。
しかし、これだけでは情報としては不十分(内容として誤っている)で、アプリの実行から「gksudo gedit /etc/uswsusp.conf」をして編集に入り、「resume device」の値を作成したスワップファイルの含まれるパーティションのデバイス名へ修正する必要がある。
バージョン0.6~cvs20070618-1ubuntu2の時点では、DebConfの設定(dpkg-reconfigure uswsusp)ではスワップのデバイス名をリストから選択して/etc/uswsusp.confに反映させる形のため、スワップファイルの含まれるパーティションこのリストから選択し、設定ファイルに反映するということができないため、ここだけは手動で編集しなくてはならない。
手元の仮想マシン環境では、

ということから、/dev/sda1上に存在することが分かるため、

ファイル名: /etc/uswsusp.conf

resume device = /dev/sda1

に修正することになった。
なお、一度「resume offset」の追加と「resume device」の修正を行った後は、「gksudo dpkg-reconfigure uswsusp」を行ってもその値は保持されるため、設定ツールを使用することにより、手動で設定した上記項目の値が失われるという心配は無用。ただし、スワップファイルを別のパーティションに移動したり、ファイルを削除して作り直したりした場合には、古い「resume offset」の行を手動で消した後「gksudo "sh -c 'swap-offset /swapfile >> /etc/uswsusp.conf'"」を再び実行する必要がある。

手動修正した設定ファイルをinitrdに反映

この時点では、initrdに含まれる/etc/uswsusp.confは手動修正を行う前の状態になっているため、手動修正した変更を反映させることが必要。
上にも書いたように、「gksudo dpkg-reconfigure uswsusp」を行っても、手動で編集した項目の値は保持されるため、initrd内の設定ファイルに新しい設定を反映させるためには「dpkg-reconfigure uswsusp」を再実行し、設定ダイアログが出たらそのまま「進む」をクリックするだけでよい。

動作確認

Ubuntu Gutsy(7.10)でuswsusp + hibernate-scriptによるハイバネーションを行う」のラッパースクリプトを使用するか、「gksudo /usr/sbin/hibernate」を実行(直接s2diskを実行する方法でも可)。その後うまく復帰できればOK。

すぐにXに戻って失敗してしまう場合

すぐにXの画面に戻ってしまう場合、ファイルがスワップとして初期化/有効化されていないか、復帰に失敗した後の場合などが考えられる。端末上では

hibernate: [95] Executing XHacksSuspendHook2 ...
hibernate: [98] Executing CheckRunlevel ...
hibernate: [99] Executing DoUSuspend ...
hibernate: Running /sbin/s2disk ...
s2disk: Could not use the resume device (try swapon -a). Reason: No such device
hibernate: [90] Executing ModulesLoad ...

のようなエラーが出る。この場合は、

  1. 「gksudo mkswap /swapfile」
  2. 「gksudo swapon -a」

スワップを再初期化/有効化して再試行。

書き込めるがそれでも復帰できない
  • Synapticなどで一度uswsuspを完全削除後、再インストールし、設定をやり直す
  • スワップファイルを作り直す
  • 設定ファイル/etc/uswsusp.confの見直し
  • initrdへの反映を忘れずに実行

関連記事:

*1:結局、実行させなくてはならないコマンドが多くあるため、端末からやっているのとあまり変わらないかもしれないが...