UNIX操作系统中进程通信机制的应用Windows系统

2024-10-12

UNIX操作系统中进程通信机制的应用Windows系统(通用3篇)

UNIX操作系统中进程通信机制的应用Windows系统 篇1

[code:1:86f2fbe34d] 在pc机上使用 UNIX ,由于pc上的硬盘多为IDE接口的故,只介绍IDE接口的硬盘, 常常我们有多块unix硬盘,需要把进行文件对拷时,或当一块使用硬盘的可用空间不多时也可以再接一块硬盘做为文件系统使用. 在SCOUNIX5.0.5中,系统已经存在硬盘

[code:1:86f2fbe34d]

在pc机上使用UNIX,由于pc上的硬盘多为IDE接口的故,只介绍IDE接口的硬盘。

常常我们有多块unix硬盘,需要把进行文件对拷时,或当一块使用硬盘的可用空间不多时也可以再接一块硬盘做为文件系统使用.

在SCO UNIX 5.0.5 中,系统已经存在硬盘设备hd10(接到IDE0上的从设备),则hd10无需配置。

硬盘的设备名为hd00,hd10等等,hd00为接到IDE0的主设备,hd10为接到IDE0上的从设备.

而我们看到下边的设备而是

brw-------   1 sysinfo  sysinfo    1, 47 Mar 26 11:56 hd0a(hd00的活动分区)

brw-r-----   1 dos      sysinfo    1, 48 Mar 26 11:56 hd0d(hd00的DOS分区)

brw-------   1 sysinfo  sysinfo    1, 15 Mar 26 11:56 hd01(hd00的第一个分区)

brw-------   1 sysinfo  sysinfo    1, 23 Mar 26 11:56 hd02(hd00的第二个分区)

brw-------   1 sysinfo  sysinfo    1, 31 Mar 26 11:56 hd03(hd00的第三个分区)

brw-------   1 sysinfo  sysinfo    1, 39 Mar 26 11:56 hd04(hd00的第四个分区)

br--r-----   1 root     backup     1, 79 Mar 26 11:56 hd11(hd10的第一个分区)

br--r-----   1 root     backup     1, 87 Mar 26 11:56 hd12(hd10的第二个分区)

br--r-----   1 root     backup     1, 95 Mar 26 11:56 hd13(hd10的第三个分区)

br--r-----   1 root     backup     1,103 Mar 26 11:56 hd14 (hd10的第四个分区)

把第二块UNIX硬盘连到机器上,注意前边说过这块硬盘应连到IDE0上,并且为从盘.

用#divvy /dev/hd10  (注:divvy 为分割磁盘命令)

把第二块UNIX硬盘上的文件系统注册到当前UNIX系统上.

显示为

+-------------------+------------+--------+---+-------------+------------+

| Name              | Type       | New FS | # | First Block | Last Block |

+-------------------+------------+--------+---+-------------+------------+

|                   | EAFS       |  no    | 0 |            0|       9|

|                   | NON FS     |  no    | 1 |        0|      117999|

|                   | HTFS       |  no    | 2 |       118000|     4209019|

|                   | NOT USED   |  no    | 3 |            -|           -|

|                   | NOT USED   |  no    | 4 |            -|           -|

|                   | NOT USED   |  no    | 5 |            -|           -|

|                   | NON FS     |  no    | 6 |      4209020|     4209029|

|                   | WHOLE DISK |  no    | 7 |            0|     4217030|

+-------------------+------------+--------+---+-------------+------------+

4209030 1K blocks for divisions, 8001 1K blocks reserved for the system

n[ame]       Name or rename a division.

c[reate]     Create a new file system on this division.

t[ype]       Select or change filesystem type on new filesystems.

p[revent]    Prevent a new file system from being created on this division.

s[tart]      Start a division on a different block.

e[nd]        End a division on a different block.

r[estore]    Restore the original division table.

Enter your choice or q to quit:

其中Name为文件系统在当前UNIX中的设备名。(由于第二块unix盘未在系统中注册,所以看不到设备名)

Type 为文件系统类型,常见有EAFS,HTFS.

New FS 标识是否为新建的文件系统,我们用的是UNIX硬盘,文件系统已经分好,所以不要新建文件系统,除非真的想重新建立文件系统,不过原文件系统中的内容被覆盖。

#为unix文件系统的编号

First Block, Last Block 为各文件系统的起始与结事块号。

