背景:
OS:Ubuntu 16.04
dd:Version 8.25
首先我们看一下 Linux dd 命令的官方帮助摘要:
lst@xbatu.com:~$ dd --help
Usage: dd [OPERAND]...
or: dd OPTION
Copy a file, converting and formatting according to the operands.
dd命令用于转换和复制文件,由于它是按照磁盘结构进行复制,用指定大小的块为单位进行拷贝,它可以把一块硬盘上的内容按照原有的结构复制到另外一块硬盘,并在拷贝的同时进行指定的格式转换。
所以我们可以用dd命令来烧写树莓派的系统启动盘、安装盘,一般情况下,树莓派的系统启动盘、安装盘就是一张SD卡,或者制作其他系统的启动U盘。
步骤:
1、使用Linux 命令 fdisk -l 查看U盘的设备信息及文件系统类型,我的为/dev/sdb1,根据您要制作的系统启动盘的需求,看看是否需要格式化 U 盘。
2、卸载已挂载的U盘
umount /dev/sdb1
3、如果需要格式化U盘,执行格式化命令:mkfs.xxx /dev/sdb1,否则忽略这一步。
请将xxx换成您需要的文件系统类型,如fat、vfat、ntfs、ext4等等
4、如果需要,请重新挂载U盘,执行mount 命令。
5、制作启动盘:
网上很多类似文章都说:用Linux dd 命令 制作系统启动盘期间,终端命令窗口不会有任何反馈输出,当看到终端命令窗口有返回消息即制作完成,并且还无法明确判断是否制作完全成功,那是因为他们用的是类似如下格式的命令:
# dd bs=4M if=/您的路径/您的.iso of=/dev/sdb && sync
如果/dev/sdb 出错的话,换成/dev/sdb1 再试试!^_^
接下来,我们来点新鲜的!^_^
其实用Linux dd 命令 制作系统启动盘期间,终端命令窗口是可以持续输出中间的复制信息的,只要给上面的命令添加一个选项值:status=progress ,变成下面这样的命令串:
# dd status=progress bs=4M if=/您的路径/您的.iso of=/dev/sdb && sync
运行该命令,看看效果,应该是符合预期。
从此,再也不会发生:在使用 Linux dd 命令制作系统启动盘的漫长的等待期间,战战兢兢地以为系统死机了的糟糕体验啦!^_^
当该命令执行完成后,为了进一步确认是否制作成功,您可以通过运行命令:
echo $?
查看上一个命令的返回值,一般返回值为 0 ,表示上一个命令执行成功。
延伸内容:
功能强大的 Linux dd 命令 可以帮我们完成哪些任务?
我们可以用命令
kill -l
来查看当前的 Linux 系统所支持的所有信号种类。
Ubuntu 16.04 没有 INFO 信号,但是有 USR1、USR2 信号。
下面是摘自 GNU.ORG 的关于 Linux dd 命令的一些权威内容及原文链接,感兴趣的朋友们可以读一读,这里我就不翻译了,以免班门弄斧、弄巧成拙。^_^
http://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html#dd-invocation
For failing disks, other tools come with a great variety of extra functionality to ease the saving of as much data as possible before the disk finally dies, e.g. GNU ddrescue
. However, in some cases such a tool is not available or the administrator feels more comfortable with the handling of dd
. As a simple rescue method, call dd
as shown in the following example: the options ‘conv=noerror,sync’ are used to continue after read errors and to pad out bad reads with NULs, while ‘iflag=fullblock’ caters for short reads (which traditionally never occur on disk based devices):
# Rescue data from an (unmounted!) partition of a failing disk. dd conv=noerror,sync iflag=fullblock </dev/sda1 > /mnt/rescue.img
Sending an ‘INFO’ signal (or ‘USR1’ signal where that is unavailable) to a running dd
process makes it print I/O statistics to standard error and then resume copying. In the example below,dd
is run in the background to copy 5GB of data. The kill
command makes it output intermediate I/O statistics, and when dd
completes normally or is killed by the SIGINT
signal, it outputs the final statistics.
# Ignore the signal so we never inadvertently terminate the dd child. # Note this is not needed when SIGINFO is available. trap '' USR1 # Run dd with the fullblock iflag to avoid short reads # which can be triggered by reception of signals. dd iflag=fullblock if=/dev/zero of=/dev/null count=5000000 bs=1000 & pid=$! # Output stats every second. while kill -s USR1 $pid 2>/dev/null; do sleep 1; done
The above script will output in the following format:
3441325+0 records in 3441325+0 records out 3441325000 bytes (3.4 GB, 3.2 GiB) copied, 1.00036 s, 3.4 GB/s 5000000+0 records in 5000000+0 records out 5000000000 bytes (5.0 GB, 4.7 GiB) copied, 1.44433 s, 3.5 GB/s
The ‘status=progress’ option periodically updates the last line of the transfer statistics above.
On systems lacking the ‘INFO’ signal dd
responds to the ‘USR1’ signal instead, unless the POSIXLY_CORRECT
environment variable is set.
An exit status of zero indicates success, and a nonzero value indicates failure.