🎯

自動マウントするUSB外付けSSDにdockerのファイルを移動させる

2022/05/15に公開

dockerを使っていると /var/lib/docker がストレージを圧迫します。それをUSB外付けSSDに引越しさせることにしました。今後同じことをする可能性が高いと思ったので、作業メモを残します。

このページを参考にさせていただきました。
https://r-o-head.tk/post/systemd-automount/

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で自動で入ったものとの区別がわかりやすいです。
作成したファイルは以下の通り。

autofs-usbssd1.mount
[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
autofs-usbssd1.automount
[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