我们使用第二块UNIX硬盘,通常都不会去改变原来硬盘的文件系统大小的。只要把第二块UNIX盘的文件系统注册到当前系统上就好了。

一般来说0#文件系统类型为EAFS,是unix盘的引导区,一般来说我们用不上。所以不用为它命名。

1#文件系统类型为NON FS,是unix盘的交换区,我们也用不上。不用为它命名

2#文件系统类型为HTFS,是unix盘的根分区,如果第二块unix盘上,只有根分区我们就使用这个分区。

其它文件系统类型为HTFS的分区都是单的分区,我们也可以利用。

经过上边分析,我们为2#分区,命名(也就相当于在当前unix系统中注册了,第二块硬盘的根分区以便使用)。

键入n,回车。

显示

which division? (0 through 7)?

(命名哪个分区)

键入2,回车。

显示

what do you wantto call it?

(你想叫它什么)

输入SROOT(依喜好自行命名)

显示如图,可见已经命名为2#分区。

+-------------------+------------+--------+---+-------------+------------+

| Name              | Type       | New FS | # | First Block | Last Block |

+-------------------+------------+--------+---+-------------+------------+

|                   | EAFS       |  no    | 0 |            0|       19999|

|                   | NON FS     |  no    | 1 |        20000|      117999|

| SROOT             | HTFS       |  no    | 2 |       118000|     4209019|

|                   | NOT USED   |  no    | 3 |            -|           -|

|                   | NOT USED   |  no    | 4 |            -|           -|

|                   | NOT USED   |  no    | 5 |            -|           -|

|                   | NON FS     |  no    | 6 |      4209020|     4209029|

|                   | WHOLE DISK |  no    | 7 |            0|     4217030|

+-------------------+------------+--------+---+-------------+------------+

4209030 1K blocks for divisions, 8001 1K blocks reserved for the system

n[ame]       Name or rename a division.

c[reate]     Create a new file system on this division.

t[ype]       Select or change filesystem type on new filesystems.

p[revent]    Prevent a new file system from being created on this division.

s[tart]      Start a division on a different block.

e[nd]        End a division on a different block.

u[ndo]       Undo the last change.

r[estore]    Restore the original division table.

Enter your choice or q to quit:

本例中只有2#分区需命名,

故按q键回车退出.

系统提示(是安装使生效,是回到主菜单重新操作,还是退出不生效)

i[nstall]      Install the division set-up shown

r[eturn]       Return to the previous menu

e[xit]         Exit without installing a division table

Please enter your choice:

键入i,回车,使生效。

使用l命令看是否生成设备名SROOT设备文件。

# l /dev/SROOT

brw-r-----   1 sysinfo  sysinfo    1,106 May 28 11:30 /dev/SROOT

这个/dev/SROOT  就是第二块unix盘的根分区,这样就可以用mount命令将它装要unix系统上了。

你可以建一个目录作为它的引入点。我们可以在根下建一SROOT目录

#cd /

#mkdir SROOT

把/dev/SROOT  就是第二块unix盘的根分区引入到/SROOT目录上。

# mount /dev/SROOT /SROOT

# l /SROOT  (列第二块unix盘的根分区文件)

这样就可以把它当作正常的文件系统使用了。

与光驱一样。

用umount卸载硬盘

#umount /SROOT

[/code:1:86f2fbe34d]

