如果我使用dd將* .img文件恢復到SD卡,它沒有問題。如果我在dd完成後立即嘗試安全地刪除(彈出鸚鵡螺)SD卡,會彈出一條通知:「正在寫入SD卡」。讀卡器上的LED也閃爍。需要幾分鐘時間才能取出卡。第一個問題是,這怎麼可能?dd圖像SD卡完成,SD卡仍然忙
我在bash腳本中使用dd。一旦腳本完成,應該可以取出SD卡。第二個問題是,我能否以某種方式檢查SD卡的狀態,即是否忙?
編輯20170203: 這是腳本。目的只是爲了恢復樹莓派的備份。
#!/bin/bash
#
#enter path of image
IMG=$(whiptail --inputbox "Enter path to image." 8 78 "$HOME/Downloads/raspberry_backup.img.gz" --title "Name" 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus != 0 ]; then
echo "INFO: User abort."
exit 1
fi
#check for dependencies
if [ -z "$(which parted 2> /dev/null)" ] || [ -z "$(which gzip 2> /dev/null)" ]; then
if (whiptail --title "Dependencies" --yesno "This script need parted and gzip. One or more are not installed. Install now?" 8 78) then
sudo dnf install -y parted gzip
else
exit 1
fi
fi
#show information of drives
whiptail --scrolltext --title "Info about mounted devices:" --msgbox "$(sudo parted -l -m init G print | grep /dev/sd | cut -d: -f1,2)" 8 78
#enter drive name
DEV=$(whiptail --inputbox "Enter Device Name." 8 78 /dev/sd --title "Device Name" 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus != 0 ]; then
echo "INFO: User abort."
exit 1
fi
#check for /dev/sd* vaidity
if [[ $DEV != "/dev/sd"* ]]; then
echo "ERROR: ${DEV} is not valid."
exit 1
fi
#if restore image is *.gz then uncomress first
if [[ "$IMG" == *".gz" ]]; then
(pv -n ${IMG} | gzip -d -k > $HOME/raspberry_restore.img) 2>&1 | whiptail --gauge "Please wait while uncompressing image..." 6 50 0
IMG=$HOME/raspberry_restore.img
fi
if [[ "$IMG" == *".img" ]]; then
SIZEDD=$(sudo parted -m $IMG unit B print | grep ext4 | cut -d: -f3 | cut -dB -f1)
(sudo dd if=$IMG bs=1M | pv -n --size $SIZEDD | sudo dd of=$DEV bs=1M) 2>&1 | whiptail --gauge "Please wait while restoring image to SD card..." 6 50 0
else
echo "ERROR: Not an *.img file"
exit 1
fi
sudo rm $HOME/raspberry_restore.img
#show information
whiptail --title "Restore finished." --msgbox "Restored to path: "$DEV"" 8 78
exit 1
感謝
你能告訴我們你的腳本嗎? –
簡單的答案是運行'sync',並等待它在移除設備之前退出。 (更直接的,可以在塊設備上調用'fsync()'系統調用)。 –
順便說一句,你有一些錯誤的引號等錯誤的錯誤; http://shellcheck.net/會找到它們。你可能想''恢復到路徑:\「$ DEV \」「'使內部引號文字而不是語法。並且全大寫變量名稱用於對OS或shell有意義的變量,而具有至少一個小寫字符的名稱則保留給應用程序使用;請參閱http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html –