linux学习(21)常见的压缩与备份工具 dd cpio

2023-11-02 13:48

本文主要是介绍linux学习(21)常见的压缩与备份工具 dd cpio,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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


dd

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

[root@www ~]# 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@www ~]# dd if=/etc/passwd of=/tmp/passwd.back
3+1 records in
3+1 records out
1945 bytes (1.9 kB) copied, 0.000332893 seconds, 5.8 MB/s
[root@www ~]# ll /etc/passwd /tmp/passwd.back
-rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd
-rw-r--r-- 1 root root 1945 Dec 17 18:09 /tmp/passwd.back
# 仔细的看一下,我的 /etc/passwd 文件大小为 1945 bytes,因为我没有配置 bs ,
# 所以默认是 512 bytes 为一个单位,因此,上面那个 3+1 表示有 3 个完整的 
# 512 bytes,以及未满 512 bytes 的另一个 block 的意思啦!
# 事实上,感觉好像是 cp 这个命令啦~范例二:将自己的磁碟之第一个磁区备份下来
[root@www ~]# dd if=/dev/hdc of=/tmp/mbr.back bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.0104586 seconds, 49.0 kB/s
# 第一个磁区内含有 MBR 与 partition table ,透过这个动作,
# 我们可以一口气将这个磁碟的 MBR 与 partition table 进行备份哩!范例三:找出你系统最小的那个分割槽,并且将他备份下来:
[root@www ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hdc2             9.5G  3.9G  5.1G  44% /
/dev/hdc3             4.8G  651M  3.9G  15% /home
/dev/hdc1              99M   21M   73M  23% /boot  <==就捉他好了!
[root@www ~]# dd if=/dev/hdc1 of=/tmp/boot.whole.disk
208782+0 records in
208782+0 records out
106896384 bytes (107 MB) copied, 6.24721 seconds, 17.1 MB/s
[root@www ~]# ll -h /tmp/boot.whole.disk
-rw-r--r-- 1 root root 102M Dec 17 18:14 /tmp/boot.whole.disk
# 等於是将整个 /dev/hdc1 通通捉下来的意思~如果要还原呢?就反向回去!
# dd if=/tmp/boot.whole.disk of=/dev/hdc1 即可!非常简单吧!
# 简单的说,如果想要整个硬盘备份的话,就类似 Norton 的 ghost 软件一般,
# 由 disk 到 disk ,嘿嘿~利用 dd 就可以啦~厉害厉害!

你可以说, tar 可以用来备份关键数据,而 dd 则可以用来备份整颗 partition 或整颗 disk ,很不错啊~不过,如果要将数据填回到 filesystem 当中,可能需要考虑到原本的 filesystem 才能成功啊!让我们来完成底下的例题试看看:

例题:
你想要将你的 /dev/hdc1 进行完整的复制到另一个 partition 上,请使用你的系统上面未分割完毕的容量再创建一个与 /dev/hdc1 差不多大小的分割槽 (只能比 /dev/hdc1 大,不能比他小!),然后将之进行完整的复制 (包括需要复制 boot sector 的区块)。
答:
由於需要复制 boot sector 的区块,所以使用 cp 或者是 tar 这种命令是无法达成需求的!此时那个 dd 就派的上用场了。你可以这样做:
# 1. 先进行分割的动作
[root@www ~]# fdisk -l /dev/hdcDevice Boot   Start    End    Blocks   Id  System
/dev/hdc1   *        1     13    104391   83  Linux
# 上面鸟哥仅撷取重要的数据而已!我们可以看到 /dev/hdc1 仅有 13 个磁柱[root@www ~]# fdisk /dev/hdc
Command (m for help): n
First cylinder (2354-5005, default 2354): 这里按 enter
Using default value 2354
Last cylinder or +size or +sizeM or +sizeK (2354-5005, default 5005): 2366Command (m for help): pDevice Boot   Start    End    Blocks   Id  System
/dev/hdc9         2354   2366    104391   83  LinuxCommand (m for help): w
# 为什么要使用 2366 呢?因为 /dev/hdc1 使用 13 个磁柱,因此新的 partition
# 我们也给她 13 个磁柱,因此 2354 + 13 -1 = 2366 罗![root@www ~]# partprobe# 2. 不需要格式化,直接进行 sector 表面的复制!
[root@www ~]# dd if=/dev/hdc1 of=/dev/hdc9
208782+0 records in
208782+0 records out
106896384 bytes (107 MB) copied, 16.8797 seconds, 6.3 MB/s[root@www ~]# mount /dev/hdc9 /mnt
[root@www ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hdc1               101086     21408     74459  23% /boot
/dev/hdc9               101086     21408     74459  23% /mnt
# 这两个玩意儿会『一模一样』喔!
[root@www ~]# umount /mnt
非常有趣的范例吧!新分割出来的 partition 不需要经过格式化,因为 dd 可以将原本旧的 partition 上面,将 sector 表面的数据整个复制过来!当然连同 superblock, boot sector, meta data 等等通通也会复制过来!是否很有趣呢?未来你想要建置两颗一模一样的磁碟时,只要下达类似: dd if=/dev/sda of=/dev/sdb ,就能够让两颗磁碟一模一样,甚至 /dev/sdb 不需要分割与格式化,因为该命令可以将 /dev/sda 内的所有数据,包括 MBR 与 partition table 也复制到 /dev/sdb 说! ^_^


cpio

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

[root@www ~]# cpio -ovcB  > [file|device] <==备份
[root@www ~]# cpio -ivcdu < [file|device] <==还原
[root@www ~]# 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@www ~]# find /boot -print
/boot
/boot/message
/boot/initrd-2.6.18-128.el5.img
....以下省略....
# 透过这个 find 我们可以找到 /boot 底下应该要存在的档名!包括文件与目录[root@www ~]# find /boot | cpio -ocvB > /tmp/boot.cpio
[root@www ~]# ll -h /tmp/boot.cpio
-rw-r--r-- 1 root root 16M Dec 17 23:30 /tmp/boot.cpio

我们使用 find /boot 可以找出档名,然后透过那条管线 (|, 亦即键盘上的 shift+\ 的组合),就能将档名传给 cpio 来进行处理!最终会得到 /tmp/boot.cpio 那个文件喔!接下来让我们来进行解压缩看看。

范例:将刚刚的文件给他在 /root/ 目录下解开
[root@www ~]# cpio -idvc < /tmp/boot.cpio
[root@www ~]# ll /root/boot
# 你可以自行比较一下 /root/boot 与 /boot 的内容是否一模一样!

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

  • 备份:find / | cpio -ocvB > /dev/st0
  • 还原:cpio -idvc < /dev/st0

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

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

# 1. 我们先来看看该文件是属於什么文件格式,然后再加以处理:
[root@www ~]# file /boot/initrd-2.6.18-128.el5.img
/boot/initrd-2.6.18-128.el5.img: gzip compressed data, ...
# 唔!看起来似乎是使用 gzip 进行压缩过~那如何处理呢?# 2. 透过更名,将该文件添加扩展名,然后予以解压缩看看:
[root@www ~]# mkdir initrd
[root@www ~]# cd initrd
[root@www initrd]# cp /boot/initrd-2.6.18-128.el5.img initrd.img.gz
[root@www initrd]# gzip -d initrd.img.gz
[root@www initrd]# ll
-rw------- 1 root root 5408768 Dec 17 23:53 initrd.img
[root@www initrd]# file initrd.img
initrd.img: ASCII cpio archive (SVR4 with no CRC)
# 嘿嘿!露出马脚了吧!确实是 cpio 的文件档喔!# 3. 开始使用 cpio 解开此文件:
[root@www initrd]# cpio -iduvc < initrd.img
sbin
init
sysroot
....以下省略....
# 瞧!这样就将这个文件解开罗!这样了解乎?
这章也没练习,偷个懒。。。。。希望不会遭报应。。。。。。 

这篇关于linux学习(21)常见的压缩与备份工具 dd cpio的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/331013

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与