Linux学习笔记19——XFS 文件系统的备份与还原、光盘写入工具、其他常见的压缩与备份工具

目录

 

一、XFS 文件系统的备份与还原

1,XFS 文件系统备份 xfsdump

用 xfsdump 备份完整的文件系统

用 xfsdump 进行累积备份 (Incremental backups)

2,XFS 文件系统还原 xfsrestore

用 xfsrestore 观察 xfsdump 后的备份数据内容

简单复原 level 0 的文件系统

复原累积备份数据

仅还原部分文件的 xfsrestore 互动模式

二、光盘写入工具

1,mkisofs:创建镜像文件

制作一般数据光盘镜像文件

制作/修改可开机光盘图像挡

2,cdrecord:光盘烧录工具

侦测你的烧录机所在位置:

进行 CD/DVD 的烧录动作:

三、其他常见的压缩与备份工具

1,dd

2,cpio

 


一、XFS 文件系统的备份与还原

使用 tar 通常是针对目录树系统来进行备份的工作,那么如果想要针对整个文件系统来进行备份与还原呢?由于 CentOS 7 已经使用 XFS 文件系统作为默认值,所以那个好用的 xfsdump与 xfsrestore 两个工具对 CentOS 7 来说,就是挺重要的工具软件了。下面就让我们来谈一谈这个指令的用法吧!

1,XFS 文件系统备份 xfsdump

其实 xfsdump 的功能颇强!他除了可以进行文件系统的完整备份 (full backup) 之外,还可以进行累积备份 (Incremental backup) 喔! 啥是累积备份呢?这么说好了,假设你的/home 是独立的一个文件系统,那你在第一次使用 xfsdump 进行完整备份后,等过一段时间的文件系统自然运行后, 你再进行第二次 xfsdump 时,就可以选择累积备份了!此时新备份的数据只会记录与第一次完整备份所有差异的文件而已。 看不懂吗?没关系!我们用一张简图来说明。

如上图所示,上方的“实时文件系统”是一直随着时间而变化的数据,例如在 /home 里面的文件数据会一直变化一样。 而下面的方块则是 xfsdump 备份起来的数据,第一次备份一定是完整备份,完整备份在 xfsdump 当中被定义为 level 0 喔!等到第二次备份时,/home 文件系统内的数据已经与 level 0 不一样了,而 level 1 仅只是比较目前的文件系统与 level 0 之间的差异后,备份有变化过的文件而已。至于 level 2 则是与 level 1 进行比较啦!这样了解呼?至于各个 level 的纪录档则放置于 /var/lib/xfsdump/inventory 中。

另外,使用 xfsdump 时,请注意下面的限制喔:

xfsdump 不支持没有挂载的文件系统备份!所以只能备份已挂载的!

xfsdump 必须使用 root 的权限才能操作 (涉及文件系统的关系)

xfsdump 只能备份 XFS 文件系统啊!

xfsdump 备份下来的数据 (文件或储存媒体) 只能让 xfsrestore 解析

xfsdump 是通过文件系统的 UUID 来分辨各个备份文件的,因此不能备份两个具有相同UUID 的文件系统喔!

 

xfsdump 的选项虽然非常的繁复,不过如果只是想要简单的操作时,您只要记得下面的几个选项就很够用了!

[root@study ~]# xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据

[root@study ~]# xfsdump -I

选项与参数:

-L :xfsdump 会纪录每次备份的 session 标头,这里可以填写针对此文件系统的简易说明

-M :xfsdump 可以纪录储存媒体的标头,这里可以填写此媒体的简易说明

-l :是 L 的小写,就是指定等级~有 0~9 共 10 个等级喔! (默认为 0,即完整备份)

-f :有点类似 tar 啦!后面接产生的文件,亦可接例如 /dev/st0 设备文件名或其他一般文件文件名等

-I :从 /var/lib/xfsdump/inventory 列出目前备份的信息状态

 

特别注意, xfsdump 默认仅支持文件系统的备份,并不支持特定目录的备份~所以你不能用xfsdump 去备份 /etc ! 因为 /etc 从来就不是一个独立的文件系统!注意!注意!

 

用 xfsdump 备份完整的文件系统

 

现在就让我们来做几个范例吧!假设你跟鸟哥一样有将 /boot 分区出自己的文件系统,要整个文件系统备份可以这样作:

# 1\. 先确定 /boot 是独立的文件系统喔!

[root@study ~]# df -h /boot

Filesystem Size Used Avail Use% Mounted on

/dev/vda2 1014M 131M 884M 13% /boot # 挂载 /boot 的是 /dev/vda 设备!

# 看!确实是独立的文件系统喔! /boot 是挂载点!

# 2\. 将完整备份的文件名记录成为 /srv/boot.dump :

[root@study ~]# xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot

xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot

xfsdump: using file dump (drive_simple) strategy

xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control

xfsdump: level 0 dump of study.centos.vbird:/boot # 开始备份本机/boot系统

xfsdump: dump date: Wed Jul 1 18:43:04 2015 # 备份的时间

xfsdump: session id: 418b563f-26fa-4c9b-98b7-6f57ea0163b1 # 这次dump的ID

xfsdump: session label: "boot_all" # 简单给予一个名字记忆

xfsdump: ino map phase 1: constructing initial dump list # 开始备份程序

xfsdump: ino map phase 2: skipping (no pruning necessary)

xfsdump: ino map phase 3: skipping (only one dump stream)

xfsdump: ino map construction complete

xfsdump: estimated dump size: 103188992 Bytes

xfsdump: creating dump session media file 0 (media 0, file 0)

xfsdump: dumping ino map

xfsdump: dumping directories

xfsdump: dumping non-directory files

xfsdump: ending media file

xfsdump: media file size 102872168 Bytes

xfsdump: dump size (non-dir files) : 102637296 Bytes

xfsdump: dump complete: 1 seconds elapsed

xfsdump: Dump Summary:

xfsdump: stream 0 /srv/boot.dump OK (success)

xfsdump: Dump Status: SUCCESS

# 在指令的下达方面,你也可以不加 -L 及 -M 的,只是那就会进入互动模式,要求你 enter!

# 而执行 xfsdump 的过程中会出现如上的一些讯息,您可以自行仔细的观察!

[root@study ~]# ll /srv/boot.dump

-rw-r--r--. 1 root root 102872168 Jul 1 18:43 /srv/boot.dump

[root@study ~]# ll /var/lib/xfsdump/inventory

