linux dd命令详解


linux dd命令详解

回到顶部
Linux dd命令用于读取、转换并输出数据。 dd从标准输入或文件中读取数据,将数据转换为指定的格式,然后再输出到文件、设备或标准输出。
dd可以读取磁盘设备的内容,几乎是直接读取扇区sector,将整个设备备份成一个文件呢!所以dd命令也经常用来备份整个磁盘。
dd命令常用格式如下:
            [root@initroot ~]# dd if="input_file" of="output_file" bs="block_size" count="number"
            
选项与参数:
if :input file的缩写,file可以是设备文件!
of :output file的缩写,file可以是设备文件;
bs :规划的一个block的大小,默认512 bytes,即一个sector的大小; count :bs的个数。
将/etc/passwd备份到/tmp/passwd.back当中
              [root@initroot ~]# dd if=/etc/passwd of=/tmp/passwd.back
              5+1 records in
              5+1 records out
              2619 bytes (2.6 kB, 2.6 KiB) copied, 0.00732986 s, 357 kB/s

              [root@initroot ~]# ls -l /etc/passwd /tmp/passwd.back 
              -rw-r--r-- 1 root root 2619 Jul 28  2019 /etc/passwd
              -rw-r--r-- 1 root root 2619 Feb 10 17:47 /tmp/passwd.back
            
执行效果类型cp命令。
/etc/passwd文件大小为2619bytes,这里没有指定bs,所以默认是512bytes为一个单位, 上面那个5+1表示有5个完整的512 bytes,以及未满512 bytes的另一个block!
将光驱的内容备份为镜像文件:
            [root@initroot ~]# dd if=/dev/sr0 of=/tmp/system.iso
            177612+0 records in
            177612+0 records out
            90937344 bytes (91 MB) copied, 22.111 s, 4.1 MB/s
            
可以将镜像文件刻录到移动u盘中,假设USB移动u盘设备文件是/dev/sda,请上面的镜像image文件/tmp/system.iso刻录到USB磁盘中:
            [root@initroot ~]# lsblk /dev/sda
            NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
            sda    8:0   0   60G  0  disk
            
可以看到这个U盘有60G
            [root@initroot ~]# dd if=/tmp/system.iso of=/dev/sda
            [root@initroot ~]# mount /dev/sda /mnt
            [root@initroot ~]# ll /mnt
            dr-xr-xr-x. 131 root root 34816 Jun 26 22:14 etc
            dr-xr-xr-x. 5   root root  2048 Jun 17 00:20 home
            dr-xr-xr-x. 8   root root  4096 Jul  2 18:48 root
            
将u盘设置为开机启动设备,就可以利用u盘来安装linux了。
将/boot目录所在的文件系统通过dd备份下来:
            [root@initroot ~]# df -h /boot
            Filesystem Size Used Avail Use% Mounted on
            /dev/vda2 1014M 149M 866M  15%  /boot            #注意备份的容量为1G!
            
            [root@initroot ~]# dd if=/dev/vda2 of=/tmp/vda2.img
            [root@initroot ~]# ls -lh /tmp/vda2.img
            -rw-r--r--. 1 root root 1.0G Jul 2 23:39 /tmp/vda2.img
            
上面是将整个/dev/vda2设备文件系统备份下来, 所以文件容量和整颗磁盘的容量一样大! 不同于xfsdump只备份文件系统中有使用到的部份, dd默认是一个一个扇区去读/写的,即使没有用到的扇区也会被写入备份文件中! 最后文件会变得跟原本的磁盘一样大!
这样也有好处,dd生成文件系统的完全副本, 不论该磁盘内的文件系统你是否认识,它都可以备份还原!
例如将/dev/vda2完整的复制到另一个partition上,请使用你的系统上面未分区完毕的容量再建立一个与/dev/vda2差不多大小的分区, 只能比 /dev/vda2 大,不能比他小!,然后将之进行完整的复制 (包括需要复制 boot sector 的区块)。 现在分区出/dev/sda1出来,然后将/dev/vda2完整的拷贝进去/dev/sda1:
1. 先进行分区:
            [root@initroot ~]# fdisk /dev/sda
            Command (m for help): n
            Partition type:
            p primary (0 primary, 0 extended, 4 free)
            e extended
            Select (default p): p
            Partition number (1-4, default 1): 1
            First sector (2048-4195455, default 2048): Enter
            Using default value 2048
            Last sector, +sectors or +size{K,M,G} (2048-4195455, default 4195455): Enter
            Using default value 4195455
            Partition 1 of type Linux and of size 2 GiB is set
            Command (m for help): p
            Device Boot Start End Blocks Id System
            /dev/sda1 2048 4195455 2096704 83 Linux
            Command (m for help): w
            [root@initroot ~]# partprobe
            
