Debian13で、USBディスクを自動マウント、自動解除
Debian13で、外付けUSBディスクを管理する際に自動マウントや、自動停止をしたい時の設定の覚書です。
USBディスクのフォーマット
今回はWindowsと共用したいので、USBディスクのフォーマットはntfsにしたいと思います。
まず、Debian13では標準でntfsフォーマットができないので、ntfs-3g パッケージを使います。
# apt install ntfs-3g
次にUSBを接続し、対象となるデバイス名を確認します。lsblkコマンドの o オプションで次のように表示項目を絞ると分かりやすいと思います。
# lsblk -o NAME,MODEL,SERIAL,VENDOR,TRAN NAME MODEL SERIAL VENDOR TRAN sda ST500DM002-1BD142 xxxxxx ATA sata sdb ST2000VM006-3GW102 xxxxxx BUFFALO usb sdc Multi-Card xxxxxx Generic- usb sr0 TSSTcorp DVD+/-RW SH-216DB xxxxxx TSSTcorp sata
lsblkコマンドはブロックデバイスをリストするものです。ブロックデバイスとは、データを一定サイズ(512byte)等で読み書きできるデバイスの事を指し、ディスクはほぼすべてこれにあたります。
ちなみに、対になる概念としてはキャラクタデバイスという言葉があり、こちらはデータを1バイト単位でシリアルに読み書きするデバイスを指します。こちらの例はシリアルポートの他、マウス、サウンド等も含まれます。
他には、udevadm((user space device administration)コマンド でデバイスを指定して info オプションを使う方法もあります。
パーテーションを作ります。先ほどの出力でデバイスはsdbであると決定された前提で話を進めます。Debian13では標準でインストールされている fdisk でもGPTテーブルが作成可能です。他のパーテーション作成ツールは parted や gdiskを使います。gdiskはGPT版のfdiskにあたるもので、GPTテーブルの修正にも強いです。
fdiskでGPTテーブルを作成する際は、初回のコマンドで gを入力します。するとGPTパーテーションテーブルが作られます。
fdisk /dev/sdb Command (m for help): g Created a new GPT disklabel (GUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) Command (m for help): n Partition number (1-128, default 1): ... Command (m for help): t (Windowsで扱いたいので、11を指定してMicrosoft basic dataに) Command (m for help): p(確認) Command (m for help): w(書込)
筆者の環境では、fdiskで作成したパーテーションだとWindowsから認識できずに
パーテーション内をntfsでフォーマットします。ntfs-3gをインストールすると、mkfs.ntfs コマンドが利用可能になります。 -f(--fast)オプションはクイックフォーマットです。
ちなみに、fdiskは今でも標準でインストールされていて今回のような用途では有効ですが、MBRでなくGPTディスクがメインになる近頃は代替のgdiskを使います。
自動マウントの設定
/etc/fstabに記述を追加して自動マウントするようにします。
今回はバックアップ用のディスクで使用するタイミングが限られることから、利用時にマウントされるようにします。
マウント用にUUIDを確認します。
# blkid /dev/sdb1 /dev/sdb1: BLOCK_SIZE="512" UUID="xxxxx" TYPE="ntfs" PARTUUID="yyyyy"
UUIDはファイルシステムを変更(フォーマット)すると変更されますが、PARTUUIDは変更されません。fstabにはどちらでも指定が可能となっています。
/etc/fstab
UUID=xxxxx /mnt/usb ntfs-3g defaults,nofail,hide_hid_files,noauto,x-systemd.automount 0 0
書式は、つぎのようになっています。
UUID指定時なら、UUID=、PARTUUID指定時なら PARTUUID=から書き始めます。
dumpはほぼ使われないので0を指定しておけばいいです。
passは fsckがファイルすシステムをチェックする順序を指定します。0はチェックしません。ルートだと1、それ以外は2を指定します。
オプション値の概略は次の通りです。
- defaults
rw(読み書き可),suid(SUID 有効),dev(デバイスファイル有効),exec(バイナリ実行可),auto(通常は自動マウント対象),nouser(一般ユーザーは mount/umount 不可、root のみ可),async(非同期書き込み)
- noauto
ブート時に自動マウントしないオプションで、defaultsに含まれる autoを打ち消します。こうすることで x-systemd.automountのアクセス時のマウントを有効しんします。
- hide_hid_files
隠しファイルを表示しない指定です。Windowsに接続するとSystem Volume Information や $RECYCLE.BIN が書き込まれるためそれを非表示にする設定です。それらのファイルは消しても問題ないのですが、接続のたびに復活するので非表示にしておきます。
- nofail
バイスが存在しない場合でも 起動エラーにせず、システムのブートを継続させます。USBが取り外されていることもあるという想定上のオプションです。
自動アンマウント
筆者の環境では、一日に一回バックアップをUSBディスクへ書き出す設計としています。なので、使わない時はアンマウントしておきたいです。今度はその設定をします。
fstabのoptionを追加するだけで実現できます。
先の例だと300秒アイドルが続いた際にアンマウントされます。
本当はこれだけなのですが、先ほどのx-systemd.automountも含め背後ではどのような動きをしているか知るのに役立つとおもいますので、systemd系からの設定方法を書き残します。
fstabの設定で、x-systemd.automountを設定したことで、mnt-[マウントポイント名].mount と mnt-[マウントポイント名].automount のユニットができます。
このユニットが実質のマウントを管理していて、マウントポイントが /mnt/usb だったら、ユニット名はそれぞれ mnt-usb.automount、mnt-usb.mount となります。
自動アマウント時の設定をしたいので今編集の対象は mnt-usb.automount となります。
.automountや.mountはマウントはユニットです。このようなユニットの仲間には .serviceユニットや複数のユニットがまとめられた .target がよく見られますが、他にはソケットアクセスに対して反応する .socket ユニットや、ファイル監視用の .path などもあります。
mnt-[マウントポイント名].automount は自動で作られるユニットの為、直接編集しても上書きされてしまうことがあります。
そのため、systemctl edit mnt-[マウントポイント名].automount とします。ここから編集することで、通常の設定に差し込みを行うことができます。
systemctl edit
### Editing /etc/systemd/system/mnt-usb.automount.d/override.conf ### Anything between here and the comment below will become the new contents of the file # 表記されているように間に追加分の設定を書き込みます [Automount] TimeoutIdleSec=300s ### Lines below this comment will be discarded # これ以下には自動生成されたユニットの仕様が書かれています
設定後 systemctl daemon-reload の後マウントし直すか、システムを再起動します。
ちゃんとアンマウントが実行されているかは、サービスの時と同様に journalctlから確認ができます。
ただ、-uオプションに指定するユニット名は .automountではなくて、.mountの方を指定しないとアンマウント時のログは出てこないようです。
#journalctl -u mnt-usb.mount systemd[1]: Mounted mnt-usb.mount - /mnt/usb. Unmounting mnt-usb.mount - /mnt/usb ... Unmounting /dev/sdb1 mnt-usb.mount: Deactivated successfully. Unmounted mnt-usb.mount - /mnt/usb.
systemctl editは元のサービスファイルを編集しないため、破棄したい時は単純に削除するだけで元に戻せます。
editで記述際の編集データは、/etc/systemd/system/mnt-[マウントポイント名].d/override.confに入っっています(編集時にも所在がコメントで表示されています)。ですのでこれを消します。
# rm /etc/systemd/system/mnt-usb.mount.d/override.conf # systemctl daemol-reload