sindney 回复于:-03-05 10:50:49这多好东东,大家怎么光看不发言呀:(

老大,我顶,呵呵

unixgaoshou 回复于:2004-03-05 11:18:45正在享受中........................................

好!感谢老大!

酸辣粉 回复于:2004-03-05 17:27:11问问老大,我用MKDEV HD加入一块IDE硬盘后,在/DEV目录中存在了设备名,但REBOOT后设备名又不见了。如何解决?在现有UNIX系统中加一块新硬盘这样做是否正确? :shock:

lv_xiaowei 回复于:2004-03-05 19:44:56老大的文章都是好样的

maidx 回复于:2004-03-07 21:42:08接到ide1用什么?hd20?

micky123 回复于:2004-03-08 08:45:12好!!!!

yz_zb 回复于:2004-03-08 10:47:06[quote:2529f016df=“酸辣粉”]问问老大,我用MKDEV HD加入一块IDE硬盘后,在/DEV目录中存在了设备名,但REBOOT后设备名又不见了。如何解决?在现有UNIX系统中加一块新硬盘这样做是否正确? :shock:[/quote:2529f016df]

可能是你的参数配置不对!

CJMCJM 回复于:2004-03-13 11:04:25:shock: 朋友:如果加入的硬盘是SCSI接口的,那又是怎样配置的尼?

lmx411 回复于:2004-03-13 11:27:54[quote:5eef404a6f=“酸辣粉”]问问老大,我用MKDEV HD加入一块IDE硬盘后,在/DEV目录中存在了设备名,但REBOOT后设备名又不见了。如何解决?在现有UNIX系统中加一块新硬盘这样做是否正确? :shock:[/quote:5eef404a6f]

编辑一下/etc/vfstab ,在里面把新加入的硬盘在启动时自动mount 上!

unix007 回复于:2004-03-15 22:12:05[quote:04a5220738=“lmx411”]

编辑一下/etc/vfstab ,在里面把新加入的硬盘在启动时自动mount 上![/quote:04a5220738]

呵呵,lmx411平时用uw7用得多了,把uw7的东西说成osr5的了。

在openserver5下应该编辑/etc/default/filesys这个文件,

如果不想手工编辑这个文件,可以用“mkdev fs”这个命令来做。

小 辉 回复于:2004-03-16 10:22:20值得收藏

酸辣粉 回复于:2004-03-16 18:24:55[quote:207798f697=“unix007”]

呵呵,lmx411平时用uw7用得多了,把uw7的东西说成osr5的了。

在openserver5下应该编辑/etc/default/filesys这个文件,

如果不想手工编辑这个文件,可以用“mkdev fs”这个命令来做。[/quote:207798f697]

那么请问怎样手工编辑/etc/default/filesys这个文件呢?

无闻 回复于:2004-03-16 23:45:15今天上来本来就是想问这个问题的,没想到竟然有高手正好写了出来,真是太感谢了

-j- 回复于:2004-08-25 09:49:56谢谢!!!正好用上!呵呵

cnhp 回复于:-07-11 10:20:42真好,我学一下。

原文转自:www.ltesting.net

UNIX操作系统中进程通信机制的应用Windows系统 篇2

Unix系统的安全等级标准达到C2级,它具有以下安全特征:

1、访问控制

系统通过访问控制表ACL使得用户可以自行改变文件的安全级别和访问权限。

如:-rwxr-xr--1johntest4月9日17:50cm

上面的例子表示文件cm对于用户john来说可读、可写、可执行,对test这个组的其他用户只有读和执行的权限,而对除此以外的所有用户只有读的权限。系统管理员可用umask命令为每个用户设置默认的权限值,用户可用chmod命令来修改自己拥有的文件或目录的权限。

2、对象的可用性

当一个对象不再使用时,在它回到自由对象之前,TCB(TrustedComputingBase)将要清除它,以备下次需要时使用。

3、个人身份标识与认证

其目的是为了确定用户的真实身份,在用户登录时它采用扩展的DES算法对输入的口令进行加密,然后把口令的密文与存放在/etc/password中的数据进行比较,如果二者的值完全相同则允许用户登录到系统中,否则禁止用户的登录。

4、审计记录

Unix系统能够对很多事件进行记录,比如:文件的创建和修改以及系统管理的所有操作和其他有关的安全事件(登录失败,以root身份进行登录的情况),通过这些记录系统管理员就可以对安全问题进行跟踪。

5、操作的可靠性

操作的可靠性是指Unix系统用于保证系统的完整性的能力。Unix系统通过对用户的分级管理,通过对运行级别的划分,以及前面提到的访问控制加之自带的一些工具,能够很好地保证系统操作的可靠性。

Unix的安全体系结构

Unix的安全体系结构可以按照ISO/OSI网络模型的层次结构将它分成七层,如下表所示:

层次名称含义

7Policy安全策略定义、指导

6Personnel使用设备和数据的人员

5LAN计算机设备和数据

4InternalDemark内部区分

3GatewayOSI中第7、6、5、4层的功能

2Packet-FilterOSI中第3、2、1层的功能

1ExternalDemark外部连接

1、Policy(策略层)

在这一层中,主要定义了一个组织的安全策略,包括安全策略的需求分析、安全方针的制定,也包括了高层次定义的允许的安全风险以及下层的如何配置设备及过程。

2、Personnel(用户层)

本层定义了Unix的安装、操作、维护和使用以及通过其他方法访问网络的人员。从广义上讲,对Unix多用户环境下的应用进程也应算在其中。此层的安全策略应该反映出用户对总体系统安全的期望值。

3、LAN(局域网层)

它定义用户的安全程序要保护的设备和数据,包括计算机互联的设备。如:路由器、单一的Unix主机等。

4、InternalDemark(内部区分层)

这一层定义了用户如何将局域网连接到广域网以及如何将局域网连接到防火墙上。

5、Gateway(嵌入的Unix网关层)

本层定义了整体平台包括第四层的网络接口以及第三层的路由器。它用于为广域网提供防火墙服务。

6、Packet-Filter(包过滤层)

它对应于OSI的第一层到第三层,本层不仅提供第一层的物理连接,更主要的是根据安全策略,通过用户层的进程和包过滤规则对网络层中的IP包进行过滤。一般的包过滤算法是采用查规则表来实现的,它根据“条件/动作”这样的规则序列来判断是前向路由还是扔包。

7、ExternalDemark(外部连接层)

它定义用户系统如何与设备、电话线路或其他用户不能直接控制的媒介进行连接。完整的用户安全策略应包括这一部分,因线路本身可能允许非授权访问。

Unix系统不安全的因素

尽管Unix系统有比较完整的安全体系结构,但它仍然存在很多不安全的因素,主要表现在以下几个方面:

1、特权软件的安全漏洞

程序员在编写特权代码或suid代码时,如果没能确保用户对程序执行环境的完全控制,或者对所有返回的错误状态没能给予适当的处理,导致入侵者控制程序的运行环境,使得用户的程序出现不可预期的结果,从而威胁系统的安全。

2、研究源代码的漏洞

由于一些程序本身存在着安全漏洞(如缓冲区溢出),入侵者往往通过这些漏洞来对系统进行攻击,

3、特洛伊木马

特洛伊木马与用户一般要执行的程序从表面上(如文件名等)看很相似,实际上却完成其他的操作,如删除文件、窃取密码和格式化磁盘等,到用户发现时,为时已晚。

4、网络监听及数据截取

计算机安全面临的另一个重要威胁是计算机之间传输的数据可以很容易地被截取。由于异种机的互连,敏感数据传输处于系统的控制之外,有许多现成的软件可以监视网络上传输的数据。

5、软件之间相互作用和设置

由于大型系统软件通常由很多人共同协作完成因此无法准确预测系统内每个部分之间的相互作用。例如/bin/login,它可接收其他一些程序的非法参数,从而可使普通用户成为超级用户。另一方面,系统软件配置的复杂性,以至简单的配置错误可能导致不易觉察的安全问题。

安全管理

Unix系统安全包括物理安全和逻辑安全,因此与其相对应有物理安全的管理和逻辑安全的管理,下面只针对Unix逻辑安全的管理,从三个方面对此进行论述。

1、防止未授权存取

防止未授权的人进入系统,这是Unix安全管理最重要的问题。新版Unix提供了专门的鉴别系统,如SUNSolaris使用DES密码机构和公共关键字密码,该系统极大地提高了网络环境的安全性。要使Unix鉴别机制更充分地发挥作用,必需加强用户的安全意识和良好的口令管理,进行用户和网络活动的周期检查。

2、防止泄密

就是防止已授权或未授权用户间相互存取或交换对方的重要信息,如用户文件及各种日志文件(如各种log文件)。为此,必须加强对重要文件的访问控制和管理,对系统文件和其他重要文件(如用户root的文件)的属性一定要作安全设置。

3、防止用户拒绝系统的管理

Unix系统不应被一个有意试图使用过多资源的用户损坏。由于Unix不能很好地限制用户对资源的使用,因此,系统管理员需要用ps、df和du命令周期性地检查系统,以便能够查出过多占用CPU资源的进程和大量占用磁盘空间的文件和用户。

保障Unix安全的具体措施

针对比较突出的安全问题,提出了下面一些具体的措施。

1、防止缓冲区溢出

据统计,约100%的安全问题来自缓冲区溢出。攻击者通过写一个超过缓冲区长度的字符串,然后植入到缓冲区,可能会出现两个结果,一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另有一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。一些版本的Unix系统(如Solaris2.6和Solaris7)具备把用户堆栈设成不可执行的功能,以使这种攻击不能得逞。以下是让这个功能生效的步骤:

1)变成root

