在Debian系统中,无论是进行系统维护、数据恢复还是安全擦除敏感信息,都非常有必要深入了解一下二进制数据。本教程将介绍一系列存储介质上的二进制数据,包括查看和编辑二进制数据、不挂载磁盘操作文件、数据冗余等等,帮助大家更好地管理和保护自己的数据。
一、查看/编辑二进制数据
最基础的查看二进制数据的方法是使用 “od -t x1” 命令。
查看和修改二进制数据的软件包列表:
软件包 | 流行度 | 大小 | 说明 |
coreutils | V:881, I:999 | 18307 | 基础软件包,有 od(1) 来导出文件(HEX, ASCII, OCTAL, …) |
bsdmainutils | V:12, I:334 | 17 | 工具软件包,有 hd(1) 来导出文件(HEX, ASCII, OCTAL, …) |
hexedit | V:0, I:9 | 73 | 二进制浏览和编辑器(HEX, ASCII) |
bless | V:0, I:2 | 924 | 全功能的十六进制编辑器(GNOME) |
okteta | V:0, I:12 | 1585 | 全功能的十六进制编辑器(KDE4) |
ncurses-hexedit | V:0, I:1 | 130 | 二进制浏览和编辑器(HEX, ASCII, EBCDIC) |
beav | V:0, I:0 | 137 | 二进制浏览和编辑器(HEX, ASCII, EBCDIC, OCTAL, …) |
HEX 是十六进制英文hexadecimal首字母缩略词,基数 radix 是 16。OCTAL 是八进制英文octal 首字母缩略词,基数 radix是 8。ASCII是美国信息交换标准代码 American Standard Code for Information Interchange 的英文缩写,即正常的英语文本代码。EBCDIC是扩展二进制编码十进制交换码 Extended Binary Coded Decimal Interchange Code 的英文缩写,在 IBM 大型机 操作系统上使用。
二、不挂载磁盘操作文件
有工具可以在没有挂载磁盘的情况下读写文件。
不挂载磁盘操作文件的软件包列表:
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
mtools |
V:8, I:64 | 390 | 不挂载磁盘的 MSDOS 文件工具 |
hfsutils |
V:0, I:5 | 184 | 不挂载磁盘的 HFS 和 HFS+ 文件工具 |
三、数据冗余
Linux 内核所提供的RAID软件系统提供内核文件系统级别的数据冗余来实现高水平的存储可靠性。
有在应用程序级别增加数据冗余来实现高水平存储可靠性的工具。
向文件添加数据冗余的工具列表:
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
par2 |
V:9, I:91 | 268 | 奇偶校验档案卷设置,用于检查和修复文件 |
dvdisaster |
V:0, I:1 | 1422 | CD/DVD 媒体数据损失/划伤/老化的保护 |
dvbackup |
V:0, I:0 | 413 | 使用 MiniDV 便携式摄像机的备份工具(提供 rsbep (1)) |
四、数据文件恢复
有用于数据文件恢复和诊断分析的工具。
数据文件恢复和诊断分析软件包列表:
软件包 | 流行度 | 大小 | 说明 |
testdisk | V:2, I:29 | 1413 | 分区扫描和磁盘恢复的实用程序 |
magicrescue | V:0, I:2 | 255 | 通过查找幻数 magic 字节来恢复文件的工具(译注:请 man file 来了解幻数) |
scalpel | V:0, I:3 | 88 | 简洁、高性能的文件提取 |
myrescue | V:0, I:2 | 83 | 恢复损坏硬盘中的数据 |
extundelete | V:0, I:8 | 147 | 恢复删除 ext3/4 文件系统上的文件的实用程序 |
ext4magic | V:0, I:4 | 233 | 恢复删除 ext3/4 文件系统上的文件的实用程序 |
ext3grep | V:0, I:2 | 293 | 帮助恢复 ext3 文件系统上删除的文件的工具 |
scrounge-ntfs | V:0, I:2 | 50 | NTFS 文件系统的数据恢复程序 |
gzrt | V:0, I:0 | 33 | gzip 恢复工具包 |
sleuthkit | V:3, I:24 | 1671 | 诊断分析工具(Sleuthkit) |
autopsy | V:0, I:1 | 1026 | SleuthKit 的图形化界面 |
foremost | V:0, I:5 | 102 | 恢复数据的诊断程序 |
guymager | V:0, I:0 | 1021 | 基于 Qt 的诊断图像工具 |
dcfldd | V:0, I:3 | 114 | 增强版的 dd,用于诊断和安全 |
在 e2fsprogs 软件包里有 debugfs(8) 命令,使用该命令里的 list_deleted_inodes 和 undel 指令,能够恢复 ext2 文件系统上删除的文件。
五、分成多个小文件
当一个文件太大而不能备份的时候,应该在备份之前先把它分割为多个小于 2000MiB 的小文件,稍后再把这些小文件合并为初始的文件。
$ split -b 2000m large_file $ cat x* >large_file
[为了防止文件名冲突,请确保没有任何以 “x” 开头的文件。
六、清空文件内容
为了清除诸如日志文件之类的文件的内容,不要用 rm(1) 命令去删除文件然后创建新的空文件,因为这个文件可能在命令执行的期间还在被使用。以下是清除文件内容的正确方法。
$ :>file_to_be_cleared
七、样子文件
下面的命令创建样子文件或空文件:
$ dd if=/dev/zero of=5kb.file bs=1k count=5 $ dd if=/dev/urandom of=7mb.file bs=1M count=7 $ touch zero.file $ : > alwayszero.file
将发现下列文件:
- “5kb.file” 是 5KB 的全零数据;
- “7mb.file” 是 7MB 随机数据;
- “zero.file” 也许是一个 0 字节的文件。如果这个文件之前就存在,则它的 mtime 会被更新,而它的内容和长度保持不变;
- “alwayszero.file” 一定是一个 0 字节文件。如果这个文件之前存在,则它的 mtime 会被更新,而它的内容会被清零。
八、擦除整块硬盘
有几种方法来完全擦除设备上整个硬盘上数据,比如说,在 “/dev/sda” 上的 USB 内存盘。
在执行这里的命令之前,应该用 mount(8) 命令来查看 USB 记忆棒的挂载位置。”/dev/sda” 指向的设备可能是装有整个系统的 SCSI 硬盘或者 serial-ATA 硬盘。
如下所示是通过数据归 0 的方式来擦除硬盘上所有数据的。
# dd if=/dev/zero of=/dev/sda
如下是用随机数据重写的方式来擦除所有数据的。
# dd if=/dev/urandom of=/dev/sda
如下是用随机数据重写的方式来高效擦除所有数据。
# shred -v -n 1 /dev/sda
或者可以使用 badblocks(8) 加上 -t random 选项。
因为 dd(1) 命令在许多可引导的 Linux CDs (例如 Debian 安装光盘) 上的 shell 环境下都是可用的,能够在装有系统的硬盘上,例如 “/dev/hda”, “/dev/sda” 等等设备上运行擦除命令来完全清除已经安装的系统。
九、擦除未使用区域
硬盘(或 USB 记忆棒)上未使用的区域,例如“/dev/sdb1”可能仍然包含可被擦除的数据,因为他们本身只是解除了从文件系统的链接,这些可以通过重写来清除。
# mount -t auto /dev/sdb1 /mnt/foo # cd /mnt/foo # dd if=/dev/zero of=junk dd: writing to `junk': No space left on device ... # sync # umount /dev/sdb1
这对USB 记忆棒来说通常已经足够好了,但这还不完美。大部分已擦除的文件名和它们的属性可能隐藏并留在文件系统中。
十、恢复文件
即使不小心删除了某个文件,只要这个文件仍然被一些应用程序所使用(读或者写),恢复此文件是可能的。
尝试下列例子:
$ echo foo > bar $ less bar $ ps aux | grep ' less[ ]' bozo 4775 0.0 0.0 92200 884 pts/8 S+ 00:18 0:00 less bar $ rm bar $ ls -l /proc/4775/fd | grep bar lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> /home/bozo/bar (deleted) $ cat /proc/4775/fd/4 >bar $ ls -l -rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 bar $ cat bar foo
当安装了 lsof 软件包的时候,在另外一个终端执行如下命令。
$ ls -li bar 2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 bar $ lsof |grep bar|grep less less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar $ rm bar $ lsof |grep bar|grep less less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar (deleted) $ cat /proc/4775/fd/4 >bar $ ls -li bar 2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 bar $ cat bar foo
十一、查找所有硬链接
有硬链接的文件,能够使用 “ls -li” 确认。
$ ls -li total 0 2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar 2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz 2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo
“baz” 和 “foo” 的链接数为 “2” (>1),表示他们有硬链接。它们的 inode 号都是”2738404″.这表示它们是同样的硬链接文件。如果不想偶然碰巧发现硬链接文件,可以通过 inode 号来查找它。比如说, 按下面的方式查找 “2738404” 。
# find /path/to/mount/point -xdev -inum 2738404
十二、不可见磁盘空间消耗
所有打开的文件被删除后,仍然消耗磁盘空间,尽管他们不能够被普通的 du(1) 所看见。这些被删除的文件和他们的大小,可以通过下面的方式列出。
# lsof -s -X / |grep deleted