ottijp blog

Linuxの外付け暗号化HDDにMacのTime Machineでバックアップを取る方法

  • 2023-11-11

モチベーション

部屋のmac miniに接続しているHDDにTime Machineでバックアップを取っているのですが, HDDの音がうるさいので,別室にあるLinuxにHDDにリモートでバックアップを行うようにしてみました.

構成

diagram

macの内蔵SSDを,Wi-Fiルータ経由で接続するLinuxマシンの外付けHDDにTime Machineでバックアップします. バックアップ先のHDDはディスク暗号化します.

環境

Linuxマシン

  • ThinkPad E450
  • OS: Mint Linux 20.3 (Una)
  • cryptsetup: 2.2.2
  • smbd: 4.15.13-Ubuntu

mac

  • Mac mini 2023 (Apple M2 Pro)
  • OS: macOS 13.5 (Ventura)

手順

(実行例・設定例ではUSBメモリを使ったので,実際にTime Machine用に作ったディスクとは容量が異なります.)

外付けHDDの暗号化・初期化

cryptsetupを使い,Thinkpadに接続したHDDをLUKSで暗号化します. LUKSはdm-cryptを使ったディスク暗号化を行うオープンな仕様とのことです(よくわかっていない).

# ディスクの暗号化
sudo cryptsetup luksFormat $YOUR_PHYSICAL_DEVICE_FILE

# 暗号化ディスクをアンロックする
sudo cryptsetup open $YOUR_PHYSICAL_DEVICE_FILE $YOUR_CRYPT_NAME

暗号化ディスクがアンロックされると,/dev/mapper/$YOUR_CRYPT_NAMEというファイルが作成されます. このファイルは通常の(非暗号化)ディスクのブロックデバイスと同じように扱えます.

実行例(/dev/sdbを暗号化し,samplecryptという名前でアンロックする)
$ sudo cryptsetup luksFormat /dev/sdb
WARNING: Device /dev/sdb already contains a 'gpt' partition signature.

WARNING!
========
This will overwrite data on /dev/sdb irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/sdb:
Verify passphrase:

$ sudo cryptsetup open /dev/sdb samplecrypt
Enter passphrase for /dev/sdb:

$ ls -l /dev/mapper/samplecrypt
lrwxrwxrwx 1 root root 7 Nov 10 08:00 /dev/mapper/samplecrypt -> ../dm-6

$ lsblk /dev/sdb
NAME          MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sdb             8:16   1  7.5G  0 disk
└─samplecrypt 253:6    0  7.5G  0 crypt

$ sudo parted -s /dev/mapper/samplecrypt print
Error: /dev/mapper/samplecrypt: unrecognised disk label
Model: Linux device-mapper (crypt) (dm)
Disk /dev/mapper/samplecrypt: 8059MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

LVM論理ボリュームの作成

次に,暗号化ディスク上にLVMで論理ボリュームを作成します.

# 物理ボリュームの作成
sudo pvcreate /dev/mapper/$YOUR_CRYPT_NAME

# ボリュームグループの作成
sudo vgcreate $YOUR_LVM_VG_NAME /dev/mapper/$YOUR_CRYPT_NAME

# 論理ボリュームの作成
sudo lvcreate -l 100%FREE $YOUR_LVM_VG_NAME -n $YOUR_LVM_VL_NAME

論理ボリュームが作製されると/dev/mapper/${YOUR_LVM_VG_NAME}-${YOUR_LVM_VL_NAME}というファイルが作成されます.

実行例
$ sudo pvcreate /dev/mapper/samplecrypt
  Physical volume "/dev/mapper/samplecrypt" successfully created.

$ sudo vgcreate samplevg /dev/mapper/samplecrypt
  Volume group "samplevg" successfully created

$ sudo lvcreate -L 0.93132257G samplevg -n first
  Rounding up size to full physical extent 956.00 MiB
  Logical volume "first" created.

$ sudo lvcreate -l 100%FREE samplevg -n second
  Logical volume "second" created.

$ ls -l /dev/mapper/sample*
lrwxrwxrwx 1 root root 7 Nov 10 08:41 /dev/mapper/samplecrypt -> ../dm-6
lrwxrwxrwx 1 root root 7 Nov 10 08:41 /dev/mapper/samplevg-first -> ../dm-7
lrwxrwxrwx 1 root root 7 Nov 10 08:41 /dev/mapper/samplevg-second -> ../dm-8

$ lsblk /dev/sdb
NAME                MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sdb                   8:16   1  7.5G  0 disk
└─samplecrypt       253:6    0  7.5G  0 crypt
  ├─samplevg-first  253:7    0  956M  0 lvm
  └─samplevg-second 253:8    0  6.6G  0 lvm

私はTime Machine用とは別のバックアップ用領域も必要だったので,論理ボリュームを2つ作りました. lvcreate -Lで指定するサイズは2進接頭辞ではなく,SI接頭語なので注意してください. この実行例では8GB(と商品に表記されている)のUSBメモリを1GBと7GBに分けるために,1つ目を0.93132257G(1*1000^3/1024^3)と指定しています.

論理ボリュームのフォーマット

ext4でフォーマットしました. バックアップ先ディスクであり,root作業用の予約領域を作る必要がない(フルに一般ユーザが使いたい)ため-m 0としてます.