-rw-r--r--. 1 root root 5080 Jul 1 18:43 506425d2-396a-433d-9968-9b200db0c17c.StObj

-rw-r--r--. 1 root root 312 Jul 1 18:43 94ac5f77-cb8a-495e-a65b-2ef7442b837c.InvIndex

-rw-r--r--. 1 root root 576 Jul 1 18:43 fstab

# 使用了 xfsdump 之后才会有上述 /var/lib/xfsdump/inventory 内的文件产生喔!

 

这样很简单的就创建起来 /srv/boot.dump 文件,该文件将整个 /boot/ 文件系统都备份下来了! 并且将备份的相关信息 (文件系统/时间/session ID等等) 写入/var/lib/xfsdump/inventory 中,准备让下次备份时可以作为一个参考依据。 现在让我们来进行一个测试,检查看看能否真的创建 level 1 的备份呢?

 

用 xfsdump 进行累积备份 (Incremental backups)

 

你一定得要进行过完整备份后 (-l 0) 才能够继续有其他累积备份 (-l 1~9) 的能耐!所以,请确定上面的实做已经完成! 接下来让我们来搞一搞累积备份功能吧!

# 0\. 看一下有没有任何文件系统被 xfsdump 过的数据?

[root@study ~]# xfsdump -I

file system 0:

fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c

session 0:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

time: Wed Jul 1 18:43:04 2015

session label: "boot_all"

session id: 418b563f-26fa-4c9b-98b7-6f57ea0163b1

level: 0

resumed: NO

subtree: NO

streams: 1

stream 0:

pathname: /srv/boot.dump

start: ino 132 offset 0

end: ino 2138243 offset 0

interrupted: NO

media files: 1

media file 0:

mfile index: 0

mfile type: data

mfile size: 102872168

mfile start: ino 132 offset 0

mfile end: ino 2138243 offset 0

media label: "boot_all"

media id: a6168ea6-1ca8-44c1-8d88-95c863202eab

xfsdump: Dump Status: SUCCESS

# 我们可以看到目前仅有一个 session 0 的备份数据而已!而且是 level 0 喔!

# 1\. 先恶搞一下,创建一个大约 10 MB 的文件在 /boot 内:

