u盘安装linux 提示no such device_树莓派学习笔记2-U盘挂载和系统备份
上一次我們說到系統配置的一些工作,在那些工作完成之后我突然想到之前從來沒有做過的一個工作:系統備份。這一次我們就研究一下系統備份是怎么做的。
系統備份其實很簡單,你總是可以把樹莓派上的SD卡拔下來,在電腦上用Win32DiskImager來備份,但是這樣備份出來的文件會和SD卡容量一樣大,這種備份方法不可持續。那么參考網上的使用linux下的dd指令來完成這個工作。
我看了一下,在使用linux電腦備份的時候是把樹莓派的卡插到電腦上,然后用dd把SD卡內容拷貝到本地。我手上只有樹莓派作為linux電腦,那就先用我的4B測試一下,看看效果。
樹莓派4B害怕樹莓派上空間不夠,先掛個U盤備份到U盤里試試。一只沒弄明白U盤是怎么掛載的,借此機會研究一下。
掛載U盤
U盤直接插上是讀不了內容的,所以必須要使用mount指令進行掛載。雖然mount天然支持FAT文件系統,然而FAT有個文件尺寸上限,不是很好。因此考慮使用exFAT文件系統。安裝新的工具包來使mount支持exFAT。
sudo apt install exfat-fuse好下一步將我的U盤格式化為exFAT格式,在里面放一個文件以備后續測試。
把U盤插到樹莓派上。
忘了U盤是不是支持USB3.0使用上一次學的指令查看USB設備。
奇怪,U盤是16GB的,為什么這里顯示是64GB?問題不大,下一步查看一下/dev下的設備。這里目錄下的sd表示存儲設備,sda表示第一個存儲設備,sdb表示第二個,以此類推。sda1就表示這個設備的第一個分區,sda2表示第二個分區,以此類推。
可以看到已經連接上了,我的U盤沒有分區所以只有一個sda1。
下面創建掛載點,一般在/mnt或者/media目錄下創建掛載點。 我現在沒有掛載東西所以這倆目錄底下都是空的。這里我就在mnt下掛載了。注意指令里面的uid和gid是權限設置,后面是你的用戶名。
sudo mkdir /mnt/backup_flash sudo mount -o uid=pi,gid=pi /dev/sda1 /mnt/backup_flash掛載成功了,下面看一下我放在U盤里的文件都有啥。
我在電腦上整文件的時候沒有搞換行,導致這么一個效果,整體來看沒啥問題。
嘗試修改這個文件,然后取消掛載,再到電腦上看看。
成功。
習得新指令:mount和umount
功能:掛載和卸載移動存儲設備
系統備份1
我現在想備份的系統正在樹莓派上跑著,沒法搞,現在先用另一個有系統的sd卡測試一下備份功能。
閃迪打錢(霧)還是查看一下設備
注意到Device 006和/dev下的sdb系列。在燒錄系統得時候sd卡被分成了兩個分區,所以這里有sdb1和sdb2。
可以使用df -h指令來查看掛載情況。
這里由于sdb沒有掛載,所以這里沒有顯示。使用上面的指令進行掛載。
注意這里的區別。燒錄到sd卡后較大的分區是ext4文件系統,掛載的時候要強調這個。另外由于系統燒錄后所屬權限是root,所以這里的uid和gid設置要去掉,否則掛載會不成功。
掛載成功,下一步進行備份測試。
sudo dd if=/dev/sdb of=/mnt/backup_flash/RPi_backup_64GB_test.img bs=4M使用dd指令進行拷貝,拷貝到U盤下的RPi_backup_64GB_test.img下。注意:這里的if表示輸入文件(input file),of表示輸出文件(output file),bs表示分包大小(bag size?)。如果想查看進度可以新建一個終端并輸入如下執行查看進度。
sudo pkill -USR1 -n -x dd到這一步可能按道理就應該完成了,但實際上并不是這樣。經過漫長的等待(半個小時),終于拷貝完成的時候,系統提示空間不足,備份失敗。
這和我想象的不太一樣啊,又查閱了更多的資料后發現直接對SD卡使用dd指令的結果和在windows上用Win32DiskImager的結果是一樣的:鏡像文件和SD卡一樣大。
此路不通,換道。
習得新指令:dd
功能:文件拷貝和創建
系統備份2
試錯之后發現了新的方法,這個方法需要更多的工具,也更復雜,但網上有人寫好了腳本我可以直接使用。與直接使用dd拷貝SD卡不同,這里我們要先使用dd創建一個合適尺寸的鏡像文件,然后將這個鏡像文件劃分為兩個分區, root區為FAT32文件系統,Linux區為ext4文件系統。分區完成后需要把這個鏡像文件作為虛擬磁盤掛載,掛載完成以后就可以進行格式化。此后就可以進行備份了。
工具準備
這個方法里面需要三個工具:
- dosfstools:fat32分區格式化工具
- dump:dump& restore 備份工具
- parted & kpartx:虛擬磁盤工具
使用如下指令安裝。
sudo apt install dosfstools dump parted kpartx創建鏡像
根據系統尺寸決定使用的空間大小。
使用指令df -P的時候,顯示的數據是以1K(1024字節)為單位,注意到sdb1和sdb2分別使用的空間,下面要進行img空間分配。
應該注意到,boot分區其實是很小的,不過幾十兆,分配的時候不應該用boot分區已經使用的空間,而是boot分區整個的大小,也就是表中第二列。root分區就不一樣了,里面存放的是系統各項文件,這個分區在空間劃分的時候應該照顧已經使用的空間,所以要注意的是表中第三列。
使用下列指令獲取上面的參數。
bootsz=`df -P | grep /dev/sdb1 | awk '{print $2}'`# 注意到最后的那個$2 rootsz=`df -P | grep /dev/sdb2 | awk '{print $3}'`# 注意到最后的那個$3然后利用下面指令計算鏡像文件尺寸。
totalsz=`echo $rootsz $bootsz | awk '{print int(($1+$2)*1.3)}'`注意到上面的參數1.3,這個參數是網上一個同學經過測試測出來的。使用原始大小的1.3倍是極好的,兼顧尺寸和完備程度。
利用下面的指令申請鏡像空間。
img=/mnt/backup_flash/PRi_64GB_test.img sudo dd if=/dev/zero of=$img bs=1k count=$totalsz申請空間這一步會花不少時間,像我這個9GB多大概一小時吧。
至此,空間分配完成,下面開始分區。
空間分區
使用fdisk指令查看分區情況。
sudo fdisk -l /dev/sdb在鏡像文件分區的時候是根據扇區編號來確定的。和分配空間類似,sdb1分區應該完整劃分,剩下的都是sdb2分區。
使用以下指令獲得分區始末位置。
bootstart=`sudo fdisk -l /dev/sdb | grep sdb1 | awk '{print $2}'` bootend=`sudo fdisk -l /dev/sdb | grep sdb1 | awk '{print $3}'` rootstart=`sudo fdisk -l /dev/sdb | grep sdb2 | awk '{print $2}'`奇怪,為什么分區始末是不連續的?暫時不管,使用下面的指令查看數據。
echo "boot: $bootstart -> $bootend, root: $rootstart -> end"使用下面的指令進行分區。
sudo parted $img --script -- mklabel msdos sudo parted $img --script -- mkpart primary fat32 ${bootstart}s ${bootend}s sudo parted $img --script -- mkpart primary ext4 ${rootstart}s -1注意,這里第三個指令最后一個參數是負一,不是英文字母l,表示的含義是到最后一個,千萬不要搞錯了。
分區完畢之后進行格式化操作。
loopdevice=`sudo losetup -f --show $img` device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/1/g' | head -1` device="/dev/mapper/${device}" sudo mkfs.vfat ${device}p1 -n boot sudo mkfs.ext4 ${device}p2掛載并備份
使用下面的指令掛載虛擬磁盤的boot分區。
sudo mkdir -p /mnt/vir_img/boot sudo mount -t vfat ${device}p1 /mnt/vir_img/boot注意,boot區是FAT32格式,可以直接用cp指令進行拷貝。使用下面指令即可。
sudo cp -rfp /mnt/rpi_sd/boot/* /mnt/vir_img/boot/從要備份的SD卡,拷貝到目標文件掛載的目錄。
然后掛載root分區。
sudo mkdir -p /mnt/vir_img/root sudo mount -t ext4 ${device}p2 /mnt/vir_img/root注意,root分區是exf4格式,需要使用dump & restore進行備份。
cd /mnt/vir_img/root sudo chattr +d $img sudo dump -0uaf - /mnt/rpi_sd/root/ | sudo restore -rf - cd sudo sync經過漫長的拷貝過程,完成之后就可以卸載虛擬磁盤了。
sudo umount /mnt/vir_img/* sudo kpartx -d $loopdevice sudo losetup -d $loopdevice sudo umount /mnt/backup_flash好的,現在把得到的鏡像拷貝到電腦上,燒到一個新的SD卡里用舊的樹莓派測試一下。
emmmmm卡住不動了,備份失敗。
把上面的參數1.3改一下,改成1.5,新寫一個自動化腳本測試一下。
#!/bin/bash# 時間 now=`date +%Y-%m-%d-%H%M%S` exho "time:%t $now"# 備份文件寫入位置 target_file_dir=/home/pi/Documents/backup_test sudo mkdir -p $target_file_dir img=${target_file_dir}/backup-${now}.img echo "target file" $img# 虛擬磁盤掛載位置 vir_dir=/mnt/vir_img# 目標文件文件系統和目錄 bootfs=/dev/sdb1 rootfs=/dev/sdb2 bootdir=`df -P | grep ${bootfs} | awk '{print $6}'` rootdir=`df -P | grep ${rootfs} | awk '{print $6}'` echo $bootfs "mounted on" $bootdir echo $rootfs "mounted on" $rootdir# 計算目標空間尺寸 bootsz=`df -P | grep $bootfs | awk '{print $2}'` rootsz=`df -P | grep $rootfs | awk '{print $3}'` totalsz=`echo $rootsz $bootsz | awk '{print int(($1+$2)*1.5)}'` echo "total size" ${totalsz}KB# 獲取分區始末位置 bootstart=`sudo fdisk -l | grep $bootfs | awk '{print $2}'` bootend=`sudo fdisk -l | grep $bootfs | awk '{print $3}'` rootstart=`sudo fdisk -l | grep $rootfs | awk '{print $2}'` echo "boot: $bootstart -> $bootend, root: $rootstart -> end"# 申請鏡像空間 sudo dd if=/dev/zero of=$img bs=1k count=$totalsz# 目標鏡像分區 sudo parted $img --script -- mklabel msdos sudo parted $img --script -- mkpart primary fat32 ${bootstart}s ${bootend}s sudo parted $img --script -- mkpart primary ext4 ${rootstart}s -1# 創建虛擬磁盤 loopdevice=`sudo losetup -f --show $img` device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/1/g' | head -1` sleep 5 # 暫停來避開bug device="/dev/mapper/${device}"# 格式化 sudo mkfs.vfat ${device}p1 -n BOOT sudo mkfs.ext4 ${device}p2# 掛載虛擬磁盤 vir_boot=${vir_dir}/boot vir_root=${vir_dir}/root sudo mkdir -p $vir_boot $vir_root sudo mount -t vfat ${device}p1 $vir_boot sudo mount -t ext4 ${device}p2 $vir_root# 備份boot分區 sudo cp -rfp ${bootdir}/* ${vir_boot}/# 備份root分區 cd $vir_root sudo chattr +d $img sudo dump -0uaf - $rootdir | sudo restore -rf - cd sudo sync# 卸載虛擬磁盤 sudo umount ${vir_dir}/* sudo kpartx -d $loopdevice sudo losetup -d $loopdevice保存,執行,還是不行。
咋回事呢?我一步步按照教程來的啊,怎么就不好使呢?
莫非是備份目標的問題?教程里是把正在運行的樹莓派固件備份,我這里是把一個掛載的卡備份,會不會不一樣呢?會不會是剛才不連續的問題造成的呢?
修改腳本,重新測試,依舊失敗,出現了教程里面一個broken pipe的問題。
時間有點晚了,暫時到這里,系統備份失敗,下次再繼續研究。
總結
雖然系統備份是失敗的,但是我掛載U盤的指令由于反復使用已經爛熟于心,另外df和fdisk指令也是經常使用,也熟練了不少。
參考文獻
樹莓派掛載U盤或移動硬盤:http://shumeipai.nxez.com/2013/09/08/raspberry-pi-to-mount-the-removable-hard-disk.html
linux下mount指令詳解:https://blog.csdn.net/daydayup654/article/details/78788310
linux下uid和gid詳解:https://blog.csdn.net/36/article/details/86573899
dd指令系統備份:https://blog.csdn.net/just_s0so/article/details/88825716
系統備份:https://www.cnblogs.com/javazhu/articles/9234097.html
系統備份(蜜汁1.3):http://www.360doc.com/content/17/0805/03/40492717_676751545.shtml
總結
以上是生活随笔為你收集整理的u盘安装linux 提示no such device_树莓派学习笔记2-U盘挂载和系统备份的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二进制文件后缀_ZSY2018综合录井仪
- 下一篇: 华为u8825d解锁工具_黔隆科技刷机教