sudo mkfs.ext4 -m 0 /dev/mapper/${YOUR_LVM_VG_NAME}-${YOUR_LVM_VL_NAME}
実行例
$ sudo mkfs.ext4 -m 0 /dev/mapper/samplevg-first
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 244736 4k blocks and 61184 inodes
Filesystem UUID: 53259d7a-da7d-474e-8a67-93b2ed5922ce
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

$ sudo mkfs.ext4 -m 0 /dev/mapper/samplevg-second
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 1722368 4k blocks and 430784 inodes
Filesystem UUID: 5d7200a8-7e09-4030-85e6-a098056e304c
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

論理ボリュームのマウント

/etc/fstabに以下のような行を追加して,マウントポイントを作ってからマウントします. UUIDはlsblk -o +UUIDなどで確認してください.

/etc/fstab
UUID=$YOUR_LVM_VL_UUID $YOUR_MOUNT_POINT ext4 defaults,user,user_xattr,acl 0 0
# マウントポイントの作成
sudo mkdir -p $YOUR_MOUNT_POINT

# マウント
mount $YOUR_MOUNT_POINT

# Time Machine用のディスクとしてリモートからアクセスする際に一般ユーザでログインするため,root以外の書き込みを許可する
sudo chmod og+w $YOUR_MOUNT_POINT
実行例
$ grep sample /etc/fstab
UUID=53259d7a-da7d-474e-8a67-93b2ed5922ce /media/sample-tm ext4 defaults,user,user_xattr,acl 0 0

$ sudo mkdir -p /media/sample-tm

$ mount /media/sample-tm

$ sudo chmod og+w /media/sample-tm

$ df --si | grep sample
/dev/mapper/samplevg-first  968M   25k  901M   1% /media/sample-tm

sambaの設定

macからTime Machineのターゲットとして指定できるように,/etc/samba/smb.confを以下のように編集してsmbdを再起動します.

設定例
--- /usr/share/samba/smb.conf   2023-10-12 02:30:13.000000000 +0900
+++ /etc/samba/smb.conf 2023-11-10 21:00:00.927073334 +0900
@@ -97,7 +97,7 @@

 # This option controls how unsuccessful authentication attempts are mapped
 # to anonymous connections
-   map to guest = bad user
+   map to guest = Never

 ########## Domains ###########

@@ -167,6 +167,11 @@
 # public shares, not just authenticated ones
    usershare allow guests = yes

+   guest ok = no
+   fruit:encoding = native
+   fruit:metadata = netatalk
+   vfs objects = catia fruit streams_xattr
+
 #======================= Share Definitions =======================

 # Un-comment the following (and tweak the other settings below to suit)
@@ -240,3 +245,16 @@
 # to the drivers directory for these users to have write rights in it
 ;   write list = root, @lpadmin

+[timemachine]
+   comment = TimeMachine
+   path = /media/sample-tm
+   writable = Yes
+   browsable = Yes
+   fruit:time machine = Yes
+   fruit:time machine max size = 1G
$ sudo systemctl restart smbd

macでTime Machineの設定

Time Machineの設定において,Linuxで共有しているディスクをバックアップ先として選択します. これでLinuxにTime Machineバックアップが作られるようになりました.

Finder等で事前にLinuxの共有ディレクトリにログインしていなくても,Time Machine設定時に入力するログイン情報が自動で使われます.

暗号化ディスクのロック

以下のようにディスクをロックします. 作業前にmacからの接続を切っておく必要があります.

# アンマウント
umount $YOUR_MOUNT_POINT

# LVMボリュームグループの非アクティブ化
sudo vgchange -a n $YOUR_LVM_VG_NAME

# ロック
sudo cryptsetup close $YOUR_CRYPT_NAME

ロックすると/dev/mapper/$YOUR_CRYPT_NAMEファイルはなくなります.

実行例
$ umount /media/sample-tm

$ sudo vgchange -a n samplevg
  0 logical volume(s) in volume group "samplevg" now active

$ sudo cryptsetup close samplecrypt

$ ls /dev/mapper/sample*
zsh: no matches found: /dev/mapper/sample*

$ lsblk /dev/sdb
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb    8:16   1  7.5G  0 disk

暗号化ディスクのマウント・アンマウント用スクリプト

TPMの搭載されていないマシンですし,暗号化ディスクのマウントは手動でやりたかったので,次のようなスクリプトを作りました.

mount-tm-disk.sh
device=/dev/sdb
cryptname=samplecrypt
mountdir=/media/sample-tm

# ディスクのアンロック
if ! sudo cryptsetup status $cryptname >/dev/null 2>&1; then
  sudo cryptsetup open $device $cryptname
fi

# マウント
if ! mountpoint $mountdir >/dev/null 2>&1; then
  mount $mountdir
fi
umount-tm-disk.sh
device=/dev/sdb
cryptname=samplecrypt
vgname=samplevg
mountdir=/media/sample-tm

# アンマウント
if mountpoint $mountdir >/dev/null 2>&1; then
  umount $mountdir
fi

# LVMボリュームグループの非アクティブ化
if sudo vgs $vgname >/dev/null 2>&1; then
  sudo vgchange -a n $vgname
fi

# ディスクのロック
if sudo cryptsetup status $cryptname >/dev/null 2>&1; then
  sudo cryptsetup close $cryptname
fi

refs


ottijp
都内でアプリケーションエンジニアをしています
© 2024, ottijp