Linux|系统管理|WEB开发

关注Linux,系统管理,WEB开发以及开源世界

脑子没有转过来

| Comments

/dev/sdb1挂载在/data/u01上 却不小心执行了tar -vczf /dev/sdb1 /data/u01,怎么办?

我当时一直考虑的都是如何恢复这个sdb1的文件系统,于是我在本地做了一个测试。发现执行tar之后,mount是肯定不行了,提示需要指定文件系统类型。执行mke2fs的时候,居然还能看到备份的超级块。不过前面的几个备份超级块都没有用了,\ 于是从选择最后一个备份的超级块,使用e2fsck -b 的方式恢复。给出了一个无效的ext3节点信息,然后就出现大量的需要你fixed的选项。
一路下去后,确实能mount上了,但是什么数据都没有了。连lost+found里都是干干净净的。和重新mkfs没有差别。

今天突然想起,不就是执行了一个tar命令吗,平常如果这里不是sdb1,而是xxx.tar.gz,那么想都不想直接tar -vxzf xxx.tar.gz就行了。也没有人规定名字一定得是xxx.tar.gz呀。所以应该tar -vxzf /dev/db1是可以解压数据出来的。

再说了,往磁带机上备份,不就是这样做的,只是把设备换成了st0而已。

于是测试一下来验证我的想法。

[root@mlsx tmp]# mkfs.ext3 /dev/mdp0
[root@mlsx tmp]# mount /dev/mdp0 /misc
[root@mlsx tmp]# cp -a /boot/* /misc/
[root@mlsx tmp]# tar -vczf /dev/mdp0 /misc/*
tar: 从成员名中删除开头的“/”
/misc/boot.b
/misc/chain.b
……….
/misc/vmlinuz-2.6.20-ovz005.1
/misc/vmlinuz-2.6.9-42.7AX
[root@mlsx tmp]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mdp0 24G 24G 0 100% /misc
[root@mlsx tmp]# tar -vtzf /dev/mdp0
-rw-r–r– root/root 5824 2005-08-04 16:52:31 misc/boot.b
tar: 跳转到下一个头
tar: 归档包含过时的 base-64 头

gzip: stdin: invalid compressed data–crc error

gzip: stdin: invalid compressed data–length error
tar: Child died with signal 13
tar: 由于前面延迟的错误而退出
[root@mlsx tmp]# ls -l /misc
总计 0

看来是有问题。首先mdp0的大小在这里变了,实际大小应该是500+M,这里变成了24G,而且不一定都是24G,我测试的过程中,还出现了1.5T呢。但这个不重要,重要的是现在没法列出tar进去的数据,当然这些数据也就无从恢复了。其原因应该是源数据和目的地是一致的,结果导致数据的丢失。

如果源和目的不是一致的话,会怎么样呢?我再测试:

[root@mlsx tmp]# tar -vczf /dev/mdp0 /boot/*
tar: 从成员名中删除开头的“/”
/boot/boot.b
/boot/chain.b
/boot/config-2.6.18.3-52
/boot/config-2.6.18.3-52smp
/boot/config-2.6.20.6-2
/boot/config-2.6.9-42.7AX
……
/boot/vmlinuz-2.6.9-42.7AX

[root@mlsx tmp]# tar -vtzf /dev/mdp0
-rw-r–r– root/root 5824 2005-08-04 16:52:31 boot/boot.b
-rw-r–r– root/root 612 2005-08-04 16:52:31 boot/chain.b
-rw-r–r– root/root 64133 2006-12-01 13:46:22 boot/config-2.6.18.3-52
-rw-r–r– root/root 63842 2006-12-01 13:54:40 boot/config-2.6.18.3-52smp
………………
-rw-r–r– root/root 1811428 2007-04-19 19:38:06 boot/vmlinuz-2.6.20-ovz005.1
-rw-r–r– root/root 1518944 2007-01-11 00:08:09 boot/vmlinuz-2.6.9-42.7AX

gzip: stdin: decompression OK, trailing garbage ignored
tar: Child died with signal 13
tar: 由于前面延迟的错误而退出

虽然最后有报错,但是数据都能列出来,当然也能解压出来。同样我测试超过500M的数据tar进去,同样也可以恢复出来。
实际上,后面的这个做法,等于把一个块设备当成磁带机再用。不同的是,块设备不会自动走带,所以再做一次tar的话,块设备上,之前的数据就会被覆盖。

Comments