2)对/etc/system文件做个拷贝cp/etc/system/etc/system.BACKUP

3)用编辑器编辑/etc/system文件

4)到文件的最后,插入以下几行:

setnoexec_user_stack=1

setnoexec_user_stack_log=15

5)保存文件,退出编辑器后,重启机器,以使这些改变生效。可能有些合法使用可执行堆栈的程序在做如上改变后不能正常运行,不过这样的程序并不多。

2、在.netd.conf中关闭不用的服务

Unix系统中有许多用不着的服务自动处于激活状态。它们中可能存在的安全漏洞使攻击者甚至不需要账户就能控制机器。为了系统的安全,应把该关的功能关闭,该限制的文件限制访问权限。可以用如下方法来关闭:

1)变成root

2)备份inetd的配置文件/etc/inetd.conf

cp/etc/inetd.conf/etc/inetd.conf.BACKUP

3)编辑/etc/inetd.conf文件

以“#”符号注释掉不需要的服务,使其处于不激活的状态。在确实需要很高安全的机器上,最好注释掉telnet和ftp,即使要使用此两项服务,也要对使用情况进行限制,如用TCPWrapper对使用telnet或ftp的IP地址进行限制。

4)在改变/etc/inetd.conf后,找到inetd进程的id号,用kill向它发送HUP信号来刷新它。一定要确保kill了inetd进程后,它还在运行。

3、给系统打补丁

Unix系统被发现的漏洞,几乎都有了相应的补丁程序。因此,系统管理员需对系统漏洞做及时的修补。软件公司都会定期提供补丁。

4、重要主机单独设立网段

从安全角度考虑,经常做telnet、ftp等需要传送口令的重要机密信息应用的主机应该单独设立一个网段,以避免某一台个人机被攻破,被攻击者装上sniffer,造成整个网段通信全部暴露。

5、定期检查

定期检查系统日志文件,在备份设备上及时备份。定期检查关键配置文件(最长不超过一个月)。

重要用户的口令应该定期修改(不长于三个月),不同主机使用不同的口令。

[b:82f0f4736e][/b:82f0f4736e]

liugr3988 回复于:-05-16 19:49:18好文章,支持

纳兰婷 回复于:2004-05-16 20:35:06装上sniffer,造成整个网段通信全部暴露。有这么可怕

UNIX操作系统中进程通信机制的应用Windows系统 篇3

来源:软件世界李贵林陈朝晖

与DOS/Windows不同,UNIX文件被删除后很难恢复,这是由UNIX独特的文件系统结构决定的。UNIX文件目录不像DOS/Windows那样,文件即使被删除之后仍保存有完整的文件名、文件长度、始簇号(即文件占有的第一个磁盘块号)等重要信息;相反,它的文件信息全部依靠一种被称为i节点的数据结构来描述,而i节点在相应文件被删除之后即被清空,因此,要想直接恢复被删除的文件内容几乎是不可能的,必须另辟蹊径。本文结合实际,讨论几种文件恢复策略及其关键步骤的具体实现。

一、UNIX文件系统结构

我们知道,UNIX是以文件卷作为其文件系统存储格式的,而不同的UNIX系统,文件卷格式是有差异的,甚至即使是同一UNIX操作系统的不同版本,其文件系统未必完全相同,例如:SCOUNIX4.1版与5.0版文件系统结构就有明显差异,但只要是UNIX系统,其文件卷的基本结构是一致的。分析如下:

不管是什么UNIX系统,不管什么版本,其文件卷至少包括引导块、超级块、i节点表、数据区等几个部分。除此之外,不同UNIX版本可能还有不同的差异。例如:SCOUNIX系统的位图索引块和位图块AIX的逻辑卷表等。这些系统的特殊性不影响下文的恢复策略,故这里不作讨论,仅介绍标准UNIX文件卷结构。

1.引导块

位于文件卷最开始的第一扇区,这512字节是文件系统的引导代码,为根文件系统所特有,其他文件系统这512字节为空。

2.超级块

位于文件系统第二扇区,紧跟引导块之后,用于描述本文件系统的结构。如i节点长度、文件系统大小等,其结构存放于/usr/include/sys/filsys.h中,其结构如下:

structfilsys

{

ushorts_isize;/*磁盘索引节点区所占用的数据块数*/

daddr_ts_fsize;/*整个文件系统的数据块数*/

shorts_nfree;/*在空闲块登录表中当前登记的空闲块数目*/

daddr_ts_free[NICFREE];/*空闲块登记表*/

shorts_ninode;/*空闲索引节点数*/

ino_ts_inode[NICINOD];/*空闲节点登记表*/

chars_flock;/*加锁标志位*/

chars_ilock;/*节点加锁标志位*/

chars_fmod;/*超级块修改标志*/

chars_ronly;/*文件系统只读标志*/

time_ts_time;/*超级块上次修改的时间*/

shorts_dinfo[4];/*设备信息*/

daddr_ts_tfree;/*空闲块总数*/

ino_ts_tinode;/*空闲节点总数*/

chars_fname[6];/*文件系统名称*/

chars_fpack[6];

longs_fill[13];/*填空位*/

longs_magic;/*指示文件系统的幻数*/

longs_type;/*新文件系统类型*/

};

3.i节点表

i节点表存放在超级块之后,其长度是由超级块中的s_isize字段决定的,其作用是用来描述文件的属性、长度、属主、属组、数据块表等,其数据结构在/usr/include/sys/ino.h中,如下:

structdinode

{

ushortdi_mode;

shortdi_nlink;

ushortdi_uid;

ushortdi_gid;

off_tdi_size;

chardi_addr[40];

time_tdi_atime;

time_tdi_mtime;

time_tdi_ctime;

};

4.目录结构

UNIX所有文件均存放于目录中,目录本身也是一个文件。目录存放文件的机制如下:首先,目录文件本身也象普通文件一样,占用一个索引节点,其次,由这个索引节点得到目录内容的存放位置,再次,从其内容中取出一个个的文件名和它对应的节点号,从而访问一个文件。目录结构如下:

索引节点号(2字节).(本目录)(14字节)

索引节点号(2字节)..(父目录)(14字节)

索引节点号(2字节)文件名(14字节)

索引节点号(2字节)文件名(14字节)

索引节点号(2字节)文件名(14字节)

由上可知文件名是依靠目录来描述的,文件的内容和其他信息则由索引节点来描述。

二、文件的删除过程

UNIX下删除一个文件的过程很简单,那就是释放索引节点表和文件占用的数据块,清空文件占用的索引节点,但不清除文件内容。但删除文件与删除目录的处理不尽相同,不同命令删除文件的过程也不相同。

1.删除一个文件

UNIX删除一个文件的具体步骤是:根据文件i节点的地址表逐一释放文件占用的磁盘数据块,然后清空相应的节点,最后释放i节点。

2.删除一个目录

删除一个目录的过程:首先逐一删除目录里的所有文件,然后删除目录。目录本身也是一个文件,故删除方法与删除文件一致。

3.几种不同的删除命令

.rm命令

一般删除命令,删除过程上述已说明,

.mv命令

格式:mv文件1文件2

处理过程是将文件2的数据块释放,然后将文件1的名称改为文件2,再释放文件2所占的i节点。

.>命令

格式:>文件名

若产生一个新文件,>命令仅仅申请一个i节点,而不写入任何文件内容;若清空一个已经存在的文件,则释放文件所占的数据块,并将文件长度清零。

三、被删文件的恢复策略

要恢复被删除的文件,只能根据删除后留下的东西去做文章。文件被删除后留下了什么呢?由上述分析可知:其一、留下了文件的内容;其二、留下了“现场”。文件的恢复策略只能从这两个方面来分析。以下谈几种恢复策略。

1.根据磁盘现场进行恢复

如果文件被删除,现场未被破坏(即文件被删除后硬盘未发生过写操作),而且假定只删除了一个文件,那么可根据系统的分配算法进行恢复。因为系统建立一个文件时,必定根据某一特定的分配算法决定文件占用的数据块位置。而当该文件被删除后,它所占用的数据块被释放,又回到系统的分配表中,这时如果重新建立一个文件,系统根据原来的分配算法分配出的数据块必定跟该文件原来占用的数据块一致,而且我们知道,UNIX文件最后一数据块尾部多出的字节是全部置0的,据此只要调用系统的数据分配算法,在系统中一块块的申请数据块,因为UNIX文件最后一个数据块尾部多出的字节全部为0,所以,只要发现一个分配出的数据块中尾部全为0,即可认为文件结束,由此可确定文件长度和内容,进而实现恢复。方法如下:

⑴申请一个索引节点,即向系统申请创建一个新文件名而不写入任何内容。如:#>/tmp/xx

⑵调用系统分配数据块算法getnextfreeblock得到一个数据块号,记入某一地址表变量中。

⑶读出这个数据块,判断其尾部是否全部连续为0,若不是,则回到(2),若是,则进行(4)。

⑷首先用系统函数fstat得到/tmp/xx的i节点号,然后将(2)步所得的地址表写入索引节点的地址表中(注意间址问题),并根据数据块个数和最后一块中有效数据长度计算出文件大小,写入i节点的di_size字段。

⑸回写系统的索引节点表即可。

需要说明的是,第一,系统分配数据块的算法因不同的UNIX版本而不同;第二,有的UNIX如SCOUNIX5.0版,其空闲数据块的分配和回收是使用一种动态链表的数据结构来实现的,它们的文件恢复更加容易,只要在空闲链表中的表尾去寻找即可,笔者另行描述。

2.根据内容恢复。

若现场已被破坏,即硬盘发生过写操作,那么只好根据内容来恢复。而且,由于UNIX是一个多进程、多用户系统,它每一次开关机或硬件、通讯故障等都会记录系统日志、.sh_history等,硬盘现场被破坏可能性极大。因此讨论按内容恢复的方法具有更大的实用价值。笔者经过实际探索得出下列四种恢复策略供参考。

⑴关键字搜索法

如果知道被删除的文件内容中若干字节的内容,而且该文件长度又不超过一个磁盘块,那么可以在整个文件系统中搜索这一字节串,得出一个文件所在的数据块,将它们的块号填入一个i节点,即可恢复一个文件,搜索文件系统的算法很简单,说明如下:

a.#df-k确定文件系统的设备文件名(如/dev/root)

b.用下述函数搜索,若成功,返回数据块号,反之返回-1。其中fsname是文件系统的设备名,如/dev/root,comp()参数是实现搜索条件的函数。

longsearchfs(char*fsname,intcomp())

{

FILE*fp;

charbuf[1024];

longi=0;

fp=fopen(fsname,“r”);

while(!feof(fp))

{

fread(buf,1024,1,fp);

if(comp())/*检查是否符合搜索条件*/

returni;/*若成功返回块号*/

i++;

}

fclose(fp);

return-1;/*未找到符合条件的块,返回-1*/

}

⑵精确长度搜索法

如果知道被删除文件的精确长度(字节数),那么可根据一个数据块的大小,计算出文件的最后一个数据块中数据的精确长度,该数据块中其他字节必然是全0。根据这一条件,通过搜索整个文件系统,找出其中符合条件的数据块,若出现多个块符合要求,则还需要根据其他条件区分。但不管怎样,根据精确长度分析也是恢复数据的一个策略。

⑶内容关联法

如果知道文件内容中存在某种可实现的关联,例如文件的校验和,或者文件内容的某种上下文关系,那么也可通过搜索整个文件系统,通过反复尝试寻找符合关联条件的磁盘数据块,进而恢复一个文件。

⑷环境比较法

如果知道删除文件所在的文件系统的安装过程,那么,另行找一台完全相的机器,按原来完全相同的步骤安装相同版本的UNIX和相应的其他软件,可以想象,新的机器环境会与原来的环境基本相同,比较两个机器上相同文件系统的内容,可以推断出被删除文件的大致位置,至少可以大大减少查找的范围,一旦查找的范围足够小时,可以用逐个观察和尝试的方法结合其他条件恢复数据,降低恢复的难度,增加恢复的可靠性。

UNIX系统下文件系统恢复的具体实现依赖于不同操作系统和不同版本的具体文件系统结构和磁盘块分配算法。本文试图总结出一种一般性的思路和策略,限于篇幅,不能详细讨论它们的具体实现过程。

answer 回复于:-02-12 15:19:02太专业了。

不过是好东西,加精华。

yeungxl 回复于:2003-02-12 15:39:38SCOOSR下有更容易的解决方案,具体参见:

www.chinaunix.net/bbsjh/4/15420.html

午夜聆听 回复于:2003-02-12 19:56:51华山大哥的帖子。好精典

quicksand 回复于:2003-02-13 16:28:05好,收藏!

sdclearcase/“ target=”_blank“ >ccf 回复于:2003-02-13 20:11:57实现起来困难。

上一篇:院学生会内部倡议书下一篇:2009学年第二学期二年级语文周末练习