Raspberry Pi 4B +バックアップイメージとバッチ書き込み
オリジナル:https://www.cooooder.com/archives/20200114
この記事を書く前に、自分でいくつかのオープンソーススクリプトを見つけましたが、実際のパラメーターがスクリプト設定と一致せず、実行に失敗したためである可能性があるため、コマンドを段階的に調整し、同じ問題について、以下の手順を1つずつ実行して、いくつかの複雑なコマンドを説明し、それに応じてマークを付けてください。SDカードのバックアップミラーリングも正常に実装できると思います。
0.準備
周囲
- ラズベリーパイ4B +
- Raspberry Pi SDカード(Raspbianバスターシステムとともにインストール)
- SDカードリーダー
- UbuntuPC環境
- VMware仮想マシン(Ubuntuデスクトップオペレーティングシステムをインストール)
準備ができました
- VMwareのインストール、Ubuntuのインストールプロセスを省略します
- SDカードをカードリーダーに挿入し、コンピューターのUSBインターフェイスを挿入します
- SDカードをマウントすると、一般的な仮想マシンが自動的に認識してマウントします
- SDカードが自動的にマウントされない場合は、手動でマウントできます。[仮想マシン]> [リムーバブルデバイス]> [接続]を選択します。
- 正常にマウントすると、2つのフォルダが表示されます
リソース
- VMware Workstation 15 Pro中国語版抽出コード:t1ip
- ubuntu-20.04.1-desktop-amd64.iso抽出コード:mj7k
すべての準備が整いました。バックアップを開始してください
1.必要なツールをインストールします
partedは、ハードディスクのパーティション分割またはパーティションのサイズ変更のためのツールです
sudo apt-get install -y dosfstools dump parted kpartx
2.作業ディレクトリを作成します
mkdir ~/backupimg
cd ~/backupimg
3. Uidとgidは、システムの現在のユーザー名に従って決定されます
uid=edward
gid=edward
4.作成されたイメージIMGのサイズを決定します
ここで画像のサイズを見積もります(1.2G + 53M)。安全上の理由から、1.5G(1600M)の空白の画像IMGファイルを作成します。
# 查看SD卡已用空间大小,从而确定待备份的镜像IMG大小
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/sdb1 253M 53M 200M 21% /media/edward/boot
# /dev/sdb2 15G 1.2G 13G 9% /media/edward/rootfs
5.空白の画像IMGを作成します
# 大小1600M
sudo dd if=/dev/zero of=raspberrypi.img bs=1M count=1600
6.画像サイズを確認します
画像ファイルのサイズを確認します。512バイトの整数倍である必要があります。そうでない場合は、手順5の操作でエラーになります。
ls -l raspberrypi.img
# -rw-r--r-- 1 root root 1677721600 Jan 13 19:29 raspberrypi.img
# 1677721600 = 1024 * 1024 * 1600
7.パーティションテーブルを表示します
イメージファイルは、bootfsおよびrootfsとしてパーティション分割する必要があります(bootfsはFAT32タイプで、rootfsはext4タイプです)
# 执行sudo fdisk -l ,查看分区表,确定bootfs扇区的起始,获取三个后面需要用到的参数值:8192,532479,532480
sudo fdisk -l
# Device Start End Sectors Size Type
# /dev/sdb1 8192 532479 524288 256M W95 FAT32(LBA)
# /dev/sdb2 532480 31116287 30583808 14.6G Linux
8.ファイルパーティションをミラーリングします
# mklabel msdos:定义分区表格式,msdos不支持2TB以上容量的磁盘,大于2TB的磁盘选gpt分区表格式
# mkpart primary start end:primary指分区类型为主分区
# 这里的值需要手动执行步骤7,来设定
sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 532479s
sudo parted raspberrypi.img --script -- mkpart primary ext4 532480s -1
9.パーティションが成功したかどうかを確認します
sudo parted raspberrypi.img
# 在(parted)后面输入print free
# Number Start End Size Type File system Flags
# 16.4kB 4194kB 4178kB Free Space
# 1 4194kB 273MB 268MB primary lba
# 2 273MB 1677MB 1404MB primary
# 1677MB 1678MB 1049kB Free Space
# 输入quit退出
10. IMGファイルをミラーリングし、ループデバイスを関連付けます
イメージファイルをシステムにマウントするには、ループデバイスを使用してファイルをシステムにマウントする必要があります
sudo losetup -f --show raspberrypi.img
# 注意这里的输出 /dev/loop6
# 这里包括后面的loop6根据上一步命令获取,实际使用要根据实际获取的值进行替换
sudo kpartx -va /dev/loop6
# 查询挂载位置
ls /dev/mapper/loop6p*
# /dev/mapper/loop6p1 /dev/mapper/loop6p2
# loop6p1对应的是img文件分区上的 /boot,loop6p2对应的是 /root
11.ミラーIMG形式
sudo mkfs.vfat -n boot /dev/mapper/loop6p1
sudo mkfs.ext4 -L rootfs /dev/mapper/loop6p2
12.ループデバイスをシステムにマウントします
mkdir tgt_boot tgt_Root
sudo mount -t vfat -o uid=${uid},gid=${gid},umask=0000 /dev/mapper/loop6p1 ./tgt_boot/
sudo mount -t ext4 /dev/mapper/loop6p2 ./tgt_Root/
13.バックアップ:バックアップブート
sudo cp -rfp /media/${uid}/boot/* ./tgt_boot/
14.バックアップ:バックアップルート
# 设置权限,并把文件夹清空
sudo chmod 777 tgt_Root
sudo chown ${uid}.${uid} tgt_Root
sudo rm -rf ./tgt_Root/*
cd tgt_Root/
sudo dump -0uaf - /media/${uid}/rootfs/ | sudo restore -rf -
# 注意!注意!
cd ../
15.PARTUUIDを表示する
# Raspbian启动要对应分区的PARTUUID
# 镜像文件对应的loop device的两个分区的PARTUUID
sudo blkid
# /dev/mapper/loop6p1: SEC_TYPE="msdos" LABEL_FATBOOT="boot" LABEL="boot" UUID="ED9A-5B01" TYPE="vfat" PARTUUID="816d8bf0-01"
# /dev/mapper/loop6p2: LABEL="rootfs" UUID="88f021e9-d2bc-4a0b-b8f2-778d8adbc76a" TYPE="ext4" PARTUUID="816d8bf0-02"
# boot对应816d8bf0-01,root对应816d8bf0-02
# 被替换的PARTUUID
opartuuidb=`sudo blkid -o export /dev/sdb1 | grep PARTUUID`
opartuuidr=`sudo blkid -o export /dev/sdb2 | grep PARTUUID`
# 用于替换的PARTUUID
npartuuidb=`sudo blkid -o export /dev/mapper/loop6p1 | grep PARTUUID`
npartuuidr=`sudo blkid -o export /dev/mapper/loop6p2 | grep PARTUUID`
16.Modify./tgt_boot/cmdline.txt
# 用 $npartuuidr 替换 $opartuuidr => PARTUUID=816d8bf0-02 替换 PARTUUID=738a4d67-02
sudo sed -i "s/${opartuuidr}/${npartuuidr}/g" ~/backupimg/tgt_boot/cmdline.txt
17.変更します。/tgt_Root/etc/fstab
sudo sed -i "s/${opartuuidb}/${npartuuidb}/g" ~/backupimg/tgt_Root/etc/fstab
sudo sed -i "s/${opartuuidr}/${npartuuidr}/g" ~/backupimg/tgt_Root/etc/fstab
18.パーティションのマウントを解除します
sudo umount tgt_boot tgt_Root
sudo kpartx -d /dev/loop6
sudo losetup -d /dev/loop6
rmdir tgt_boot tgt_Root
19.画像を書き込む
組み込みの画像書き込みツールを使用してRaspberryPi Imagerを書き込むRaspberryPiは、raspberrypi.imgをSDカードに書き込みます。
20.ルートパーティションを拡張します
SDカードをRaspberryPiに挿入して起動し、df -hを実行してディスク容量を確認すると、合計サイズがわずか1.5Gであることがわかります。構成するには、sudoraspi-configコマンドを実行する必要があります。詳細オプション= > [ファイルシステム]を展開し、ルートパーティションをSDカード全体に展開します。
sudo raspi-config
21.再起動してRaspberryPiを再起動し、有効にします
reboot
参照: