2017-02-24 15:48:50 u013896064 阅读数 2855

神奇的fdiskdd命令

其实Linux使用dd命令备份系统就是Ghost,类似于window的Ghost版本。

 

       进入Linux操作系统,打开命令行,执行如下命令:

      sudo  fdisk -u -l

      可以查看所有磁盘上的所有分区的尺寸和布局情况。

-u,让startend中数字的单位是512字节,也就是一个sector扇区的大小。

 

     假设我有一个/dev/sda磁盘,有100GB大小。我安装了一个Ubuntu操作系统。使用了如下分区:

/dev/sda1 5GB

/dev/sda2 1GB 扩展分区

/dev/sda5 1GB 扩展分区

/dev/sda2是所有扩展分区,它的大小和/dev/sda5重合。

/dev/sda1ext4格式的文件系统。用于安装ubuntu操作系统。

/dev/sda5swap格式的文件系统,作为交换分区。

 

      如果我用弱智的g4l工具制作系统的镜像,就需要备份整个磁盘100GB,而不是我需要的6GB

      g4l也可以单独备份分区,但是在恢复时,就需要在目标计算机上安装好grub,并进行了适当的分区。很麻烦!


      我这里,可以使用一条dd命令就生成6GB的镜像。然后可以在任意硬盘大于6GB的计算机上恢复出完整的系统,包括MBR3个分区sda1,sda2,sda5



具体步骤

        找一个U盘,安装UbuntuLive Cd系统。【具体如何制作U盘启动的UbuntuLive CD,可以参考Ubuntu官方网站的帮助。】

UbuntuLive CdWindowsPE系统类似,是光盘/U盘引导的Ubuntu操作系统,不需要安装就可以直接使用。


       U盘启动,进入盘上的Ubuntu系统,打开命令行,执行:

       sudo  fdisk -u -l /dev/sda

       查看硬件的分区情况。


然后执行:


    dd   bs=512 count=[fdisk命令中最大的end+1] if=/dev/sda of=/ghost.img

    这样,就可以把我需要的分区数据全部copyghost.img文件中。镜像制作完成了!



      然后,我们就可以把U盘插到其他系统上,用U盘启动,进入UbuntuLiveCD,打开命令行,执行如下命令:

dd if=/ghost.img of=/dev/sda

    完成后,拔掉U盘,启动计算机,就可以看到我们的Linux系统已经安装完毕了!

注意:

       不要直接在计算机上用本地磁盘启动系统后执行dd命令生成本地磁盘的镜像。而应该使用livecd启动计算机。

        因此计算机运行时会对系统盘产生大量写操作。 直接对运行中的系统盘生成的镜像,在恢复到其他硬盘上时,很可能会无法启动!



一样适用于非Linux操作系统

       在linux上用dd命令实现系统镜像备份和恢复,是不是很简单呢?


       对于Windows系统,甚至Mac等等任意系统,其实都可以用dd命令实现系统镜像的备份和恢复。

       因为,Linuxfdisk命令能够识别任意系统下的分区格式。fdisk并不关系分区上的文件系统,甚至有无文件系统都不关心。fdisk总是可以报告分区占用了哪些扇区。

 dd命令也不关心磁盘的文件系统格式,它只是简单地按照要求从指定的位置,复制多少字节数据而已。

 

      dd命令实现镜像备份和恢复,比Ghost软件简单和强大多了。使用ghost软件,依然需要用户进行复杂而危险的磁盘分区操作。

      而使用fdiskdd这两条命令,一切都免了!


压缩和解压缩

        可能我们需要备份的分区很大,使用dd命令生成的镜像文件也就很大。存储和传输这些镜像不太方便。  我们也可以使用压缩程序压缩生成的镜像文件。 这里,我选择使用gzip程序,配合dd命令一起使用。

gzip参数:

-c 表示输出到stdout

-d  表示解压缩

-1 表示最快压缩

-9 表示最好压缩

默认使用的是-6压缩级别。


      

   

要使用 dd 和 gzip 生成压缩的镜像文件,可以执行命令:   dd   bs=512
count=[fdisk命令中最大的end数+1] if=/dev/sda | gzip -6 > /ghost.img.gz

还原时,可以执行下列命令: gzip -dc /ghost.img.gz.gz | dd of=/dev/sda

提醒:

       如果你把镜像恢复到另一台计算机上,你可能会发现你的网卡是eth1,而不是eth0。这是因为

/etc/udev/rules.d/70-persistent-net.rules   文件把你做镜像的计算机的网卡作为eth0登记了。  

     如果你的网络脚本对eth0进行了处理,而没有对eth1进行处理,那么不修改网络脚本,你可能就无法上网了。

  

    也许你会希望在做镜像之前,先删除 /etc/udev/rules.d/70-persistent-net.rules 文件。这样你恢复镜像时,网卡的名字就是eth0。   就不会造成你在恢复后的计算机上无法上网的问题了。

2015-10-11 20:38:05 zlpzlpzyd 阅读数 1278

近期在学习Linux,发现dd命令在备份大文件时控制台上没有显示进度,容易让管理员进入无休止的等待状态,我在网上找了一下。可以用如下命令来解决。

while killall -USR1 dd; do sleep 1; done


2017-08-22 19:43:13 qingsong3333 阅读数 2968

dd的意思是covert and copy a file,也就是转换和复制一个文件,它除了用来备份之外,还可以转换文件。这里介绍几种最常见的用法,包括单个文件的复制、单个文件系统的复制、快速生成一个大文件、大小写转换

NAME
       dd - convert and copy a file

SYNOPSIS
       dd [OPERAND]...
       dd OPTION

DESCRIPTION
       Copy a file, converting and formatting according to the operands.

       bs=BYTES read and write up to BYTES bytes at a time

       conv=CONVS convert the file as per the comma separated symbol list

       count=N  copy only N input blocks

       ibs=BYTES read up to BYTES bytes at a time (default: 512)

       if=FILE read from FILE instead of stdin

       of=FILE write to FILE instead of stdout
	   
	   seek=N skip N obs-sized blocks at start of output

示例1:备份单个文件,if指定输入文件,of指定输出文件
root@db2a:/tmp# dd if=dir2.tar.gz of=dir2.tar.gz.bak
37266+1 records in
37266+1 records out
19080487 bytes (19 MB) copied, 0.284904 s, 67.0 MB/s

示例2:备份整个文件系统:
lv1的文件系统是ext4的,挂载点是/tmp/lv1
root@db2a:/tmp# mount /dev/mqsvg1/lv1 /tmp/lv1
root@db2a:/tmp# ls -l /tmp/lv1/
total 15
drwxr-xr-x 2 root root  1024 Aug 21 19:11 dir1
-rw-r--r-- 1 root root    10 Aug 21 19:10 file1
-rw-r--r-- 1 root root    10 Aug 21 19:10 file2
drwx------ 2 root root 12288 Aug 21 19:06 lost+found

现在新建一个lv2,然后使用dd if=/dev/mqsvg1/lv1 of=/dev/mqsvg1/lv2命令把lv1的内容复制到lv2上:
root@db2a:/tmp# lvcreate -L 600M -n lv2 mqsvg1   
root@db2a:/tmp# dd if=/dev/mqsvg1/lv1 of=/dev/mqsvg1/lv2
1024000+0 records in
1024000+0 records out
524288000 bytes (524 MB) copied, 106.313 s, 4.9 MB/s
root@db2a:/tmp# mkdir /tmp/lv2
root@db2a:/tmp# mount /dev/mqsvg1/lv2 /tmp/lv2
root@db2a:/tmp# ls -l /tmp/lv2
total 15
drwxr-xr-x 2 root root  1024 Aug 21 19:11 dir1
-rw-r--r-- 1 root root    10 Aug 21 19:10 file1
-rw-r--r-- 1 root root    10 Aug 21 19:10 file2
drwx------ 2 root root 12288 Aug 21 19:06 lost+found
root@db2a:/tmp# df -hT lv*
Filesystem             Type  Size  Used Avail Use% Mounted on
/dev/mapper/mqsvg1-lv1 ext4  477M  2.3M  445M   1% /tmp/lv1
/dev/mapper/mqsvg1-lv2 ext4  477M  2.3M  445M   1% /tmp/lv2

注意一点:这里甚至都没有格式化lv2。除了备份分区外,还可以备份整个磁盘。

示例3:快速生成一个大文件,这里的bs表示字节数,默认为512 bytes,也就是一个磁盘block的大小,count表示数量,下面的两个例子都是生成500MB的大文件:
root@db2a:/tmp# dd if=/dev/zero of=bigfile count=1024000
1024000+0 records in
1024000+0 records out
524288000 bytes (524 MB) copied, 1.75448 s, 299 MB/s
root@db2a:/tmp# dd if=/dev/zero of=bigfile2 bs=1M count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 0.610042 s, 859 MB/s
root@db2a:/tmp# ls -lh bigfile*
-rw-r--r-- 1 root root 500M Aug 21 19:47 bigfile
-rw-r--r-- 1 root root 500M Aug 21 19:48 bigfile2

这里文件是实际写入到硬盘了,写的数据全是0,需要耗费很多时间,如果不想真正写入,可以使用seek跳过前n个block。这样子系统会认为有一个大文件,但文件不占空间
root@db2a:/tmp# dd if=/dev/zero of=bigfile3 bs=1M count=0 seek=500
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000919414 s, 0.0 kB/s
root@db2a:/tmp# ls -lh bigfile3
-rw-r--r-- 1 root root 500M Aug 21 20:10 bigfile3
可以看到,瞬间完成。这种文件生成后,使用df和du查看文件系统和目录和使用时,均没有增加,但find的-size选项可以搜索到

示例4:文本大小写转换
使用conv=lcase转换为小写,使用conv=ucase转换为大写:
root@db2a:/tmp# cat file1.txt 
Hello, World.
This is a TEXT with both CAPITALs and lowercases.
root@db2a:/tmp# dd if=file1.txt of=fileL.txt conv=lcase
root@db2a:/tmp# dd if=file1.txt of=fileU.txt conv=ucase
root@db2a:/tmp# cat fileL.txt 
hello, world.
this is a text with both capitals and lowercases.
root@db2a:/tmp# cat fileU.txt 
HELLO, WORLD.
THIS IS A TEXT WITH BOTH CAPITALS AND LOWERCASES.

2016-11-26 14:33:16 mao0514 阅读数 5172

一个去年的老本,500G硬盘,空间各种捉急,准备迁移到公司的台式机上,却发现Linux上迁移环境没有Windows下那么方便,只能复制整块硬盘了。

从公司拿了一块1T的硬盘,插入移动硬盘盒(淘宝上搞的一个移动硬盘盒,40元),加电识别,格式化,开始硬盘复制。

市面上针对数据备份的软件不计其数,我们不讨论他们的优缺点。但是如果你正在使用Linux(其实如果你没有使用Linux,而是通过一些 Linux live CD来启动计算机,我想也是一样的),那么恭喜你,你可以简单地使用系统命令“dd”来完成磁盘克隆,分区克隆或者磁盘或分区到磁盘镜像的复制。一般情况 下,这几个任务已经可以满足你日常工作的需要了。
先说明几个概念,在Linux上,一块硬盘或者一个分区都由一个目录表示,一般存在于系统根目录的/dev/之下。例如/dev/hda代表你的第一块 IDE硬盘,/dev/sdb代表第二块SCSI硬盘,/dev/fd0代表系统的软盘驱动器等等。同样每块硬盘上的分区也有独特的目录名,例如/dev /hda1表示你第一块硬盘上的第一个分区(至于这个分区上有什么东西在进行备份操作的时候并不重要)。

1. 磁盘克隆
也就是把整个硬盘复制一份。当然你首先需要在计算机上在接上一块新硬盘,并让系统识别。例如这块硬盘可能被识别为/dev/sdb,原有硬盘叫/dev/sda. 然后你可以在linux命令行上简单地执行:
dd if=/dev/sda of=/dev/sdb
对就这么简单,此命令完成后,你的第二块硬盘上将有一个和第一块硬盘一模一样的副本,也是可以启动的。因为dd操作就是简单的按字节复制,什么分区表啊,MBR啊统统照搬。
当然你也可以做一些微调,来定制一下克隆操作。例如你可能希望把硬盘上的内容全部备份到一个磁盘文件中,而不是另一块新硬盘,你可以
dd if=/dev/sda of=~/disk1.img
之后,disk1.img就是备份好的磁盘映像文件,你可以复制或转移到其他介质也可以压缩一下:
gzip disk1.img #generates disk1.img.gz
或者在创建磁盘映像文件的同时就执行压缩:
dd if=/dev/sda | gzip > disk.img.gz
dd if=/dev/sda | bzip2 > disk.img.bz2

不错吧!ghost的功能都有了。

2.分区克隆
如果我们不想克隆整块磁盘,只想把某些存放数据的分区备份一下,你会需要克隆一个分区。正如预备知识所述,分区在linux下也是一个文件。例如
dd if=/dev/sda1 of=~/part1.img
将把第一块磁盘的第一个分区备份到名为part1.img的文件中。
也可以进行分区复制:
dd if=/dev/hda1 of=/dev/hda3
将把分区一原样复制到分区3.

3. 从镜像文件恢复磁盘或分区
很简单,把上面命令中,of和if指向的文件名互换一下即可实现恢复。例如
dd if=disk1.img of=/dev/sda
把保存在disk1.img中的映像恢复到第一块磁盘
dd if=part1.img of=/dev/hda2
把保存在part1.img中的映像恢复到第一块硬盘的第二个分区

最后,需要注意一点是,无论备份还是恢复,都需要保证 of 指向的文件或磁盘空间要大于 if 指向的内容,因为是按字节复制 如果没有足够的空间去存储内容,备份自然会失败。

2019-09-13 18:43:06 renfeigui0 阅读数 592

Linux系统本机备份还原(完整备份)文件、分区、磁盘(dd)

dd命令:备份还原本地文件、分区、磁盘

一、dd命令

1、dd 命令主要用来进行数据备份,并且可以在备份的过程中进行格式转换。其实 dd 命令可以把源数据复制成目标数据,而且不管源数据是文件、分区、磁盘还是光盘,都可以进行数据备份。

2、dd 命令格式如下。
dd if=“输入文件” of=“输出文件” bs=“数据块” count=“数量”

参数 说明
if input file定义输入数据的文件,也可以是设备。
of output file定义输出数据的文件,也可以是设备。
bs 指定一个block数据块的大小,也就是定义一次读取或写入多少字节。若未指定则默认是 512 字节,一个扇区的大小。
count 指定 bs 的数量。
conv=标志 依据标志转换文件。
conv标志 说明
ascii 由 EBCDIC 码转换至 ASCII 码。
ebcdic 由 ASCII 码转换至 EBCDIC 码。
ibm 由 ASCII 码转换至替换的 EBCDIC 码。
block 将结束字符块里的换行替换成等长的空格。
unblock 将 cbs 大小的块中尾部的空格替换为一个换行符。
lcase 将大写字符转换为小写。
notrunc 不截断输出文件。
ucase 将小写字符转换为大写。
swab 交换每一对输入数据字节。
noerror 读取数据发生错误后仍然继续。
sync 将每个输入数据块以 NUL 字符填满至 ibs 的大小;当配合 block 或 unblock 时,会以空格代替 NUL 字符填充。

二、文件备份为文件,使用备份文件还原文件

1、备份文件(如果备份文件,那么dd命令和cp命令非常类似)。

dd  if=qq.txt  of=qq.txt.bak

2、查看一下生成的备份文件的大小。

ll  -h 

3、删除原文件,还原文件。

rm -rf qq.txt
dd  if=qq.txt.bak   of=qq.txt

4、查看一下还原后的文件的大小。

ll  -h 

在这里插入图片描述

三、分区备份为文件,使用备份文件还原分区

1、查看一下分区容量,我们备份/boot分区。

df -h

2、备份分区为一个备份文件。

dd  if=/dev/sda1   of=/tmp/boot.bak

3、查看生成的备份文件。

ll -h  /tmp/boot.bak

4、备份文件还原分区,则执行以下命令。

dd  if=/tmp/boot.bak    of=/dev/sda1

在这里插入图片描述

四、分区备份为分区,使用备份分区还原分区

1、如果想要把分区直接备份到另一个分区,就需要生成一个新的分区,这个分区的大小不能比源分区小,只能和源分区大小一致或比它大。

2、Linux系统VMware虚拟机添加磁盘查看博客(https://blog.csdn.net/renfeigui0/article/details/100795431)。
Linux系统新磁盘分区及格式化查看博客
(https://blog.csdn.net/renfeigui0/article/details/100797558)。
查看磁盘sdb的分区表,查看所有分区uuid,此时各分区uuid各不相同。

fdisk -l /dev/sdb
blkid

3、查看磁盘使用情况,选择一个小分区进行备份,执行如下命令备份分区/dev/sda1到分区/dev/sdb1。

df  -h
dd  if=/dev/sda1    of=/dev/sdb1

4、新建挂载点,挂载备份分区。

mkdir /disk1
mount /dev/sdb1  /disk1/

5、查看分区数据容量相同,查看分区uuid也相同。

df -h
blkid

6、如果需要还原分区,则只需把输入项和输出项反过来即可,命令如下。

dd   if=/dev/sdb1   of=/dev/sda1

在这里插入图片描述

五、磁盘备份为磁盘,备份磁盘还原磁盘

1、把磁盘a备份到磁盘b。

dd   if=/dev/sda      of=/dev/sdb

2、当硬盘a数据损坏时,只需用备份硬盘b替换即可恢复系统数据。

六、磁盘备份为文件,备份文件还原磁盘

1、把磁盘a备份成文件disk.bak。

dd    if=/dev/sda    of=/tmp/disk.bak

2、如果备份成文件,那么在恢复时需要把备份数据复制到其他Linux中,然后把新硬盘安装到有备份数据的这台Linux服务器上,再把磁盘备份数据复制到新硬盘中即可。

dd    if=/tmp/disk.bak    of=/dev/sdb
  • dd 命令在进行整盘复制时,类似于 GHOST 工具的功能。虽然 dd 命令功能强大,不过也有一个明显的缺点,就是复制的时间较长,复制 100GB 的数据需要 15~25 分钟(根据服务器的性能不同而不同)。

七、使用dd命令制作光盘ISO镜像

1、使用dd命令把光盘中所有的数据制作成ISO镜像。

dd    if=/dev/cdrom    of=/tmp/cd.iso 

2、建立一个新的挂载点。

mkdir /mnt/cd

3、挂载ISO镜像文件到挂载点。

mount     /tmp/cd.iso     /mnt/cd 

4、进入挂栽点,看到的数据是光盘当中的数据,这个ISO镜像是可以被当作真正的光盘使用的。

cd /mnt/cd
ls

八、制作指定大小的文件

1、有时需要制作指定大小的文件,比如,在增加 swap 分区时,就需要建立指定大小的文件,这时也要使用 dd 命令。

2、命令说明:数据输入项是/dev/zero会向目标文件中不停地写入二进制的0,指定数据块大小是1MB,指定生成10个数据块。也就是定义输出的文件大小为10MB。

dd   if=/dev/zero    of=/test/qq.txt     bs=1M    count=10

在这里插入图片描述

九、复制软盘

1、在Linux中软盘的设备文件名是/dev/fd0,这条命令会先把软盘中的数据保存为临时数据文件。

dd    if=/dev/fd0    of=/tmp/fd.bak

2、然后我们更换新的软盘,把数据备份复制到新软盘中,就实现了软盘的复制。

dd    if=/tmp/fd.bak     of=/dev/fd0

十、实现本地数据备份还有非常多的方法和工具,比如 tar 、dump、 cpio 命令。至于网络复制工具,则有 rsync 和 scp 等。

没有更多推荐了,返回首页