[root@study ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10

10+0 records in

10+0 records out

10485760 Bytes (10 MB) copied, 0.166128 seconds, 63.1 MB/s

# 2\. 开始创建差异备份文件,此时我们使用 level 1 吧:

[root@study ~]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot

....(中间省略)....

[root@study ~]# ll /srv/boot*

-rw-r--r--. 1 root root 102872168 Jul 1 18:43 /srv/boot.dump

-rw-r--r--. 1 root root 10510952 Jul 1 18:46 /srv/boot.dump1

# 看看文件大小,岂不是就是刚刚我们所创建的那个大文件的容量吗? ^_^

# 3\. 最后再看一下是否有记录 level 1 备份的时间点呢?

[root@study ~]# xfsdump -I

file system 0:

fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c

session 0:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

....(中间省略)....

session 1:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

time: Wed Jul 1 18:46:21 2015

session label: "boot_2"

session id: c71d1d41-b3bb-48ee-bed6-d77c939c5ee8

level: 1

resumed: NO

subtree: NO

streams: 1

stream 0:

pathname: /srv/boot.dump1

start: ino 455518 offset 0

....(下面省略)

 

通过这个简单的方式,我们就能够仅备份差异文件的部分啰!

 

2,XFS 文件系统还原 xfsrestore

 

备份文件就是在急用时可以回复系统的重要数据,所以有备份当然就得要学学如何复原了!xfsdump 的复原使用的是 xfsrestore 这个指令!这个指令的选项也非常的多~您可以自行man xfsrestore 瞧瞧! 鸟哥在这里仅作个简单的介绍啰!

[root@study ~]# xfsrestore -I <==用来察看备份文件数据

[root@study ~]# xfsrestore [-f 备份文件] [-L S_label] [-s] 待复原目录 <==单一文件全系统复原

[root@study ~]# xfsrestore [-f 备份文件] -r 待复原目录 <==通过累积备份文件来复原系统

[root@study ~]# xfsrestore [-f 备份文件] -i 待复原目录 <==进入互动模式

选项与参数:

-I :跟 xfsdump 相同的输出!可查询备份数据,包括 Label 名称与备份时间等

-f :后面接的就是备份文件!企业界很有可能会接 /dev/st0 等磁带机!我们这里接文件名!

-L :就是 Session 的 Label name 喔!可用 -I 查询到的数据,在这个选项后输入!

-s :需要接某特定目录,亦即仅复原某一个文件或目录之意!

-r :如果是用文件来储存备份数据,那这个就不需要使用。如果是一个磁带内有多个文件,

需要这东西来达成累积复原

-i :进入互动模式,进阶管理员使用的!一般我们不太需要操作它!

 

用 xfsrestore 观察 xfsdump 后的备份数据内容

 

要找出 xfsdump 的内容就使用 xfsrestore -I 来查阅即可!不需要加任何参数!因为 xfsdump与 xfsrestore 都会到 /var/lib/xfsdump/inventory/ 里面去捞数据来显示的!因此两者输出是相同的!

[root@study ~]# xfsrestore -I

file system 0:

fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c

session 0:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

time: Wed Jul 1 18:43:04 2015

session label: "boot_all"

session id: 418b563f-26fa-4c9b-98b7-6f57ea0163b1

level: 0

pathname: /srv/boot.dump

mfile size: 102872168

media label: "boot_all"

session 1:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

time: Wed Jul 1 18:46:21 2015

session label: "boot_2"

session id: c71d1d41-b3bb-48ee-bed6-d77c939c5ee8

level: 1

pathname: /srv/boot.dump1

mfile size: 10510952

media label: "boot_2"

xfsrestore: Restore Status: SUCCESS

# 鸟哥已经将不重要的项目删除了,所以上面的输出是经过经简化的结果!

# 我们可以看到这个文件系统是 /boot 载点,然后有两个备份,一个 level 0 一个 level 1。

# 也看到这两个备份的数据他的内容大小!更重要的,就是那个 session label 喔!

 

这个查询重点是找出到底哪个文件是哪个挂载点?而该备份文件又是什么 level 等等的!接下来,让我们实做一下从备份还原系统吧!

 

简单复原 level 0 的文件系统

先来处理一个简单的任务,就是将 /boot 整个复原到最原本的状态~你该如何处理?其实很简单,我们只要知道想要被复原的那个文件, 以及该文件的 session label name,就可以复原啦!我们从上面的观察已经知道 level 0 的 session label 是“boot_all”啰!那整个流程是这样:

# 1\. 直接将数据给它覆盖回去即可!

[root@study ~]# xfsrestore -f /srv/boot.dump -L boot_all /boot

xfsrestore: using file dump (drive_simple) strategy

xfsrestore: version 3.1.4 (dump format 3.0) - type ^C for status and control

xfsrestore: using online session inventory

xfsrestore: searching media for directory dump

xfsrestore: examining media file 0

xfsrestore: reading directories

xfsrestore: 8 directories and 327 entries processed

xfsrestore: directory post-processing

xfsrestore: restoring non-directory files

xfsrestore: restore complete: 1 seconds elapsed

xfsrestore: Restore Summary:

xfsrestore: stream 0 /srv/boot.dump OK (success) # 是否是正确的文件啊?

xfsrestore: Restore Status: SUCCESS

# 2\. 将备份数据在 /tmp/boot 下面解开!

[root@study ~]# mkdir /tmp/boot

[root@study ~]# xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot

[root@study ~]# du -sm /boot /tmp/boot

109 /boot

99 /tmp/boot

# 咦!两者怎么大小不一致呢?没关系!我们来检查看看!

[root@study ~]# diff -r /boot /tmp/boot

Only in /boot: testing.img

# 看吧!原来是 /boot 我们有增加过一个文件啦!

 

因为原本 /boot 里面的东西我们没有删除,直接复原的结果就是:“同名的文件会被覆盖,其他系统内新的文件会被保留”喔!所以, 那个 /boot/testing.img 就会一直在里头~如果备份的目的地是新的位置,当然就只有原本备份的数据而已啊!那个 diff -r 可以比较两个目录内的文件差异! 通过该指令我们可以找到两个目录的差异处!

 

# 3\. 仅复原备份文件内的 grub2 到 /tmp/boot2/ 里头去!

[root@study ~]# mkdir /tmp/boot2

[root@study ~]# xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2

 

如果只想要复原某一个目录或文件的话,直接加上“ -s 目录 ”这个选项与参数即可!相当简单好用!

复原累积备份数据

 

其实复原累积备份与复原单一文件系统相似耶!如果备份数据是由 level 0 -> level 1 -> level2... 去进行的, 当然复原就得要相同的流程来复原!因此当我们复原了 level 0 之后,接下来当然就要复原 level 1 到系统内啊! 我们可以前一个案例复原 /tmp/boot 的情况来继续往下处理:

# 继续复原 level 1 到 /tmp/boot 当中!

[root@study ~]# xfsrestore -f /srv/boot.dump1 /tmp/boot

 

仅还原部分文件的 xfsrestore 互动模式

 

刚刚的 -s 可以接部份数据来还原,但是...如果我就根本不知道备份文件里面有啥文件,那该如何选择啊?用猜的喔? 又如果要复原的文件数量太多时,用 -s 似乎也是笨笨的~那怎办?有没有比较好的方式呢?有的,就通过 -i 这个互动界面吧! 举例来说,我们想要知道 level 0的备份数据里面有哪些东西,然后再少量的还原回来的话!

# 1\. 先进入备份文件内,准备找出需要备份的文件名数据,同时预计还原到 /tmp/boot3 当中!

[root@study ~]# mkdir /tmp/boot3

[root@study ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot3

========================== subtree selection dialog ==========================

the following commands are available:

pwd

ls [ <path> ]

cd [ <path> ]

add [ <path> ] # 可以加入复原文件列表中

delete [ <path> ] # 从复原列表拿掉文件名!并非删除喔!

extract # 开始复原动作!

quit

help

-> ls

455517 initramfs-3.10.0-229.el7.x86_64kdump.img

138 initramfs-3.10.0-229.el7.x86_64.img

141 initrd-plymouth.img

140 vmlinuz-0-rescue-309eb890d09f440681f596543d95ec7a

139 initramfs-0-rescue-309eb890d09f440681f596543d95ec7a.img

137 vmlinuz-3.10.0-229.el7.x86_64

136 symvers-3.10.0-229.el7.x86_64.gz

135 config-3.10.0-229.el7.x86_64

134 System.map-3.10.0-229.el7.x86_64

133 .vmlinuz-3.10.0-229.el7.x86_64.hmac

1048704 grub2/

131 grub/

-> add grub

-> add grub2

-> add config-3.10.0-229.el7.x86_64

-> extract

[root@study ~]# ls -l /tmp/boot3

-rw-r--r--. 1 root root 123838 Mar 6 19:45 config-3.10.0-229.el7.x86_64

drwxr-xr-x. 2 root root 26 May 4 17:52 grub

drwxr-xr-x. 6 root root 104 Jun 25 00:02 grub2

# 就只会有 3 个文件名被复原,当然,如果文件名是目录,那下面的子文件当然也会被还原回来的!

事实上,这个 -i 是很有帮助的一个项目!可以从备份文件里面找出你所需要的数据来复原!相当有趣!当然啦, 如果你已经知道文件名,使用 -s 不需要进入备份文件就能够处理掉这部份了!

 

二、光盘写入工具

 

事实上,企业还是挺爱用磁带来进行备份的,容量高、储存时限长、挺耐摔等等,至于以前很热门的 DVD/CD 等,则因为储存速度慢、 容量没有大幅度提升,所以目前除了行政部门为了“归档”而需要的工作之外,这个咚咚的存在性已经被 U盘所取代了。 你可能会谈到说,不是还有蓝光嘛?但这家伙目前主要应用还是在多媒体影音方面,如果要大容量的储存,个人建议,还是使用 USB 外接式硬盘, 一颗好几个 TB 给你用,不是更爽嘛?所以,鸟哥是认为,DVD/CD 虽然还是有存在的价值 (例如前面讲的归档),不过,越来越少人使用了。

虽然很少使用,不过,某些特别的情况下,没有这东西又不行~因此,我们还是来介绍一下创建光盘镜像文件以及烧录软件吧! 否则,偶而需要用到时,找不到软件数据还挺伤脑筋的!文字模式的烧录行为要怎么处理呢?通常的作法是这样的:

先将所需要备份的数据创建成为一个镜像文件(iso),利用 mkisofs 指令来处理;

将该镜像文件烧录至光盘或 DVD 当中,利用 cdrecord 指令来处理。

 

下面我们就分别来谈谈这两个指令的用法吧!

1,mkisofs:创建镜像文件

烧录可开机与不可开机的光盘,使用的方法不太一样喔 !

制作一般数据光盘镜像文件

 

我们从 FTP 站捉下来的 Linux 镜像文件 (不管是 CD 还是 DVD) 都得要继续烧录成为实体的光盘/DVD 后, 才能够进一步的使用,包括安装或更新你的 Linux 啦!同样的道理,你想要利用烧录机将你的数据烧录到 DVD 时, 也得要先将你的数据包成一个镜像文件,这样才能够写入DVD片中。而将你的数据包成一个镜像文件的方式就通过 mkisofs 这个指令即可。mkisofs 的使用方式如下:

[root@study ~]# mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件... \

> -graft-point isodir=systemdir ...

选项与参数:

-o :后面接你想要产生的那个镜像文件文件名。

-J :产生较相容于 windows 机器的文件名结构,可增加文件名长度到 64 个 unicode 字符

-r :通过 Rock Ridge 产生支持 Unix/Linux 的文件数据,可记录较多的信息(如 UID/GID等) ;

-v :显示创建 ISO文件的过程

-V vol :创建 Volume,有点像 Windows 在文件资源管理器内看到的 CD title 的东西

-m file :-m 为排除文件 (exclude) 的意思,后面的文件不备份到镜像文件中,也能使用 * 万用字符喔

-graft-point:graft有转嫁或移植的意思,相关数据在下面文章内说明。

 

其实 mkisofs 有非常多好用的选项可以选择,不过如果我们只是想要制作“数据光盘”时,上述的选项也就够用了。 光盘的格式一般称为 iso9660 ,这种格式一般仅支持旧版的 DOS 文件名,亦即文件名只能以 8.3 (文件名8个字符,扩展名3个字符) 的方式存在。如果加上 -r 的选项之后,那么文件信息能够被记录的比较完整,可包括UID/GID与权限等等! 所以,记得加这个 -r 的选项。

此外,一般默认的情况下,所有要被加到镜像文件中的文件都会被放置到镜像文件中的根目录, 如此一来可能会造成烧录后的文件分类不易的情况。所以,你可以使用 -graft-point 这个选项,当你使用这个选项之后, 可以利用如下的方法来定义位于镜像文件中的目录,例如:

镜像文件中的目录所在=实际 Linux 文件系统的目录所在

/movies/=/srv/movies/ (在 Linux 的 /srv/movies 内的文件,加至镜像文件中的 /movies/目录)

/linux/etc=/etc (将 Linux 中的 /etc/ 内的所有数据备份到镜像文件中的 /linux/etc/ 目录中)

 

我们通过一个简单的范例来说明一下吧。如果你想要将 /root, /home, /etc 等目录内的数据通通烧录起来的话, 先得要处理一下镜像文件,我们先不使用 -graft-point 的选项来处理这个镜像文件试看看:

[root@study ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc

I: -input-charset not specified, using utf-8 (detected in locale settings)

genisoimage 1.1.11 (Linux)

Scanning /root

.....(中间省略).....

Scanning /etc/scl/prefixes

Using SYSTE000.;1 for /system-release-cpe (system-release) # 被改名子了!

Using CENTO000.;1 for /centos-release-upstream (centos-release) # 被改名子了!

Using CRONT000.;1 for /crontab (crontab)

genisoimage: Error: '/etc/crontab' and '/root/crontab' have the same Rock Ridge name 'crontab'.

Unable to sort directory # 文件名不可一样啊!

NOTE: multiple source directories have been specified and merged into the root

of the filesystem. Check your program arguments. genisoimage is not tar.

# 看到没?因为文件名一模一样,所以就不给你创建 ISO 档了啦!

# 请先删除 /root/crontab 这个文件,然后再重复执行一次 mkisofs 吧!

[root@study ~]# rm /root/crontab

[root@study ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc

.....(前面省略).....

83.91% done, estimate finish Thu Jul 2 18:48:04 2015

92.29% done, estimate finish Thu Jul 2 18:48:04 2015

Total translation table size: 0

Total rockridge attributes Bytes: 600251

Total directory Bytes: 2150400

Path table size(Bytes): 12598

Done with: The File(s) Block(s) 58329

Writing: Ending Padblock Start Block 59449

Done with: Ending Padblock Block(s) 150

Max brk space used 548000

59599 extents written (116 MB)

[root@study ~]# ll -h /tmp/system.img

-rw-r--r--. 1 root root 117M Jul 2 18:48 /tmp/system.img

[root@study ~]# mount -o loop /tmp/system.img /mnt

[root@study ~]# df -h /mnt

Filesystem Size Used Avail Use% Mounted on

/dev/loop0 117M 117M 0 100% /mnt

[root@study ~]# ls /mnt

abrt festival mail.rc rsyncd.conf

adjtime filesystems makedumpfile.conf.sample rsyslog.conf

alex firewalld man_db.conf rsyslog.d

# 看吧!一堆数据都放置在一起!包括有的没有的目录与文件等等!

[root@study ~]# umount /mnt

# 测试完毕要记得卸载!

由上面的范例我们可以看到,三个目录 (/root, /home, /etc) 的数据通通放置到了镜像文件的最顶层目录中! 真是不方便~尤其由于 /root/etc 的存在,导致那个 /etc 的数据似乎没有被包含进来的样子!真不合理~ 此时我们可以使用 -graft-point 来处理啰!

 

[root@study ~]# mkisofs -r -V 'linux_file' -o /tmp/system.img \

> -m /root/etc -graft-point /root=/root /home=/home /etc=/etc

[root@study ~]# ll -h /tmp/system.img

-rw-r--r--. 1 root root 92M Jul 2 19:00 /tmp/system.img

# 上面的指令会创建一个大文件,其中 -graft-point 后面接的就是我们要备份的数据。

# 必须要注意的是那个等号的两边,等号左边是在镜像文件内的目录,右侧则是实际的数据。

[root@study ~]# mount -o loop /tmp/system.img /mnt

[root@study ~]# 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

# 瞧!数据是分门别类的在各个目录中喔这样了解乎?最后将数据卸载一下:

[root@study ~]# umount /mnt

 

如果你想要将实际的数据直接倒进 ISO 档中,那就得要使用这个 -graft-point 来处理处理比较妥当!不然没有分第一层目录, 后面的数据管理实在是很麻烦。如果你是有自己要制作的数据内容,其实最简单的方法,就是将所有的数据预先处理到某一个目录中, 再烧录该目录即可!例如上述的 /etc, /root, /home 先全部复制到 /srv/cdrom 当中,然后跑到 /srv/cdrom 当中, 再使用类似“ mkisofs -r -v -o /tmp/system.img . ”的方式来处理即可!这样也比较单纯~

制作/修改可开机光盘图像挡

 

在鸟哥的研究室中,学生常被要求要制作“一键安装”的安装光盘!也就是说,得要修改原版的光盘镜像文件,改成可以自动载入某些程序的流程, 让这片光盘放入主机光驱后,只要开机利用光盘片来开机,那就直接安装系统,不再需要询问管理员一些有的没有的!等于是自动化处理啦! 那些流程比较麻烦,因为得要知道 kickstart 的相关技术等,那个我们先不谈,这里要谈的是,那如何让这片光盘的内容被修改之后, 还可以烧录成为可开机的模样呢?

因为鸟哥这部测试机的容量比较小,又仅是测试而已啊,因此鸟哥选择 CentOS-7-x86_64-Minimal-1503-01.iso 这个最小安装光盘镜像文件来测试给各位瞧瞧! 假设你已经到昆山科大http://ftp.ksu.edu.tw/FTP/CentOS/7/isos/x86_64/ 取得了最小安装的 Image 档,而且放在/home 下面~之后我们要将里头的数据进行修改,假设新的镜像文件目录放置于 /srv/newcd里面,那你应该要这样做:

# 1\. 先观察一下这片光盘里面有啥东西?是否是我们需要的光盘系统!

[root@study ~]# isoinfo -d -i /home/CentOS-7-x86_64-Minimal-1503-01.iso

CD-ROM is in ISO 9660 format

System id: LINUX

Volume id: CentOS 7 x86_64

Volume set id:

Publisher id:

Data preparer id:

Application id: GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) ...

Copyright File id:

.....(中间省略).....

Eltorito defaultboot header:

Bootid 88 (bootable)

Boot media 0 (No Emulation Boot)

Load segment 0

Sys type 0

Nsect 4

# 2\. 开始挂载这片光盘到 /mnt ,并且将所有数据完整复制到 /srv/newcd 目录去喔

[root@study ~]# mount /home/CentOS-7-x86_64-Minimal-1503-01.iso /mnt

[root@study ~]# mkdir /srv/newcd

[root@study ~]# rsync -a /mnt/ /srv/newcd

[root@study ~]# ll /srv/newcd/

-rw-r--r--. 1 root root 16 Apr 1 07:11 CentOS_BuildTag

drwxr-xr-x. 3 root root 33 Mar 28 06:34 EFI

-rw-r--r--. 1 root root 215 Mar 28 06:36 EULA

-rw-r--r--. 1 root root 18009 Mar 28 06:36 GPL

drwxr-xr-x. 3 root root 54 Mar 28 06:34 images

drwxr-xr-x. 2 root root 4096 Mar 28 06:34 isolinux

drwxr-xr-x. 2 root root 41 Mar 28 06:34 LiveOS

drwxr-xr-x. 2 root root 20480 Apr 1 07:11 Packages

drwxr-xr-x. 2 root root 4096 Apr 1 07:11 repodata

-rw-r--r--. 1 root root 1690 Mar 28 06:36 RPM-GPG-KEY-CentOS-7

-rw-r--r--. 1 root root 1690 Mar 28 06:36 RPM-GPG-KEY-CentOS-Testing-7

-r--r--r--. 1 root root 2883 Apr 1 07:15 TRANS.TBL

# rsync 可以完整的复制所有的权限属性等数据,也能够进行镜像处理!相当好用的指令喔!

# 这里先了解一下即可。现在 newcd/ 目录内已经是完整的镜像文件内容!

# 3\. 假设已经处理完毕你在 /srv/newcd 里面所要进行的各项修改行为,准备创建 ISO 档!

[root@study ~]# ll /srv/newcd/isolinux/

-r--r--r--. 1 root root 2048 Apr 1 07:15 boot.cat # 开机的型号数据等等

-rw-r--r--. 1 root root 84 Mar 28 06:34 boot.msg

-rw-r--r--. 1 root root 281 Mar 28 06:34 grub.conf

-rw-r--r--. 1 root root 35745476 Mar 28 06:31 initrd.img

-rw-r--r--. 1 root root 24576 Mar 28 06:38 isolinux.bin # 相当于开机管理程序

-rw-r--r--. 1 root root 3032 Mar 28 06:34 isolinux.cfg

-rw-r--r--. 1 root root 176500 Sep 11 2014 memtest

-rw-r--r--. 1 root root 186 Jul 2 2014 splash.png

-r--r--r--. 1 root root 2438 Apr 1 07:15 TRANS.TBL

-rw-r--r--. 1 root root 33997348 Mar 28 06:33 upgrade.img

-rw-r--r--. 1 root root 153104 Mar 6 13:46 vesamenu.c32

-rwxr-xr-x. 1 root root 5029136 Mar 6 19:45 vmlinuz # Linux 核心文件

[root@study ~]# cd /srv/newcd

[root@study newcd]# mkisofs -o /custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \

> -no-emul-boot -V 'CentOS 7 x86_64' -boot-load-size 4 -boot-info-table -R -J -v -T .

 

此时你就有一个 /custom.img 的文件存在,可以将该光盘烧录出来啰!就这么简单!

 

2,cdrecord:光盘烧录工具

 

新版的 CentOS 7 使用的是 wodim 这个文字界面指令来进行烧录的行为。不过为了相容于旧版的 cdrecord 这个指令, 因此 wodim 也有链接到 cdrecord 就是了!因此,你还是可以使用cdrecord 这个指令。不过,鸟哥建议还是改用 wodim 比较干脆! 这个指令常见的选项有下面数个:

[root@study ~]# wodim --devices dev=/dev/sr0... <==查询烧录机的 BUS 位置

[root@study ~]# wodim -v dev=/dev/sr0 blank=[fast|all] <==抹除重复读写片

[root@study ~]# wodim -v dev=/dev/sr0 -format <==格式化DVD+RW

[root@study ~]# wodim -v dev=/dev/sr0 [可用选项功能] file.iso

选项与参数:

--devices :用在扫瞄磁盘总线并找出可用的烧录机,后续的设备为 ATA 接口

-v :在 cdrecord 运行的过程中,显示过程而已。

dev=/dev/sr0 :可以找出此光驱的 bus 位址,非常重要!

blank=[fast|all]:blank 为抹除可重复写入的CD/DVD-RW,使用fast较快,all较完整

-format :对光盘片进行格式化,但是仅针对 DVD+RW 这种格式的 DVD 而已;

[可用选项功能] 主要是写入 CD/DVD 时可使用的选项,常见的选项包括有:

-data :指定后面的文件以数据格式写入,不是以 CD 音轨(-audio)方式写入!

speed=X :指定烧录速度,例如CD可用 speed=40 为40倍数,DVD则可用 speed=4 之类

-eject :指定烧录完毕后自动退出光盘

fs=Ym :指定多少缓冲内存,可用在将镜像文件先暂存至缓冲内存。默认为 4m,

一般建议可增加到 8m ,不过,还是得视你的烧录机而定。

针对 DVD 的选项功能:

driveropts=burnfree :打开 Buffer Underrun Free 模式的写入功能

-sao :支持 DVD-RW 的格式

 

侦测你的烧录机所在位置:

 

文字模式的烧录确实是比较麻烦的,因为没有所见即所得的环境嘛!要烧录首先就得要找到烧录机才行! 而由于早期的烧录机都是使用 SCSI 接口,因此查询烧录机的方法就得要配合着 SCSI 接口的认定来处理了。 查询烧录机的方式为:

[root@study ~]# ll /dev/sr0

brw-rw----+ 1 root cdrom 11, 0 Jun 26 22:14 /dev/sr0 # 一般 Linux 光驱文件名!

[root@study ~]# wodim --devices dev=/dev/sr0

-------------------------------------------------------------------------

0 dev='/dev/sr0' rwrw-- : 'QEMU' 'QEMU DVD-ROM'

-------------------------------------------------------------------------

[root@demo ~]# wodim --devices dev=/dev/sr0

wodim: Overview of accessible drives (1 found) :

-------------------------------------------------------------------------

0 dev='/dev/sr0' rwrw-- : 'ASUS' 'DRW-24D1ST'

-------------------------------------------------------------------------

# 你可以发现到其实鸟哥做了两个测试!上面的那部主机系统是虚拟机,当然光驱也是仿真的,没法用。

# 因此在这里与下面的 wodim 用法,鸟哥只能使用另一部 Demo 机器测试给大家看了!

 

因为上面那部机器是虚拟机内的虚拟光驱 (QEMU DVD-ROM),那个无法塞入真正的光盘片啦!真讨厌~所以鸟哥只好找另一部实体 CentOS 7 的主机系统来测试。 因此你可以看到下面那部使用的就是正统的 ASUS 光驱了!这样会查阅了吗?注意喔,一定要有dev=/dev/xxx 那一段,不然系统会告诉你找不到光盘! 这真的是很奇怪!不过,反正我们知道光驱的文件名为 /dev/sr0 之类的,直接带入即可。

进行 CD/DVD 的烧录动作:

 

好了,那么现在要如何将 /tmp/system.img 烧录到 CD/DVD 里面去呢?因为要节省空间与避免浪费,鸟哥拿之前多买的可重复读写的 DVD 四倍数 DVD 片来操作! 因为是可抹除的DVD,因此可能得要在烧录前先抹除 DVD 片里面的数据才行喔!

# 0\. 先抹除光盘的原始内容:(非可重复读写则可略过此步骤)

[root@demo ~]# wodim -v dev=/dev/sr0 blank=fast

# 中间会跑出一堆讯息告诉你抹除的进度,而且会有 10 秒钟的时间等待你的取消!

# 1\. 开始烧录:

[root@demo ~]# wodim -v dev=/dev/sr0 speed=4 -dummy -eject /tmp/system.img

....(前面省略)....

Waiting for reader process to fill input buffer ... input buffer ready.

Starting new track at sector: 0

Track 01: 86 of 86 MB written (fifo 100%) [buf 97%] 4.0x. # 这里有流程时间!

Track 01: Total Bytes read/written: 90937344/90937344 (44403 sectors).

Writing time: 38.337s # 写入的总时间

Average write speed 1.7x. # 换算下来的写入时间

Min drive buffer fill was 97%

Fixating...

Fixating time: 120.943s

wodim: fifo had 1433 puts and 1433 gets.

wodim: fifo was 0 times empty and 777 times full, min fill was 89%.

# 因为有加上 -eject 这个选项的缘故,因此烧录完成后,DVD 会被退出光驱喔!记得推回去!

# 2\. 烧录完毕后,测试挂载一下,检验内容:

[root@demo ~]# mount /dev/sr0/mnt

[root@demo ~]# df -h /mnt

Filesystem Size Used Avail Use% Mounted on

Filesystem Size Used Avail Use% Mounted on

/dev/sr0 87M 87M 0 100% /mnt

[root@demo ~]# ll /mnt

dr-xr-xr-x. 135 root root 36864 Jun 30 04:00 etc

dr-xr-xr-x. 19 root root 8192 Jul 2 13:16 root

[root@demo ~]# umount /mnt <==不要忘了卸载

 

基本上,光盘烧录的指令越来越简单,虽然有很多的参数可以使用,不过,鸟哥认为,学习上面的语法就很足够了! 一般来说,如果有烧录的需求,大多还是使用图形界面的软件来处理比较妥当~使用文字界面的烧录,真的大部分都是烧录数据光盘较多。 因此,上面的语法已经足够工程师的使用啰!

如果你的 Linux 是用来做为服务器之用的话,那么无时无刻的去想“如何备份重要数据”是相当重要的! 关于备份我们会在第五篇再仔细的谈一谈,这里你要会使用这些工具即可!

 

三、其他常见的压缩与备份工具

 

还有一些很好用的工具得要跟大家介绍介绍,尤其是 dd 这个玩意儿呢!

1,dd

 

我们在第七章当中的特殊 loop 设备挂载时使用过 dd 这个指令对吧? 不过,这个指令可不只是制作一个文件而已喔~这个 dd 指令最大的功效,鸟哥认为,应该是在于“备份”啊! 因为dd 可以读取磁盘设备的内容(几乎是直接读取扇区"sector"),然后将整个设备备份成一个文件呢!真的是相当的好用啊~ dd 的用途有很多啦~但是我们仅讲一些比较重要的选项,如下:

[root@study ~]# dd if="input_file" of="output_file" bs="block_size" count="number"

选项与参数:

if :就是 input file 啰~也可以是设备喔!

of :就是 output file 喔~也可以是设备;

bs :规划的一个 block 的大小,若未指定则默认是 512 Bytes(一个 sector 的大小)

count:多少个 bs 的意思。

范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中

[root@study ~]# dd if=/etc/passwd of=/tmp/passwd.back

4+1 records in

4+1 records out

2092 Bytes (2.1 kB) copied, 0.000111657 s, 18.7 MB/s

[root@study ~]# ll /etc/passwd /tmp/passwd.back

-rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd

-rw-r--r--. 1 root root 2092 Jul 2 23:27 /tmp/passwd.back

# 仔细的看一下,我的 /etc/passwd 文件大小为 2092 Bytes,因为我没有设置 bs ,

# 所以默认是 512 Bytes 为一个单位,因此,上面那个 4+1 表示有 4 个完整的 512 Bytes,

# 以及未满 512 Bytes 的另一个 block 的意思啦!事实上,感觉好像是 cp 这个指令啦~

范例二:将刚刚烧录的光驱的内容,再次的备份下来成为图像挡

[root@study ~]# 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

# 要将数据抓下来用这个方法,如果是要将镜像文件写入 USB 磁盘,就会变如下一个范例啰!

范例三:假设你的 USB 是 /dev/sda 好了,请将刚刚范例二的 image 烧录到 USB 磁盘中

[root@study ~]# lsblk /dev/sda

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sda 8:0 0 2G 0 disk # 确实是 disk 而且有 2GB 喔!

[root@study ~]# dd if=/tmp/system.iso of=/dev/sda

[root@study ~]# mount /dev/sda /mnt

[root@study ~]# 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

# 如果你不想要使用 DVD 来作为开机媒体,那可以将镜像文件使用这个 dd 写入 USB 磁盘,

# 该磁盘就会变成跟可开机光盘一样的功能!可以让你用 USB 来安装 Linux 喔!速度快很多!

范例四:将你的 /boot 整个文件系统通过 dd 备份下来

[root@study ~]# df -h /boot

Filesystem Size Used Avail Use% Mounted on

/dev/vda2 1014M 149M 866M 15% /boot # 请注意!备份的容量会到 1G 喔!

[root@study ~]# dd if=/dev/vda2 of=/tmp/vda2.img

[root@study ~]# ll -h /tmp/vda2.img

-rw-r--r--. 1 root root 1.0G Jul 2 23:39 /tmp/vda2.img

# 等于是将整个 /dev/vda2 通通捉下来的意思~所以,文件大小会跟整颗磁盘的最大量一样大!

 

其实使用 dd 来备份是莫可奈何的情况,很笨耶!因为默认 dd 是一个一个扇区去读/写的,而且即使没有用到的扇区也会倍写入备份文件中! 因此这个文件会变得跟原本的磁盘一模一样大!不像使用 xfsdump 只备份文件系统中有使用到的部份。不过, dd 就是因为不理会文件系统, 单纯有啥纪录啥,因此不论该磁盘内的文件系统你是否认识,它都可以备份、还原的!所以,鸟哥认为,上述的第三个案例是比较重要的学习喔!

例题:你想要将你的 /dev/vda2 进行完整的复制到另一个 partition 上,请使用你的系统上面未分区完毕的容量再创建一个与 /dev/vda2 差不多大小的分区 (只能比 /dev/vda2 大,不能比他小!),然后将之进行完整的复制 (包括需要复制 boot sector 的区块)。答:因为我们的 /dev/sda 也是个测试的 USB 磁盘,可以随意恶搞!我们刚刚也才测试过将光盘镜像文件给它复制进去而已。 现在,请你分区 /dev/sda1 出来,然后将 /dev/vda2 完整的拷贝进去/dev/sda1 吧!

# 1\. 先进行分区的动作

[root@study ~]# 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@study ~]# partprobe

# 2\. 不需要格式化,直接进行 sector 表面的复制!

[root@study ~]# 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@study ~]# xfs_repair -L /dev/sda1 # 一定要先清除一堆 log 才行!

[root@study ~]# uuidgen # 下面两行在给予一个新的 UUID

896c38d1-bcb5-475f-83f1-172ab38c9a0c

[root@study ~]# xfs_admin -U 896c38d1-bcb5-475f-83f1-172ab38c9a0c /dev/sda1

# 因为 XFS 文件系统主要使用 UUID 来分辨文件系统,但我们使用 dd 复制,连 UUID

# 也都复制成为相同!当然就得要使用上述的 xfs_repair 及 xfs_admin 来修订一下!

[root@study ~]# mount /dev/sda1 /mnt

[root@study ~]# 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@study ~]# xfs_growfs /mnt

[root@study ~]# 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@study ~]# umount /mnt

 

非常有趣的范例吧!新分区出来的 partition 不需要经过格式化,因为 dd 可以将原本旧的partition 上面,将 sector 表面的数据整个复制过来! 当然连同 superblock, boot sector, metadata 等等通通也会复制过来!是否很有趣呢?未来你想要创建两颗一模一样的磁盘时, 只要下达类似: dd if=/dev/sda of=/dev/sdb ,就能够让两颗磁盘一模一样,甚至 /dev/sdb 不需要分区与格式化, 因为该指令可以将 /dev/sda 内的所有数据,包括 MBR 与 partition table 也复制到 /dev/sdb 说! ^_^

话说,用 dd 来处理这方面的事情真的是很方便,你也不需考虑到啥有的没的,通通是磁盘表面的复制而已!不过如果真的用在文件系统上面, 例如上面这个案例,那么再次挂载时,恐怕得要理解一下每种文件系统的挂载要求!以上面的案例来说,你就得要先清除 XFS 文件系统内的 log 之后, 重新给予一个跟原本不一样的 UUID 后,才能够顺利挂载!同时,为了让系统继续利用后续没有用到的磁盘空间,那个 xfs_growfs 就得要理解一下。 关于 xfs_growfs我们会在后续第十四章继续强调!这里先理解即可。

 

2,cpio

 

这个指令挺有趣的,因为 cpio 可以备份任何东西,包括设备设备文件。不过 cpio 有个大问题, 那就是 cpio 不会主动的去找文件来备份!啊!那怎办?所以啰,一般来说, cpio 得要配合类似 find 等可以找到文件名的指令来告知 cpio 该被备份的数据在哪里啊! 有点小麻烦啦~因为牵涉到我们在第三篇才会谈到的数据流重导向说~ 所以这里你就先背一下语法,等到第三篇讲完你就知道如何使用 cpio 啰!

[root@study ~]# cpio -ovcB > [file|device] <==备份

[root@study ~]# cpio -ivcdu < [file|device] <==还原

[root@study ~]# cpio -ivct < [file|device] <==察看

备份会使用到的选项与参数:

-o :将数据 copy 输出到文件或设备上

-B :让默认的 Blocks 可以增加至 5120 Bytes ,默认是 512 Bytes !

这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)

还原会使用到的选项与参数:

-i :将数据自文件或设备 copy 出来系统当中

-d :自动创建目录!使用 cpio 所备份的数据内容不见得会在同一层目录中,因此我们

必须要让 cpio 在还原时可以创建新目录,此时就得要 -d 选项的帮助!

-u :自动的将较新的文件覆盖较旧的文件!

-t :需配合 -i 选项,可用在"察看"以 cpio 创建的文件或设备的内容

一些可共享的选项与参数:

-v :让储存的过程中文件名称可以在屏幕上显示

-c :一种较新的 portable format 方式储存

 

你应该会发现一件事情,就是上述的选项与指令中怎么会没有指定需要备份的数据呢?还有那个大于 (>) 与小于 (<) 符号是怎么回事啊?因为 cpio 会将数据整个显示到屏幕上,因此我们可以通过将这些屏幕的数据重新导向 (>) 一个新的文件! 至于还原呢?就是将备份文件读进来 cpio (<) 进行处理之意!我们来进行几个案例你就知道啥是啥了!

范例:找出 /boot 下面的所有文件,然后将他备份到 /tmp/boot.cpio 去!

[root@study ~]# cd /

[root@study /]# find boot -print

boot

boot/grub

boot/grub/splash.xpm.gz

....(以下省略)....

# 通过 find 我们可以找到 boot 下面应该要存在的文件名!包括文件与目录!但请千万不要是绝对路径!

[root@study /]# find boot &#124; cpio -ocvB &gt; /tmp/boot.cpio

[root@study /]# ll -h /tmp/boot.cpio

-rw-r--r--. 1 root root 108M Jul 3 00:05 /tmp/boot.cpio

[root@study ~]# file /tmp/boot.cpio

/tmp/boot.cpio: ASCII cpio archive (SVR4 with no CRC)

 

我们使用 find boot 可以找出文件名,然后通过那条管线 (|, 亦即键盘上的 shift+\ 的组合),就能将文件名传给 cpio 来进行处理!最终会得到 /tmp/boot.cpio 那个文件喔!你可能会觉得奇怪,为啥鸟哥要先转换目录到 / 再去找 boot 呢? 为何不能直接找 /boot 呢?这是因为 cpio很笨!它不会理会你给的是绝对路径还是相对路径的文件名,所以如果你加上绝对路径的 / 开头, 那么未来解开的时候,它就一定会覆盖掉原本的 /boot 耶!那就太危险了!这个我们在tar 也稍微讲过那个 -P 的选项!!理解吧! 好了,那接下来让我们来进行解压缩看看。

范例:将刚刚的文件给他在 /root/ 目录下解开

[root@study ~]# cd ~

[root@study ~]# cpio -idvc &lt; /tmp/boot.cpio

[root@study ~]# ll /root/boot

# 你可以自行比较一下 /root/boot 与 /boot 的内容是否一模一样!

 

事实上 cpio 可以将系统的数据完整的备份到磁带机上头去喔!如果你有磁带机的话!

备份:find / | cpio -ocvB > /dev/st0

还原:cpio -idvc < /dev/st0

 

这个 cpio 好像不怎么好用呦!但是,他可是备份的时候的一项利器呢!因为他可以备份任何的文件, 包括 /dev 下面的任何设备文件!所以他可是相当重要的呢!而由于 cpio 必需要配合其他的程序,例如 find 来创建文件名,所以 cpio 与管线命令及数据流重导向的相关性就相当的重要了!

其实系统里面已经含有一个使用 cpio 创建的文件喔!那就是 /boot/initramfs-xxx 这个文件啦!现在让我们来将这个文件解压缩看看,看你能不能发现该文件的内容为何?

# 1\. 我们先来看看该文件是属于什么文件格式,然后再加以处理:

[root@study ~]# file /boot/initramfs-3.10.0-229.el7.x86_64.img

/boot/initramfs-3.10.0-229.el7.x86_64.img: ASCII cpio archive (SVR4 with no CRC)

[root@study ~]# mkdir /tmp/initramfs

[root@study ~]# cd /tmp/initramfs

[root@study initramfs]# cpio -idvc &lt; /boot/initramfs-3.10.0-229.el7.x86_64.img

.

kernel

kernel/x86

kernel/x86/microcode

kernel/x86/microcode/GenuineIntel.bin

early_cpio

22 blocks

# 瞧!这样就将这个文件解开啰!这样了解乎?

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统中的XFS文件系统误删除文件并且没有备份时,有几种方法可以尝试恢复丢失的文件。 首先,使用一些文件恢复工具可以尝试从未使用的磁盘空间中恢复被删除的文件。有一些工具如TestDisk、PhotoRec等,它们可以扫描磁盘,并通过识别文件的签名来恢复被删除的文件。它们可以在终端中运行,并且通常可以免费获取。 其次,可以尝试使用XFS文件系统自带的一些工具来恢复误删除的文件。XFS文件系统提供了一些工具xfs_restore、xfs_ls、xfs_quota等,它们可以帮助用户查找和恢复被删除的文件。通过这些工具,用户可以在文件系统中搜索并找回之前删除的文件。 另外,还可以考虑使用数据恢复服务来找回被误删除的文件。这些服务通常需要费用,并且可能需要将受损的磁盘发送给专业的数据恢复公司。这些专业的公司有着更高级的设备和技术,可以尝试从磁盘中恢复丢失的数据。 最后,鉴于误删除文件可能会导致数据的永久丢失,因此在使用Linux系统时,定期进行数据备份非常重要。通过定期备份,即使误删除了文件,也可以从备份中恢复数据,减少数据损失风险。 总之,虽然在Linux系统中误删除文件且没有备份恢复是一项具有挑战性的任务,但仍然有一些方法可以尝试恢复丢失的文件。无论采取哪种方法,都应该牢记数据备份的重要性,以避免类似情况的再次发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值