graph rootを新しいパスへ
目標
rootless podmanのgraph rootを、ホームから別のパスへ移し、新しいストアをイメージで埋め直します。実務で最もよく行う、podmanの運用作業です。
なぜ重要なのか
rootless podmanのイメージは、~/.local/share/containers/storageに積まれます。CUDAベースイメージが1つで8GBあるGPUサーバーでは、ホームパーティションがあっという間に埋まります。そして、ホームが埋まると、podmanだけでなく、そのユーザーのすべての作業が止まります。そのため、GPUノードの標準設定には、graphrootの移動が最初から入っていることが多いです。
注意点が2つあります。新しいストアは空です: 既存のイメージは古いパスに残り、podmanはもう見ません。そして、runrootは移しません: 実行中のロックと一時的な状態が入るので、tmpfsである必要があります。
ステップ
/root/grディレクトリを作成して、podsterの現在のgraphRootとrunRootを、それぞれ1行ずつ(graphRootが先)/root/gr/before.txtに書いてください。- 新しいパス
/srv/podman/podsterを作成して、所有者をpodster、権限を700に設定してください。 podsterのstorage.confで、graphrootを新しいパスに変更してください。podman infoで、graphRootが新しいパスになっているかを確認して、/root/gr/after.txtに1行で書いてください。- 新しいストアのイメージの数を、数字1行で
/root/gr/empty.txtに書いてください。0である必要があります。 /opt/images/labhub-alpine.tarを新しいストアにロードして、ロード後のイメージ一覧を/root/gr/images.txtに保存してください。最低1つはある必要があります。/root/gr/runroot.txtを、次の2行で作成してください。RUNROOT=<현재 runRoot 값>/WHY=tmpfs(プレースホルダーは現在のrunRootの値です)/root/gr/report.txtを、次の4行で作成してください。OLD=<1번의 graphRoot>/NEW=/srv/podman/podster/IMAGES_BEFORE=0/IMAGES_AFTER=<6번 이후 이미지 개수>(プレースホルダーは、順に、ステップ1のgraphRoot、ステップ6のあとのイメージ数です)
参考
su - podster -c "podman info --format '{{.Store.GraphRoot}}'"で、値を1つだけ取り出せます。- イメージの数は、
podman images --format '{{.Repository}}' | wc -lで数えます。 - ロードは、
podman load -i /opt/images/labhub-alpine.tarです。 - このノードでは、コンテナランタイムがブロックされている可能性があります。その場合、コマンドは
cannot re-exec processのようなエラーで終わりますが、その出力もそのままファイルに保存してください。非特権のuser namespaceの作成がブロックされた環境で、rootless podmanがどう失敗するかが、それ自体で学ぶ価値のある内容であり、この場合、採点は作成した設定を基準にします。 - よくある間違い1: 新しいパスの所有者をrootにして、podmanが書き込めなくなること。
- よくある間違い2:
storage.confをrootで編集して、所有者が変わってしまうこと。編集後に、所有権をもう一度確認してください。
現在のパスを記録する
/root/grディレクトリを作成して、podsterの現在のgraphRootとrunRootを、それぞれ1行ずつ(graphRootが先)/root/gr/before.txtに書いてください。
podman infoには、Goテンプレートで特定の値だけを取り出すオプションがあります。Storeの下にパスがあります。
新しいパスを準備する
新しいパス/srv/podman/podsterを作成して、所有者をpodster、権限を700に設定してください。
所有者と権限が重要です。そのユーザーが読み書きできる必要があり、他人にのぞかれてはいけません。
storage.confを修正する
podsterのstorage.confで、graphrootを新しいパスに変更してください。
[storage]セクションのgraphrootの値だけを変えれば済みます。引用符は維持してください。
新しいパスが反映されたことを確認する
podman infoで、graphRootが新しいパスになっているかを確認して、/root/gr/after.txtに1行で書いてください。
設定を直したあと、もう一度infoを実行すれば、値が変わっているはずです。変わらなければ、所有権やパスを疑ってください。
新しいストアが空であることを確認する
新しいストアのイメージの数を、数字1行で/root/gr/empty.txtに書いてください。0である必要があります。
イメージの一覧を照会すると、見出しだけが出て、項目がないはずです。数を数えて、ファイルに書いてください。
イメージアーカイブをロードする
/opt/images/labhub-alpine.tarを新しいストアにロードして、ロード後のイメージ一覧を/root/gr/images.txtに保存してください。最低1つはある必要があります。
podmanには、tarアーカイブからイメージを読み込むコマンドがあります。ロード後、一覧に現れる必要があります。
runrootを確認して、根拠を記録する
/root/gr/runroot.txtを、次の2行で作成してください。
RUNROOT=<현재 runRoot 값> / WHY=tmpfs(プレースホルダーは現在のrunRootの値です)
runrootは移しません。なぜそうなのかを、決まったキーワードで書いてください。
移行レポート
/root/gr/report.txtを、次の4行で作成してください。
OLD=<1번의 graphRoot> / NEW=/srv/podman/podster / IMAGES_BEFORE=0 / IMAGES_AFTER=<6번 이후 이미지 개수>(プレースホルダーは、順に、ステップ1のgraphRoot、ステップ6のあとのイメージ数です)
移行前と移行後のパス、イメージの数を集めれば済みます。値は、実際に確認したものである必要があります。