日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

u盘安装linux 提示no such device_树莓派学习笔记2-U盘挂载和系统备份

發布時間:2024/1/23 linux 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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盘挂载和系统备份的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。