Linux(Debian)でデータをUSBドライブにバックアップ
最近USBドライブの利用が減りLinux(Debian)でマウントする際の書式も忘れがちになってしまいました。
ランサムウェアの脅威に対しローカルバックアップの意味が見直されているので、ここで再度利用方法を書き残しておきます。
USBドライブの認識
USBドライブがLinux(Debian)に認識されるとdmesgに出力されるので、まずはそれを確認します。
USBを差し込んだ後に、管理者権限でdmesgと入力した後に出力されるメッセージから対象の機器のデバイス名(sda,sdb等)を見つけます。
# dmesg
...
[54472.609165] usb 2-1.1: new high-speed USB device number 3 using ehci-pci
[54472.763282] usb 2-1.1: New USB device found, idVendor=04bb, idProduct=016c
[54472.763285] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[54472.763288] usb 2-1.1: Product: I-O DATA HDCZ-UT
[54472.763290] usb 2-1.1: Manufacturer: I-O DATA DEVICE, INC.
[54472.763292] usb 2-1.1: SerialNumber:
[54473.144602] usb-storage 2-1.1:1.0: USB Mass Storage device detected
[54473.144708] scsi host6: usb-storage 2-1.1:1.0
[54473.144815] usbcore: registered new interface driver usb-storage
[54473.162171] usbcore: registered new interface driver uas
[54474.161963] scsi 6:0:0:0: Direct-Access I-O DATA HDCZ-UT 0007 PQ: 0 ANSI: 6
[54474.162906] sd 6:0:0:0: Attached scsi generic sg2 type 0
[54474.168022] sd 6:0:0:0: [sdb] Spinning up disk...
[54480.304603] .
[54480.304888] ready
[54480.461018] sd 6:0:0:0: [sdb] 3907029168 512-byte logical blocks: (2.00 TB/1.82 TiB)
[54480.462136] sd 6:0:0:0: [sdb] Write Protect is off
[54480.462140] sd 6:0:0:0: [sdb] Mode Sense: 43 00 00 00
[54480.463131] sd 6:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[54480.534146] sdb: sdb1 sdb2
[54480.537886] sd 6:0:0:0: [sdb] Attached SCSI disk
[55209.699255] ntfs: driver 2.1.32 [Flags: R/O MODULE].
[55209.766388] ntfs: volume version 3.1.
単に認識しているかどうかを確認したい場合はlsusbコマンドでも可能です。
# lsusb
Bus 002 Device 003: ID 04bb:016c I-O Data Device, Inc.
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
fdisk
マウントする前にパーテーションの状態を確認します。先の出力では「sdb: sdb1 sdb2」となっていました。USBドライブなのでひとつの巨大なパーテーションのつもりでしたが、1と2どちらをマウントすべきなのかわかりません。
それを確認するために、ここではfdiskを使いました。
fdiskはディスクのパーテーションを設定するツールです。誤った操作をすると最悪ディスクの中身が読み込めなくなったりしますので注意してください。
使い方はまず、デバイス名を指定してコマンドを実行します。
するとコンソールがfdiskの対話画面に切り替わり、コマンドを入力して該当のデバイスのパーテーション操作をします。
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help):
表示されている通り、「m」と一文字入力すると、利用可能なコマンドが表示されます。
パーテーションの確認で使う場合は、pを入力します。あと使うのはパーテーション種類を表示してくれる「l」と終了の「q」ぐらいでしょうか。
Command (m for help): p
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 171F29A5-A16A-41B3-97AC-36F31A9E631C
Device Start End Sectors Size Type
/dev/sdb1 34 262177 262144 128M Microsoft reserved
/dev/sdb2 264192 3907028063 3906763872 1.8T Microsoft basic data
sdb1は「Micorosft reserved」パーテーションがsdb1にあることがわかりました。
この領域は機器の都合で存在するのだと思いますが、とにかくsdb2を使えばよさそうだということがわかりました。
マウント
パーテーションをマウントします。
/mnt/usb等、マウントポジションとなるディレクトリを作成しそこにマウントします。
アンマウントするにはumountを使います。
# mount /dev/sdb2 /mnt/usb
...
# umount /mnt/usb
ディレクトリのサイズを確認
バックアップを取る際にディレクトリのサイズを確認したいことがあると思います。その際はduコマンドを使います。
「du ディレクトリ」で、指定したディレクトリサイズを子孫ディレクトリを含めて出力します。
もし、子孫ディレクトリまで調べる必要がないならdオプションで深さを指定できます。またhオプションを使うとMやGといったヒューマンフレンドリーな表示になります。
# du /home/user -d 1 -h
26G /home/user/scripts
15G /home/user/share
20K /home/user/.ssh
7.8G /home/user/compressdir
24K /home/user/.java
30G /home/user/bkup
...
184G /home/user
rsync
rsyncはリモートやローカルのファイルを高速にコピーするためのツールです。
オプションは多数あり、詳細はman rsyncでも表示されますので確認してください。筆者がよく使っているパターンは次の通りです。
rsync -av --delete --force [コピー元] [コピー先] >>log 2>&1
それぞれの意味を簡単に書いておきます。
- a(Arcive)
aはアーカイブモードを意味しこれは「-rlptgoD」の略です。圧縮という意味ではありません。
- r(Recursive)
子孫フォルダをたどります
- l(Link)
リンクもコピーします
- p(Permissions)
パーミッションを保持します
- t(Times)
最終更新日を保持します
- g(Group)
グループを保持します
- o(Owner)
オーナーを保持します。このオプションは管理者権限が必要です。
- D
デバイスファイルをコピーする--devices(管理者権限が必要です)と特殊ファイルをコピーする--spcecialsの組み合わせです
- v(Verbose)
明細ログ出力をします。ここではリダイレクト(&&)でファイルに保存しています。
リダイレクトの部分の「2>&1」の部分はエラー出力を、標準出力にする設定です。要するに通常ログもエラーログもまとめてファイルに出力しています。
- --delete
バックアップ先に余分なファイルが存在したら削除します
- --force
空ではないディレクトリも削除します
bashスクリプト
常時運用のためにbashスクリプトを作成してみました。
#!/bin/bash
# バックアップ作成
# USBディスクのパーテーション
DIV_STR=/dev/sdb2
# マウントポジション
MOUNT_DIR=/mnt/usb
# バックアップルートフォルダ名
TARGET_DIR=backup
# マウント
# マウント状況確認 最後に/が必要
mountpoint ${MOUNT_DIR}/ >$0.log 2>&1
if [ $? -gt 0 ]; then
# マウントしていない場合はマウント
mount ${DIV_STR} ${MOUNT_DIR} >>$0.log 2>&1
if [ $? -gt 0 ]; then
# マウントエラー
exit
fi
fi
if [ ! -d ${MOUNT_DIR}/${TARGET_DIR} ]; then
# ディレクトリがなければ作成
mkdir ${MOUNT_DIR}/${TARGET_DIR}
if [ $? -gt 0 ]; then
# 作成エラー
exit
fi
fi
rsync -av --delete --force /home/user/sourcedir/ ${MOUNT_DIR}/${TARGET_DIR}/targetdir/ >>$0.log 2>&1
# マウント解除
umount ${DIV_STR} >>$0.log 2>&1
エラー
先のスクリプトを実行したところ、dmsegでは書き込みできるようなメッセージが出ていたの思うのですが、次のようなエラーが出ました。
Why does my NTFS partition mount as read only?によればntfsを書き込みできるライブラリが存在していないのではないか?とのことでした。
確認してみたらいう通り存在しないようだったので、参考ページにあったntfs-3gをaptでインストールします。
今度はワーニングがでました。ファームウェアがないそうです。
W: Possible missing firmware /lib/firmware/tigon/tg3_tso5.bin for module tg3 W: Possible missing firmware /lib/firmware/tigon/tg3_tso.bin for module tg3 W: Possible missing firmware /lib/firmware/tigon/tg3.bin for module tg3
/etc/apt/sources.listにcontribとnon-freeを追記します。これらがどのような設定かというのは「Debian9(strech)から10(buster)へアップグレード」の記事で紹介していますので、気になったらそちらも参考にしてみてください。
再びapt updateを実行します。該当のファームウェアはfirmware-misc-nonfreeに含まれるようなので、installします。
これでスクリプトが実行できるようになりました。