(1) exfatとdumpのインストール
WindowでもMacでも書き込めるexFATが使えるようにして、Raspbianのフルバックアップ用にdumpをインストールする。 FATについては、『FAT32、FAT16、NTFS、exFATとは何ですか。』 http://faq.buffalo.jp/app/answers/detail/a_id/1079 を参照。
# apt-get install exfat-fuse ( apt-get install exfat-utils ) #exfat-fuseで同時にインストールされる # apt-get install dump #restoreコマンドもインストールされる
(2) USBメモリの区画作成
USBメモリなら何でもよいと思われるが、ここではSanDisk SDDD2-016Gをラズパイに挿す。
% lsusb | head -1 Bus 001 Device 004: ID 0781:5590 SanDisk Corp. #USBメモリ認識 # 区画の状態を調べる # コマンドとしては fdisk,cfdisk,sfdisk,parted,gpartedなどがある # fdisk -l /dev/sda Disk /dev/sda: 14.3 GiB, 15376000000 bytes, 30031250 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: dos Disk identifier: 0x00000000 Device Boot Start End Sectors Size Id Type /dev/sda1 32 30031249 30031218 14.3G c W95 FAT32 (LBA)Idはcなので、W95 FAT32 (LBA) のフォーマットであるが、これを、
Idが7の、HPFS/NTFS/exFAT の フォーマットに切り直す。さらに
領域の半分は、Type Id 83 の Linuxフォーマットにする。
セクタ数30031218の半分は、
echo "(30031250-2048) / 2" | bc
の15014601 である。
# フォーマットの切り直し # fdisk /dev/sda Device Boot Start End Sectors Size Id Type /dev/sda1 32 30031249 30031218 14.3G c W95 FAT32 (LBA) Command (m for help): d 1 Selected partition 1 Partition 1 has been deleted. # 区画1が削除された Command (m for help): n # 1つ目の新しい区画を作る Partition type Select (default p): p #区画の種類はprimary Partition number (1-4, default 1): 1 First sector (2048-30031249, default 2048):ENTERで2048 Last sector, +sectors or +size{K,M,G,T,P} (2048-30031249, default 30031249): +15014601 Created a new partition 1 of type 'Linux' and of size 7.2 GiB. Command (m for help): n # 2つ目の新しい区画を作る Partition type Select (default p): p #区画の種類はprimary Partition number (2-4, default 2):ENTERで2 First sector (15015936-30031249, default 15015936):ENTERで15015936 Last sector, +sectors or +size{K,M,G,T,P} (15015936-30031249, default 30031249): ENTERで30031249になりお尻は (0-30031249)0オリジン開始。 Created a new partition 2 of type 'Linux' and of size 7.2 GiB. Command (m for help): p #できた区画をみる Disk /dev/sda: 14.3 GiB, 15376000000 bytes, 30031250 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: dos Disk identifier: 0x00000000 Device Boot Start End Sectors Size Id Type /dev/sda1 2048 15015935 15013888 7.2G 83 Linux /dev/sda2 15015936 30031249 15015314 7.2G 83 Linux #セクター数はheads/cylindersで丸められるので、ドンピシャな同じ区画サイズにならない #セクター数15015314-15013888=1426のサイズ差となった Command (m for help): t #フォーマットタイプを変更 Partition number (1,2, default 2): 1 #対象の区画は1番目 Hex code (type L to list all codes): L #Id番号のリスト 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT f W95 Ext’d (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary 16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT 1e Hidden W95 FAT1 80 Old Minix Hex code (type L to list all codes): 7 #7 HPFS/NTFS/exFAT を選択 Changed type of partition 'Linux' to 'HPFS/NTFS/exFAT'. #あるいは、 Hex code (type L to list all codes): c #c W95 FAT32 (LBA) を選択 Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'. Command (m for help): p #変更した区画をみる Disk /dev/sda: 14.3 GiB, 15376000000 bytes, 30031250 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: dos Disk identifier: 0x00000000 Device Boot Start End Sectors Size Id Type /dev/sda1 2048 15015935 15013888 7.2G 7 HPFS/NTFS/exFAT /dev/sda2 15015936 30031249 15015314 7.2G 83 Linux Command (m for help): w #変更を書き込む The partition table has been altered. Calling ioctl() to re-read partition table. Re-reading the partition table failed.: Device or resource busy The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8). # リブートで反映されるとあるので # reboot するか、USBメモリを抜いて、別なUSBポートに指し直す。 # partprobe がエラーにならなければOKだろう # partprobe -s /dev/sda: msdos partitions 1 2 /dev/mmcblk0: msdos partitions 1 2区画ができたならば、つぎにフォーマットする
# mkfs.exfat -n exFAT_7G /dev/sda1 mkexfatfs 1.1.0 Creating... done. Flushing... done. File system created successfully. もしくは、 # mkfs.vfat -v -F 32 -n FAT32_7G /dev/sda1 /dev/sda1 has 64 heads and 32 sectors per track, (略) Volume ID is 980b59c3, volume label FAT32_7G . 必要ならオプション追加 -c:不良ブロックの検査を行う # mkfs.ext4 -j -L ext4_7G /dev/sda2 mke2fs 1.43.3 (04-Sep-2016) Creating filesystem with 1876914 4k blocks and 469568 inodes Filesystem UUID: fb6e48ef-b51c-44d1-b817-71677adac421 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フォーマットのあとマウントする
# mkdir -p /dsk/sda1; mkdir /dsk/sda2 #マウントポイント # mount -v /dev/sda1 /dsk/sda1 FUSE exfat 1.1.0 # mount -v /dev/sda2 /dsk/sda2 mount: /dev/sda2 mounted on /dsk/sda2. Raspbianがデスクトップ版の場合は、オートマウントされるようだ。 /dev/sda1 7506944 3872 7503072 1% /media/pi/exFAT_7G /dev/sda2 7324192 33004 6899424 1% /media/pi/ext4_7G マウントポイントはラベル名が使用される。 # mount|grep dsk #マウントの状態 /dev/sda2 on /dsk/sda2 type ext4 (rw,relatime,data=ordered) /dev/sda1 on /dsk/sda1 type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,blksize=4096) # df -H|egrep 'Used|dsk' #マウントの使用状況 Filesystem Size Used Avail Use% Mounted on /dev/sda2 7.5G 34M 7.1G 1% /dsk/sda2 /dev/sda1 7.7G 1.3M 7.7G 1% /dsk/sda1 # 取り外す前にはアンマウントする # umount /dsk/sda1 # umount /dsk/sda2
(3) ext4区画のバックアップ
Raspbianのroot区画をフルバックアップする方法を示す。
以下の b_mmcblk0_local.sh スクリプトを/usr/local/bin/に置く。
</usr/local/bin/b_mmcblk0_local.sh> #! /bin/bash # $Id: b_mmcblk0_local.sh,v 1.1 2017-08-01 10:19:56+09 tsubota $ # SEND_ADDR="MY_GMAIL@gmail.com" FROM_ADDR="MY_GMAIL@gmail.com" LogMailSend() { MDHM=`date '+%Y/%m/%d(%a) %H:%M:%S'` SUBJECT=$1 MESS=$2 logline=`echo $MDHM; echo $MESS` (echo "Mime-Version: 1.0"; echo "Content-Type: Text/Plain; charset=iso-2022-jp"; echo "Content-Transfer-Encoding: 7bit"; echo "Subject: $SUBJECT"; echo "To: ${SEND_ADDR}"; echo "From: ${FROM_ADDR}"; echo ""; echo "$DT" ; echo "from `hostname`"; echo "${MYCMD} Running LOG."; echo ${logline}|nkf -j) | /usr/sbin/exim4 -f ${FROM_ADDR} ${SEND_ADDR} } ExecMailSend() { MDHM=`date '+%Y/%m/%d(%a) %H:%M:%S'` SUBJECT=$1 LISTFILE=$2 LOGFILE="`pwd`/$LISTFILE" (echo "Mime-Version: 1.0"; echo "Content-Type: Text/Plain; charset=iso-2022-jp"; echo "Content-Transfer-Encoding: 7bit"; echo "Subject: $SUBJECT"; echo "To: ${SEND_ADDR}"; echo "From: ${FROM_ADDR}"; echo ""; echo "$DT" ; echo "from `hostname`"; echo "${MYCMD} Running LOG."; echo "LISTFILE=$LOGFILE"; nkf -j $LISTFILE) | /usr/sbin/exim4 -f ${FROM_ADDR} ${SEND_ADDR} } HDEV=mmcblk0p2 if [ `whoami` != "root" ]; then ERRMSG="User not root." echo $ERRMSG logger $ERRMSG exit 1 fi MYCMD=$0 MYNM=`basename $0` BODY=${MYNM%.sh} RDIR=/dsk/sda2/Backup/rapi4/RootBz if [ ! -d ${RDIR} ]; then ERRMSG="Not Mounted $RDIR." echo $ERRMSG LogMailSend "$MYNM FAIL1" "$ERRMSG" logger $ERRMSG exit 1 fi cd $RDIR if [ $? != 0 ]; then ERRMSG="CANNOT cd $RDIR." echo $ERRMSG logger $ERRMSG LogMailSend "$MYNM FAIL2" "$ERRMSG" exit 1 fi YMD=`date "+%Y_%m%d"` BDIR=${BODY}_${YMD} if [ ! -d ${BDIR} ]; then mkdir -p ${BDIR} if [ $? != 0 ]; then ERRMSG="Cannot mkdir $BDIR." echo $ERRMSG logger $ERRMSG exit 1 fi fi CLOG="${BDIR}/${HDEV}_${YMD}.log" echo "START=`date`" | tee $CLOG echo "----------------------------------------" | tee -a $CLOG echo "% /sbin/fdisk -l /dev/mmcblk0" | tee -a $CLOG /sbin/fdisk -l /dev/mmcblk0 | sed -n -e "/^Disk/,//p" | tee -a $CLOG echo "----------------------------------------" | tee -a $CLOG echo "% df" | tee -a $CLOG df | tee -a $CLOG echo "" | tee -a $CLOG echo "" | tee -a $CLOG echo "****************************************" | tee -a $CLOG date | tee -a $CLOG pwd | tee -a $CLOG set -x (/sbin/dump 0usf 99999 - /dev/${HDEV} | \ bzip2 -c > ${BDIR}/${HDEV}_${YMD}.dump.bz2 ) 2>&1 | tee -a $CLOG date | tee -a $CLOG ls -l ${BDIR} | tee -a $CLOG ls -lh ${BDIR} | tee -a $CLOG md5sum ${BDIR}/${HDEV}_${YMD}.dump.bz2 | tee -a $CLOG set +x echo "****************************************" | tee -a $CLOG echo "END=`date`" | tee -a $CLOG ExecMailSend "$MYNM FINISH." "$CLOG" exit 0 # end of b_mmcblk0_local.shb_mmcblk0_local.shに実行許可を与える。
たとえば、月初めに実行したいのならば、crontabに設定するとよい。
# chmod 755 /usr/local/bin/b_mmcblk0_local.sh # vi /etc/crontab 4 2 1 * * root /usr/local/bin/b_mmcblk0_local.shついたちの2時4分に起動する例。
rootで実行するよりは、/etc/groupの"disk:x:6:"の行にユーザを加えて、 ユーザモードでバックアップするのが、よりよいだろう。
復元は、
展開するディレクトリにcdしたあと、
# bzip2 -dc ABC.bz2 | restore rf - #フルリストア
# bzip2 -dc ABC.bz2 | restore ivf - #会話部分リストア
でできるだろう。
《2017.8.25追記》
restoreで、なんどやってもillegal hardware instruction restore rvf -
になってしまう。
《2017.9.6追記》
mkfs.ext4 のオプションで -L のラベルを付けなければ illegal hardware instruction にならず正常にrestoreできている。
代替えというか別な方法として、raspbianデスクトップ画面から
Raspiアイコン>Accessories>SD Card Copier
を使うことにする。
/dev/mmcblk0のp1とp2の区画をまるごと外部メディアに
バックアップしてくれる。
出力側は、自動で区画切りをしてくれて、cp -axコマンドでコピーする。
出力をUSBメモリでなく、microSDにすると起動メディアにもなる。
SD Card Copierは便利で、コピーも速い。
デスクトップSD Card Copierがないときは、
https://github.com/billw2/rpi-clone
A shell script to clone a running Raspberry Pi SD card to a USB mounted SD card.
# ./rpi-clone -h
usage: rpi-clone sdN {-v|--verbose} {-f|--force-initialize} {-s|--src-disk sdS} {-c|--cross-filesystems} {-x}
-v - list all files as they are copied.
-f - force initialize the destination partitions
-s sdS - specify sdS is the booted source disk to clone from.
Use this if the boot source auto detect from /etc/mtab fails.
Use with caution, be sure sdS is really the booted disk.
-c - cross filesystem boundaries (include mounted drives)
-x - use set -x for very verbose bash shell script debugging
...
Version 1.7.1
にて、コマンドラインから同様にバックアップできそう。