2. 不需要格式化,直接进行sector的复制:
            [root@initroot ~]# dd if=/dev/vda2 of=/dev/sda1
            2097152+0 records in
            2097152+0 records out
            1073741824 bytes (1.1 GB) copied, 71.5395 s, 15.0 MB/s
            [root@initroot ~]# xfs_repair -L /dev/sda1 #一定要先清除log!
            [root@initroot ~]# uuidgen #赋予一个新的UUID
            896c38d1-bcb5-475f-83f1-172ab38c9a0c
            [root@initroot ~]# xfs_admin -U 896c38d1-bcb5-475f-83f1-172ab38c9a0c /dev/sda1
            
因为XFS文件系统使用UUID来区分文件系统,dd会复制文件系统的所有信息,包括UUID! 所以就得使用xfs_repair和xfs_admin修改一下!
            [root@initroot ~]# mount /dev/sda1 /mnt
            [root@initroot ~]# df -h /boot /mnt
            Filesystem Size
            Used Avail Use% Mounted on
            /dev/vda2 1014M 149M 866M 15% /boot
            /dev/sda1 1014M 149M 866M 15% /mnt
            
上面里这两个一模一样!
3. 接下来将文件系统放大:
            [root@initroot ~]# xfs_growfs /mnt
            [root@initroot ~]# df -h /boot /mnt
            Filesystem Size
            Used Avail Use% Mounted on
            /dev/vda2 1014M 149M 866M 15% /boot
            /dev/sda1 2.0G 149M 1.9G 8% /mnt
            [root@initroot ~]# umount /mnt
            
新分区出来的partition不需要经过格式化,因为dd可以将原本旧的partition的数据整个复制过来! 连同superblock, boot sector, meta data等也会复制过来! 如果想要配置两颗一模一样的磁盘时,只要下达类似:dd if=/dev/sda of=/dev/sdb, 就能够让两颗磁盘一模一样,甚至/dev/sdb不需要分区与格式化, 因为该指令可以将/dev/sda内的所有信息, 包括MBR与partition table也复制到/dev/sdb
但是在挂载的时候需要先清除 XFS 文件系统内的 log 之后, 重新给予一个跟原本不一样的 UUID 后,才能够顺利挂载! 同时,为了让系统继续利用后续没有用到的磁盘空间,需要用到xfs_growfs。关于 xfs_growfs参考这里!
在Linux 下制作启动盘,可使用如下命令:
dd if=boot.img of=/dev/fd0 bs=1440k
将testfile文件中的所有英文字母转换为大写,然后转成为testfile_1文件,在命令提示符中使用如下命令:
dd if=testfile_2 of=testfile_1 conv=ucase
其中testfile_2 的内容为:
$ cat testfile_2 #testfile_2的内容
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
转换完成后,testfile_1 的内容如下:
$ dd if=testfile_2 of=testfile_1 conv=ucase #使用dd 命令,大小写转换记录了0+1 的读入记录了0+1 的写出
95字节(95 B)已复制,0.000131446 秒,723 KB/s
cmd@hdd-desktop:~$ cat testfile_1 #查看转换后的testfile_1文件内容
HELLO LINUX!
LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.
THIS IS A LINUX TESTFILE!
LINUX TEST #testfile_2中的所有字符都变成了大写字母
由标准输入设备读入字符串,并将字符串转换成大写后,再输出到标准输出设备,使用的命令为:
dd conv=ucase
输入以上命令后按回车键,输入字符串,再按回车键,按组合键Ctrl+D 退出,出现以下结果:
$ dd conv=ucase
Hello Linux! #输入字符串后按回车键
HELLO LINUX! #按组合键Ctrl+D退出,转换成大写结果
记录了0+1 的读入
记录了0+1 的写出
13字节(13 B)已复制,12.1558 秒,0.0 KB/s
更多选项参数说明:
if=文件名:输入文件名,默认为标准输入。即指定源文件。
of=文件名:输出文件名,默认为标准输出。即指定目的文件。
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
conv=<关键字>,关键字可以有以下11种:
conversion:用指定的参数转换文件。
ascii:转换ebcdic为ascii
ebcdic:转换ascii为ebcdic
ibm:转换ascii为alternate ebcdic
block:把每一行转换为长度为cbs,不足部分用空格填充
unblock:使每一行的长度都为cbs,不足部分用空格填充
lcase:把大写字符转换为小写字符
ucase:把小写字符转换为大写字符
swab:交换输入的每对字节
noerror:出错时不停止
notrunc:不截短输出文件
sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
--help:显示帮助信息
--version:显示版本信息

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读