自動マウントするUSB外付けSSDにdockerのファイルを移動させる
dockerを使っていると /var/lib/docker
がストレージを圧迫します。それをUSB外付けSSDに引越しさせることにしました。今後同じことをする可能性が高いと思ったので、作業メモを残します。
このページを参考にさせていただきました。
Jetson AGX Orin Developer Kitを使っています。
USB外付けSSDの初期化
今回は500GBのものを使います。
まずUSB外付けSSDを挿して、どのデバイスとして認識されたか確認。
$ lsblk
今回は/dev/sda
でした。
これを間違うととんでもないことになるので指差し確認しましょう。
$ sudo fdisk /dev/sda
$ sudo mkfs.ext4 /dev/sda1
UUIDを確認。
$ sudo blkid |grep sda1
/dev/sda1: UUID="72ee9b47-7b99-4bdf-9934-eee14513120e" TYPE="ext4" PARTUUID="76c4dabc-6892-5442-b59f-00590fee79fd"
マウントするディレクトリを作成。
$ sudo mkdir -p /autofs/usbssd1
systemdを使った自動マウントの設定
$ sudo mkdir -p /usr/local/lib/systemd/system/
$ cd /usr/local/lib/systemd/system/
$ sudo vi autofs-usbssd1.mount
$ sudo vi autofs-usbssd1.automount
$ sudo systemctl daemon-reload
私は自分で作ったsystemdのserviceは/usr/local/lib/systemd/system
に置くのが好みです。
これならaptで自動で入ったものとの区別がわかりやすいです。
作成したファイルは以下の通り。
[Unit]
Description=USB SSD1
[Mount]
What=/dev/disk/by-uuid/72ee9b47-7b99-4bdf-9934-eee14513120e
Where=/autofs/usbssd1
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target
[Unit]
Description=Automount USB SSD1
[Automount]
Where=/autofs/usbssd1
[Install]
WantedBy=multi-user.target
設定を有効にします。
$ sudo systemctl disable autofs-usbssd1.mount
$ sudo systemctl enable autofs-usbssd1.automount
$ sudo systemctl start autofs-usbssd1.automount
自動マウントされるか確認。
$ ls /autofs/usbssd1/
lost+found
のディレクトリが見えるはず。
$ mount |grep /autofs
systemd-1 on /autofs/usbssd1 type autofs (rw,relatime,fd=30,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
/dev/sda1 on /autofs/usbssd1 type ext4 (rw,relatime)
マウントできてる。
$ sudo systemctl status autofs-usbssd1.automount
$ sudo systemctl status autofs-usbssd1.mount
それぞれactiveになっています。
/var/lib/docker の引越し
dockerのserviceを停止。
$ sudo systemctl stop docker
$ sudo systemctl stop docker.socket
/var/lib/docker
をコピーして、元の場所にシンボリックリンクを作成。
$ sudo cp -a /var/lib/docker /autofs/usbssd1/
$ sudo mv /var/lib/docker{,.old}
$ sudo ln -s /autofs/usbssd1/docker /var/lib/docker
$ sudo ls /var/lib/docker
dockerのserviceに依存関係を追加
/var/lib/docker
が自動マウントされた後にdockerが動くように依存関係を追加します。
/lib/systemd/system/
のファイルを修正するときには /etc/systemd/system
にコピーしてから修正するのが流儀のようなので、それにならいます。
$ sudo cp /lib/systemd/system/docker.service /etc/systemd/system/
$ sudo cp /etc/systemd/system/docker.service{,.org}
$ sudo vi /etc/systemd/system/docker.service
$ sudo systemctl daemon-reload
修正は以下の通り。
$ diff -u /etc/systemd/system/docker.service.org /etc/systemd/system/docker.service
--- /etc/systemd/system/docker.service.org 2022-05-14 22:07:24.958753155 +0900
+++ /etc/systemd/system/docker.service 2022-05-14 22:08:48.447817204 +0900
@@ -1,7 +1,7 @@
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
-After=network-online.target firewalld.service containerd.service
+After=network-online.target firewalld.service containerd.service autofs-usbssd1.mount
Wants=network-online.target
Requires=docker.socket
Wants=containerd.service
dockerを再び有効にする。
$ sudo systemctl start docker.socket
$ sudo docker ps
エラーにならなければOK.
USB外付けSSDを外すときは
不用意にUSB外付けSSDを外すとたぶんまずいことになります。
まずdokerを停止。
$ sudo systemctl stop docker docker.socket
$ sudo systemctl status docker docker.socket
$ sudo systemctl stop autofs-usbssd1.mount autofs-usbssd1.automount
$ sudo systemctl status autofs-usbssd1.mount autofs-usbssd1.automount
mountしているファイスシステムをまだ使っているプロセスがいるとエラーになります。
それらを解決してから、mountが解除されていることを確認します。
$ mount |grep /autofs
これで何も表示されなければ、USB外付けSSDを外してもOK。
再びつけたときには、以下のようにして止めたサービスを再開させます。
$ sudo systemctl start autofs-usbssd1.automount docker.socket
Discussion