本人很喜欢Linux文件系统,下面就这个问题来详细说说Linux文件系统的反删除方法。Linux是由开发工具软件、编辑器软件、CPU图形用户界面、网络工具软件等组成的一个完整的软件包。Linux具备现代一切功能完整的UNIX系统所具备的全部特征。
作为一个多用户、多任务的操作系统,Linux文件系统一旦被删除,是难以恢复的。尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据。不过,对于家庭单机使用的Linux文件系统,或者误删文件后及时补救,还是可以恢复的。
Ext2文件系统结构的简单介绍
在Linux文件系统所用的Ext2文件系统中,文件是以块为单位存储的,默认情况下每个块的大小是1K,不同的块以块号区分。每个文件还有一个节点,节点中包含有文件所有者,读写权限,文件类型等信息。对于一个小于12个块的文件,在节点中直接存储文件数据块的块号。如果文件大于12个块,那么节点在12个块号之后存储一个间接块的块号,在这个间接块号所对应的块中,存储有256个文件数据块的块号(Ext2fs中每个块号占用4字节,这样一个块中所能存储的块号就是1024/4=256)。如果有更大的文件,那么还会在节点中出现二级间接块和三级间接块。
恢复被误删文件的方法
大多数Linux文件系统发行版都提供一个debugfs工具,可以用来对Ext2文件系统进行编辑操作。不过在使用这个工具之前,还有一些工作要做。首先以只读方式重新挂载被误删的文件所在分区。使用如下命令:(假设文件在/usr分区)mount –r –n –o remount /usr -r表示只读方式挂载;-n表示不写入/etc/mtab,如果是恢复/etc上的文件,就加上这个参数。如果系统说xxx partion busy,可以用fuser命令查看一下是哪些进程使用这个分区上的文件:
fuser –v –m /usr
如果没有什么重要的进程,用以下命令停掉它们:
fuser -k –v –m /usr
然后就可以重新挂载这些Linux文件系统了。
如果是把所有的文件统一安装在一个大的/分区当中,可以在boot提示符下用linux single进入单用户模式,尽量减少系统进程向硬盘写入数据的机会,要不干脆把硬盘挂在别的机器上。另外,恢复出来的数据不要写到/上面,避免破坏那些有用的数据。如果机器上有dos/windows,可以写到这些分区上面:
mount –r –n /dev/hda1 /mnt/had
然后就可以执行debugfs:(假设Linux在 /dev/hda5)
#debugfs /dev/hda5
就会出现debugfs提示符debugfs:
使用lsdel命令可以列出很多被删除的文件的信息:
debugfs:lsdel
debugfs: 2692 deleted inodes found.
Inode Owner Mode Size Blocks Time deleted
164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001
36137 0 100644 4 1/ 1 Tue Apr 24 10:11:15 2001
196829 0 100644 149500 38/ 38 Mon May 27 13:52:04 2001
debugfs:
列出的文件有很多(这里找到2692个),***字段是文件节点号,第二字段是文件所有者,第三字段是读写权限,接下来是文件大小,占用块数,删除时间。然后就可以根据文件大小和删除日期判断那些是我们需要的。比如我们要恢复节点是196829的文件:
可以先看看文件数据状态:
debugfs:stat
Inode: 196829 Type: regular Mode: 0644 Flags: 0x0 Version: 1
User: 0 Group: 0 Size: 149500
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount: 38
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x31a9a574 -- Mon May 27 13:52:04 2001
atime: 0x31a21dd1 -- Tue May 21 20:47:29 2001
mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 2001
dtime: 0x31a9a574 -- Mon May 27 13:52:04 2001
BLOCKS:
594810 594811 594814 594815 594816 594817
TOTAL: 38
然后就可以用dump指令恢复文件:
debugfs:dump /mnt/hda/01.sav
这样就把文件恢复出来了。退出debugfs:
debugfs:quit
另一种方法是手工编辑inode:
debugfs:mi
Mode [0100644]
User ID [0]
Group ID [0]
Size [149500]
Creation time [0x31a9a574]
Modification time [0x31a9a574]
Access time [0x31a21dd1]
Deletion time [0x31a9a574] 0
Link count [0] 1
Block count [38]
File flags [0x0]
Reserved1 [0]
File acl [0]
Directory acl [0]
Fragment address [0]
Fragment number [0]
Fragment size [0]
Direct Block #0 [594810]
Triple Indirect Block [0]
使用mi指令后每次显示一行信息以供编辑,其它行可以直接按回车表示确认,把deletion time改成0(未删除),Link count改成1。改好后退出debugfs:
debugfs:quit
然后用fsck检查/dev/hda5
fsck /dev/hda5
程序会说找到丢失的数据块,放在lost+found里面。这个目录里的文件就是我们要的东东。
Now all O.K. Good Luck.
Linux文件系统分区方案
硬盘的分区由主分区、扩展分区和逻辑分区组成;所以我们在对硬盘分区时要遵循这个标准;主分区(包括扩展分区)的***个数是四个,主分区(包含扩展分区)的个数硬盘的主引导记录MBR(Master Boot Recorder)决定的,MBR存放启动管理程序(GRUB,LILO,NTLOARDER等)和分区表记录。其中扩展分区也算一个主分区;扩展分区下可以包含更多的逻辑分区;所以主分区(包括扩展分区)范围是从1-4,逻辑分区是从5开始的;
关于一个磁盘的分区,一个磁盘应该有四个主分区,其中扩展也算一个主分区;存在以下分配方案:
1)分区结构之一:四个主分区,没有扩展分区;[主|分区1] [主分|区2] [主|分区3] [主|分区4]这种情况,如果您想在一个磁盘上划分五个以上分区,这样是行不通的;三个主分区 一个扩展分区;[主|分区1] [主|分区2] [主|分区3] [扩展分区][逻辑|分区5] [逻辑|分区6] [逻辑|分区7] [逻辑|分区8] 这种情况行得通,而且分区的自由度比较大;分区也不受约束,能分超过5个分区;这只是举一个例子;
2)最合理的的分区方式;
最合理的分区结构:主分区在前,扩展分区在后,然后在扩展分区中划分逻辑分区;主分区的个数+扩展分区个数要控制在四个之内;比如下面的分区是比较好的;[主|分区1] [主|分区2] [主|分区3] [扩展分区][逻辑|分区5] [逻辑|分区6] [逻辑|分区7] [逻辑|分区8] ... ...
[主|分区1] [主|分区2] [扩展分区][逻辑|分区5] [逻辑|分区6] [逻辑|分区7] [逻辑|分区8] ... ...
[主|分区1] [扩展分区][逻辑|分区5] [逻辑|分区6] [逻辑|分区7] [逻辑|分区8] ... ...
最不合理的分区结构:主分区包围扩展分区;比如下面的;
[主|分区1] [主|分区2] [扩展分区] [主|分区4] [空白未分区空间][逻辑|分区5] [逻辑|分区6] [逻辑|分区7] [逻辑|分区8] ... ...
这样 [主|分区2] 和 [主|分区4] 之间的 [扩展分区] 是有自由度,但[主|分区4]后的[空白未分区空间]怎么办?除非把主分区4完全利用扩展分区后的空间,否则您想在主分区4后再划一个分区是不可能的,划分逻辑分区更不可能; 虽然类似此种办法也符合一个磁盘四个主分区的标准,但这样主分区包围扩展分区的分区方法实在不可取;
推荐的分区方案
尽管可以将Red Hat Linux装在一个单一的大分区中,但更好的主意是将它分开. 综合了单一分区的简单性和多分区的灵活性,推荐以下配置:
注意: 如果想安装Red Hat Linux的所有软件包, 必须使用较大的分区尺寸。一个交换分区 -- 交换分区用来支持虚拟内存。交换分区一般是内存的两倍大小。一个根分区 -- 根分区是/(根目录)所在地. 它只需要启动系统所须的文件和系统配置文件. 对于大多数系统50MB到100MB的根分区可以工作的很好. 一个 /usr 分区 -- /usr 是Red Hat Linux文件系统的许多软件的所在的地方. 根据您交换安装的包的数量, 这个分区应该在300MB到700MB之间. 如果可能, 将*** 的空间用于/usr分区. 任何您以后将要安装的基于RPM的包都会使用比其他 分区更多的/usr空间.
一个 /home 分区 -- 这是用户的home目录所在地; 它的大小取决于您的Red Hat Linux文件系统有多少用户, 以及这些用户将存放多少数据.
[下面这个分区只适用于Red Hat Linux/Alpha的安装.
一个MILO分区 -- 使用MILO启动系统的Alpha用户需要创建一个1.5MB的DOS分区, 在安装结束时MILO可以拷贝到这个分区.。
另外, 用户环境可能会要求创建一个和多个以下的分区: 一个 /usr/local 分区 -- 一般, /usr/local用来存放与其余Red Hat Linux文件系统 不同的软件, 如不是RPM包的软件. 它的大小取决于准备存放的这些软件的数量. 一个 /usr/src 分区 -- Red Hat Linux文件系统中, /usr/src通常存放两样东西:
Linux文件系统内核源程序 -- Linux内核的所有源程序都放在这, 新的内核也在这创建. 目前, 内核源程序大概30MB。注意:可能需要更多的空间来创建内核, 或保存几个不同版本的内核.
RPM包的源程序 -- 如果安装了包的源程序, 文件将存放在这. 注意:除非特别指定, 创建包也将使用在这的一个'创建目录'. here.
同样, 这个分区的尺寸也取决于将在这安装的软件的数量。
一个 /tmp 分区 -- 就象它的名字, /tmp分区用来存放临时文件。对于一个大型的, 多用户的系统或者网络服务器, 专门创建一个/tmp分区是一个好主意. 对于一个单用户的工作站, 就不必专门创建一个/tmp分区了。
一个 /var 分区 -- Red Hat Linux文件系统将把日志写在/var/log。 打印 队列的文件通常写在/var/spool。 这只是两个写在/var的例子。 除非特别配置, /var将是根Linux文件系统的一部分, 通常不占很多空间。 如果系统有很多打印, 邮件, 或者日志, 可以考虑专门创建一个/var分区。 一般来讲, 只有多用户或者服务器才需要专门的/var分区。
一个 /boot 分区 -- 这里提到的分区多数是针对大的系统,这个分区则对空间很少的小的系统很有用。所有LILO启动需要的文件都在/boot目录。因为/boot中的这些文件(包括Linux内核)占 1M空间, 如果很难为LILO要用的根分区安排100MB空间, 可以只用5-10MB (通常不用那么多)的分区来存放/boot。 虽然仍需要创建一个根分区, 但这时它可以在系统的任何地方 -- BIOS的限制仅适用含有/boot的分区。
Linux文件系统下加挂
在使用Linux文件系统的过程,常常使用虚拟文件系统VFS,通过VFS可以直接存取其它已被内核支持的各种Linux文件系统,用起来就像是在普通的 Linux的ext系列文件系统一样。只是有一些如NTFS需要重新编译内核才能支持。
Linux文件系统下加挂一个使用的是mount命令,用man mount命令可以得到命令参数的详细解释。下面就来介绍一下在几种情况下以命令行方式加挂文件系统的具体方法:
1.加挂FAT32文件系统
最简单的用法:mount /dev/hda6 /mnt/d
其中,/dev/hda6是笔者Windows的D盘,/mnt/d是目录加挂点。Linux文件系统会识别到/dev/hda6分区的文件系统类型是什么,然后加挂。当然也可以指定分区的文件系统类型,命令如下:
mount -t vfat /dev/hda6 /mnt/d
在实际中操作中,直接加挂一个windows的分区,中文的文件名和目录名会出现乱码,为了避免这种情况可以指定字符集,命令如下:
mount /dev/hda6 /mnt/d -o codepage=936,iocharset=cp936
mount -t vfat /dev/hda6 /mnt/d -o codepage=936,iocharset=cp936
2.加挂NTFS文件系统
在目前多数的Linux文件系统版本上,需要重编译Linux核心才能,加挂NTFS分区(参阅
http://www.linux-ntfs.org/
)。核心支持NTFS后,可以用以下命令加挂:
mount -t /dev/hda2 /mnt/c
同样对于中文的文件名和目录名会出现乱码的问题可以指定字符集,不过和加挂vfat分区不同,实际中用以下命令是可行的:
mount -t ntfs -o iocharset=cp936 /dev/hda2 /mnt/c -r
mount -t ntfs -o iocharset=cp936,rw /dev/hda2 /mnt/c
3.加挂U盘/移动硬盘上的文件系统
现在使用U盘的人越来越多了,其实在Linux文件系统下使用U盘也非常简单,Linux对USB设备有很好的支持,在插入U盘后,U盘被识别为一个SCSI盘,通常您用以下命令就能加挂U盘上的文件系统
mount /dev/sda1 /usb
同样对于中文的文件名和目录名会出现乱码的问题可以指定字符集,命令类似于上面对FAT32介绍的:
mount /dev/sda1 /usb -o pagecode=936,iocharset=cp936
4.加挂Linux文件系统通过samba共享出来的目录
利用samba共享出来的目录其实很难说其原来是哪种文件系统,不过这一点不重要,只要它对用户是透明的就好啦。加挂时,我们指定类型为smbfs,在加挂samba共享的分区时,也会出现中文的文件名和目录名乱码情况,可以用以下命令加挂:
mount -t smbfs -o
username=terry,password=terry,codepage=936,iocharset=cp936
//terry-linux/terry /mp3/
mount -t smbfs -o
username=terry,password=terry,codepage=936,iocharset=cp936
//192.168.100.228/terry /mp3/
注意:可以不直接写password=terry这个参数,系统界时会要你输入密码,这样就可以防止有人直接看到你的密码。视具体情况而定,-o后面的参数可以对应增减。
5.加挂Window系统共享出来的目录
在局域网中,常常需要去访问其它Windows系统共享出来的目录。在Linux文件系统下,安装了samba后就可以使用samba中带的命令来访问Windows机器的共享资源。
用smbclient来列出Windows机器的共享资源
smbclient -L 192.168.100.111
根据上面所列出Windows的共享资源后,可以选择需要加挂到本地Linux文件系统中去的Windows的共享资源,然后使用smbmount或mount来加挂,请参照下面几条命令:
smbmount //192.168.100.111/public /public/
mount //192.168.100.111/d /mnt/cdrom -o username=terry (这样要在命令行输入密码的)
mount //192.168.100.111/d /mnt/cdrom -o username=terry$1234 (这样则不必在命令行输入密码)
注:除了上面介绍的命令行方法,***的方法就是使用其它的客户端,如LinNeighborhood、networkneighbours、ksmbshare等,请参考其它文章。
以上介绍的都是命令行的方式,每次使用时都要输入一次,如果你常常要加挂一些Linux文件系统,想在启动时自动加挂应该怎样做呢?下面介绍两种方法:
方法1.
把加挂的命令放在/etc/rc.d/rc.local中。
方法2.
修改分区配置文件/etc/fstab,在启动时加挂Linux文件系统,下面是我的/etc/fstab文件:
LABEL=/ / ext3 defaults1 1
none /dev/pts devpts gid=5,mode=6200 0
LABEL=/home /home ext3 defaults 1 2
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda4 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660
noauto,owner,kudzu,ro 0 0
/dev/hda2 /ntfs ntfs defaults,iocharset=cp936 0 0
/dev/hda6 /win vfat defaults,codepage=936,iocharset=cp936 0 0
//192.168.100.228/terry /mp3 smbfs username=terry,password=terry,codepage=cp936,iocharset=cp936 0 0
注意***三行:
倒数第四行,加挂我的C盘,NTFS格式的
倒数第三行,加挂我的D盘,FAT32格式的
倒数第二行,加挂的是我的局域网中另一台安装samba的Linux文件系统服务器
【编辑推荐】