首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dd图像到SD卡完成,SD卡仍在忙

dd图像到SD卡完成,SD卡仍在忙
EN

Stack Overflow用户
提问于 2017-02-02 04:47:24
回答 3查看 738关注 0票数 1

如果我使用dd将*.img文件还原到SD卡,它可以正常工作。如果我试图在dd完成后安全地删除SD卡(弹出在海里),就会弹出一个通知,上面写着:“有些东西正在写到SD卡上”。读卡器上的LED也在闪烁。需要几分钟才能把卡取下来。第一个问题是,这怎么可能?

我在bash脚本中使用dd。一旦脚本完成,应该可以删除SD卡。第二个问题是,我可否以某种方式检查SD卡的状态,即是否繁忙?

编辑20170203:这是脚本。其目的只是为了恢复一个覆盆子pi备份。

代码语言:javascript
复制
#!/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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-03 16:56:14

fsync()系统调用将导致在操作系统级别上的任何写缓存被刷新。虽然可以用C编写一些东西来调用当前的特定块设备(从shell ),但在shell中实现的最简单方法是使用sync命令在所有文件系统和设备上刷新所有挂起的写操作:

代码语言:javascript
复制
sync

或者,您可以告诉dd使用O_SYNC标志,方法是传递oflag=sync,在将写入保存到磁盘之前阻止dd退出:

代码语言:javascript
复制
# note that oflag is a GNU extension, not found on MacOS/BSD
dd oflag=nocache,sync of="$DEV" bs=1M

如果您知道SD卡的本机块大小,请考虑使用O_DIRECT

代码语言:javascript
复制
# 4k is a reasonable guess on block size; tune based on your actual hardware.
dd oflag=direct of="$DEV" bs=4K
票数 3
EN

Stack Overflow用户

发布于 2017-02-03 16:56:22

我建议您使用下面描述的非常快速的perl脚本:https://askubuntu.com/a/216628

有时,我也会利用自己找到不想要的/隐藏的/未知的进程,从而使资源保持忙碌。

一旦你得到了这个过程,你的SSD忙碌的内在行为就可以被调查。

票数 1
EN

Stack Overflow用户

发布于 2017-02-02 07:14:54

如果有东西正在使用该设备,您可以使用lsof。如果您的SD卡被识别为/dev/sdd

代码语言:javascript
复制
lsof /dev/sdd 2>/dev/null && echo "device is busy"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41994365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档