UNIX文件系统:伪文件系统与备份技术详解
1. 其他伪文件系统
在UNIX系统中,存在大量不同的伪文件系统。下面介绍其中一些常见的伪文件系统。
-
UnixWare处理器文件系统
:随着多处理器系统的出现,UnixWare团队引入了一种名为处理器文件系统的新文件系统类型。该文件系统通常挂载在
/system/processor
目录下,系统中的每个处理器对应一个文件。每个文件包含处理器是否在线、处理器类型和速度、缓存大小以及绑定到该处理器的设备驱动程序列表等信息。此文件系统提供的基本信息足以让用户快速了解机器配置以及所有CPU是否正常运行。此外,还有一个只写控制文件,允许管理员设置CPU的在线或离线状态。
-
透明文件系统(TFS)
:透明文件系统(TFS)最初是为满足Sun Microsystems内部软件开发需求而开发的,后来也作为Solaris基础操作系统的一部分发布。其目标是在不复制文件的情况下实现文件共享,同时允许用户在必要时修改文件。TFS文件系统挂载在另一个只读挂载的文件系统之上,用户只能修改顶层文件。为实现这一点,采用了写时复制机制,即在修改文件之前,先将下层文件复制到用户的私有区域。可能存在多个文件系统层,顶层视图是所有下层文件的联合。
-
命名STREAMS
:STREAMS机制是一组可堆叠的模块层,通常用于开发通信栈。例如,TCP/IP和UDP/IP可以通过单个IP STREAMS模块实现,其上分别是TCP模块和UDP模块。SVR4中首次引入的namefs文件系统提供了一种将文件与打开的STREAM关联的方法。通过调用
fattach()
,进而调用
mount()
系统调用将namefs文件系统挂载到指定文件上,实现挂载点与STREAM头之间的关联,使得所有
read()
和
write()
操作都指向该STREAM。
-
FIFO文件系统
:在SVR4中,命名管道由回环STREAMS驱动程序和fifofs文件系统类型共同处理。当在文件系统中查找文件时,如果文件是字符或块特殊文件,或者是命名管道,则调用
specvp()
返回一个specfs vnode。对于命名管道,会从specfs调用
fifovp()
返回一个fifofs vnode,初始化vnode的
v_op
字段为
fifo_vnodeops
,以处理
open()
调用者发起的所有基于文件的操作。与specfs整合对设备文件的访问一样,fifofs对命名管道也执行相同的功能。
-
文件描述符文件系统
:文件描述符文件系统通常挂载在
/dev/fd
,是一种方便访问进程打开文件的方式。在调用
open()
返回文件描述符
n
后,以下两个系统调用是等效的:
fd = open("/dev/fd/n", mode);
fd = dup(n);
需要注意的是,不能通过
/dev/fd
访问其他进程的文件。文件描述符文件系统通常被UNIX shell、awk、perl等脚本语言使用。
2. 文件系统备份
在UNIX世界中,将文件系统备份到磁带或其他介质的相关文档通常不够完善。大多数UNIX用户熟悉
tar
和
cpio
等命令,这些命令可用于从文件和目录层次结构创建单个存档。然而,这些工具在文件可能正在更改时进行复制,可能导致备份的文件系统图像不一致。为解决这个问题,人们采用了各种快照技术,使备份应用程序能够创建文件系统的一致图像。
2.1 传统UNIX工具
-
tar、cpio和pax命令
:
tar和cpio命令都用于构建文件存档,文件集可以是文件和子目录的目录层次结构。tar命令源自BSD,而cpio命令来自System V。由于tar几乎可在所有平台(包括非UNIX操作系统)上使用,因此这里主要介绍tar。-
tar存档格式
:
tar有两种主要格式,即源自BSD UNIX的原始格式和POSIX.1定义的USTAR格式。两种格式的存档都由一组固定大小为512字节的记录组成。存档的第一个条目是描述第一个文件的头记录,随后是零个或多个保存文件内容的记录。每个文件都有一个头记录和对应的内容记录。头记录以可打印的ASCII形式存储,便于将tar存档移植到不同的操作系统类型。存档的结尾由两个填充为零的记录表示。链接字段对于链接文件设置为1,符号链接设置为2,其他情况设置为0。目录在其名称中以斜杠(/)结尾。 -
USTAR tar存档格式
:USTAR tar格式在头记录开始时保留了原始
tar格式,并在旧头信息之后添加了额外信息。通过在魔术字段中搜索以空字符结尾的字符串“ustar”,可以轻松检测到USTAR格式。USTAR格式中保存的信息与stat()系统调用返回的信息相匹配,所有非字符串字段都是八进制数的ASCII表示。
-
tar存档格式
:
$ ls -l file
-rw-r--r-- 1 spate fcf 6 Jun 4 21:56 file
$ grep spate /etc/passwd
spate:x:824:119:Steve Pate:/lhome/spate:/usr/local/bin/bash
$ grep fcf /etc/group
fcf::119:iwww
$ od -c archive.tar
0000000 f i l e \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0000140 \0 \0 \0 \0 0 1 0 0 6 4 4 \0 0 0 0 1
0000160 4 7 0 \0 0 0 0 0 1 6 7 \0 0 0 0 0
0000200 0 0 0 0 0 0 6 \0 0 7 4 7 7 3 1 4
0000220 7 7 3 \0 0 1 0 3 7 4 \0 0 \0 \0 \0
0000240 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0000400 \0 u s t a r \0 s p a t e \0 \0
0000420 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000440 \0 \0 \0 \0 \0 \0 \0 \0 \0 f c f \0 \0 \0 \0
0000460 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0001000 h e l l o \n \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0001020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0024000
- **标准化与pax命令**:POSIX.1定义了`pax`(便携式存档交换)命令,用于读写符合POSIX 1003.1指定的存档/交换文件格式的存档。`pax`命令可以读取多种不同的旧存档格式,包括`cpio`和`tar`存档。为了实现不同版本UNIX之间的兼容性,开放组织建议用户从`tar`迁移到`pax`,这部分是由于`tar`格式的局限性,也是为了让操作系统供应商能够支持单一的存档格式。
-
使用dump和restore进行备份
:第一个
dump命令出现在第6版UNIX中,用于备份完整的文件系统。以VxFS的vxdump和vxrestore命令为例,vxdump可以将文件系统转储到磁带或转储文件(文件系统上保存转储图像的文件)。除了指定磁带属性的多个选项外,vxdump还支持0到9的转储级别。指定该范围内的转储级别时,vxdump会备份自上次较低级别转储以来更改的所有文件。例如,如果在周一进行了2级转储,周二进行了4级转储,那么周三进行的3级转储将备份自周一2级转储以来修改或添加的所有文件。如果指定0级转储,则会备份文件系统中的所有文件。使用转储级别可以实现简单的全量/增量备份方法。
# ls -l /fs1
total 2
-rw-r--r-- 1 root other 6 Jun 7 15:07 hello
drwxr-xr-x 2 root root 96 Jun 7 14:41 lost+found
# vxdump -0 -f /tmp/dumpfile /fs1
vxfs vxdump: Date of this level 0 dump: Fri Jun 7 15:08:16 2002
vxfs vxdump: Date of last level 0 dump: the epoch
vxfs vxdump: Dumping /dev/vx/rdsk/fs1 to /tmp/dumpfile
vxfs vxdump: mapping (Pass I) [regular files]
vxfs vxdump: mapping (Pass II) [directories]
vxfs vxdump: estimated 94 blocks (47KB).
vxfs vxdump: dumping (Pass III) [directories]
vxfs vxdump: dumping (Pass IV) [regular files]
vxfs vxdump: vxdump: 41 tape blocks on 1 volumes(s)
vxfs vxdump: Closing /tmp/dumpfile
vxfs vxdump: vxdump is done
vxrestore
命令可用于从
vxdump
创建的存档中恢复一个或多个文件。在发出任何类型的恢复命令之前,可以使用
vxrestore
的
-t
选项显示转储文件的内容。
# vxrestore -f /tmp/dumpfile -t
Dump date: Fri Jun 7 15:08:16 2002
Dumped from: the epoch
2
.
3
./lost+found
4
./hello
恢复
hello
文件的操作如下:
# cd /fs1 ; rm hello
# vxrestore -f /tmp/dumpfile -x hello
# ls
hello lost+found
vxrestore
还有其他一些选项,包括交互式工作的能力。在这种模式下,可以使用
ls
和
cd
命令查看存档内容,然后再决定提取哪些文件或目录。
3. 冻结图像技术
前面介绍的传统工具可以在已挂载并正在使用的文件系统上运行,但这可能导致备份正在写入的文件,从而在文件更改时将不一致的图像写入磁带或其他介质。理想情况下,备份应在文件系统没有活动时进行,以确保所有备份的文件处于一致状态。然而,系统管理员通常不想为了执行备份而卸载繁忙的文件系统。这时,稳定的快照机制就发挥了作用。
稳定的快照或冻结图像是文件系统的一致副本,允许备份应用程序备份不更改的文件。即使文件系统仍有活动,冻结图像也保证是拍摄时文件系统的一致副本。下面介绍两种不同类型的冻结图像:重启后不持久的快照和重启后持久的快照。需要注意的是,在存储行业中,“快照”、“冻结图像”和“时间点副本”这些术语通常可以互换使用,都指文件系统的稳定图像。
3.1 非持久快照
任何快照技术的目标都是为了执行文件系统备份而提供文件系统的冻结图像。由于传统上备份是在相对较短的时间窗口内进行的,因此认为快照只需要在备份期间存在即可。如果断电或机器关机,快照也会丢失,因此它们是非持久的。下面以VxFS快照为例进行介绍。
- VxFS快照 :VxFS快照机制于20世纪90年代初推出,为文件系统备份提供了稳定的冻结图像。快照是拍摄时文件系统(称为被快照文件系统)的一致视图。VxFS需要一个单独的设备来存储快照数据块,使用写时复制技术,即将要在被快照文件系统中覆盖的任何块首先复制到快照设备。通过使用被快照文件系统中所有块的位图,通过快照读取时,根据位图指示块是否已复制,从被快照文件系统或快照中读取块。同一文件系统可以同时存在多个快照,每个快照都是拍摄时文件系统的副本,因此可能各不相同。每个快照都必须有一个单独的设备。
快照文件系统挂载在与文件系统分开的目录中,看起来与被快照文件系统完全相同,这使得任何UNIX实用程序或备份软件都可以正常工作。但需要注意的是,任何使用原始设备复制文件系统的备份实用程序都不能使用原始快照设备。可以使用
fscat
命令创建文件系统的原始图像。
创建VxFS快照的步骤如下:
# vxassist make fs1 100m
# mkfs -F vxfs /dev/vx/rdsk/fs1 100m
version 4 layout
204800 sectors, 102400 blocks of size 1024, log size 1024 blocks
unlimited inodes, largefiles not supported
102400 data blocks, 101280 free data blocks
4 allocation units of 32768 blocks, 32768 data blocks
last allocation unit has 4096 data blocks
# mount -F vxfs /dev/vx/dsk/fs1 /fs1
# echo hello > /fs1/fileA
# echo goodbye > /fs1/fileB
# mkdir /snap
# vxassist make snap 10m
# mount -F vxfs -osnapof=/fs1,snapsize=20480 /dev/vx/dsk/snap /snap
# df -k
...
/dev/vx/dsk/fs1 102400 1135 94943 2% /fs1
/dev/vx/dsk/snap 102400 1135 94936 2% /snap
...
快照设备的大小必须足够大,以容纳被快照文件系统中更改的任何块。如果快照文件系统的块用完,它将被禁用,后续访问尝试将失败。通常建议在低活动期间(如夜间或周末)进行快照和后续备份,此时文件系统预计约有2%到6%的更改;在高活动期间,约有15%的更改。为了完全保存被快照文件系统的图像,应使用约为被快照文件系统101%大小的设备。
- 访问VxFS快照 :以下示例展示了VxFS快照的工作原理,包括初始时被快照文件系统和快照的内容相同,以及从被快照文件系统中删除文件后的情况。
# ls -l /fs1
total 4
-rw-r--r-- 1 root other 6 Jun 7 11:17 fileA
-rw-r--r-- 1 root other 8 Jun 7 11:17 fileB
drwxr-xr-x 2 root root 96 Jun 7 11:15 lost+found
# ls -l /snap
total 4
-rw-r--r-- 1 root other 6 Jun 7 11:17 fileA
-rw-r--r-- 1 root other 8 Jun 7 11:17 fileB
drwxr-xr-x 2 root root 96 Jun 7 11:15 lost+found
# cat /fs1/fileA
hello
# cat /snap/fileA
hello
# rm /fs1/fileA
# cat /snap/fileA
hello
# df -k
...
/dev/vx/dsk/fs1 102400 1134 94944 2% /fs1
/dev/vx/dsk/snap 102400 1135 94936 2% /snap
...
文件删除后,
df
的输出显示两个文件系统不同,被快照文件系统显示更多的空闲块,而快照仍然保留拍摄时的属性。需要注意的是,当存在一个或多个快照文件系统时,对被快照文件系统的任何更改,如果块尚未复制,则会导致将块复制到快照。虽然从被快照文件系统读取不会显示性能下降,但对被快照文件系统中的文件进行写入操作的时间可能会增加2到3倍。
-
使用VxFS快照进行备份
:可以通过多种方式从快照文件系统进行稳定备份。首先,可以使用任何传统的UNIX工具(如
tar和cpio)。由于快照中的文件不会更改,使用这些工具生成的存档是拍摄时文件集的精确表示。如前所述,使用vxdump时,最好在快照文件系统上运行。
fscat
命令可以像
dd
命令用于原始设备一样用于快照文件系统,但直接在快照设备上运行
dd
不会返回有效的文件系统图像,而是会获取快照超级块、位图、块映射和一系列块。
以下示例展示了如何使用
fscat
:
# vxassist make fs1 10m
# vxassist make fs1-copy 10m
# vxassist make snap 5m
# mkfs -F vxfs /dev/vx/rdsk/fs1 10m
version 4 layout
20480 sectors, 10240 blocks of size 1024, log size 1024 blocks
unlimited inodes, largefiles not supported
10240 data blocks, 9144 free data blocks
1 allocation units of 32768 blocks, 32768 data blocks
last allocation unit has 10240 data blocks
# mount -F vxfs /dev/vx/dsk/fs1 /fs1
# echo hello > /fs1/hello
# echo goodbye > /fs1/goodbye
# mount -F vxfs -osnapof=/fs1,snapsize=10240 /dev/vx/dsk/snap /snap
# rm /fs1/hello
# rm /fs1/goodbye
# fscat /dev/vx/dsk/snap > /dev/vx/rdsk/fs1-copy
在调用
fscat
之前,从被快照文件系统中删除了文件。由于拍摄快照时文件系统处于活动状态,文件系统超级块标志被标记为脏,表示正在使用。因此,
fscat
创建的文件系统的超级块也会被标记为脏,在挂载之前需要进行
fsck
日志重放。挂载后,最初写入被快照文件系统的文件如预期可见:
# fsck -F vxfs /dev/vx/rdsk/fs1-copy
log replay in progress
replay complete - marking super-block as CLEAN
# mount -F vxfs /dev/vx/dsk/fs1-copy /fs2
# ls -l /fs2
total 4
综上所述,UNIX文件系统中的伪文件系统为用户提供了各种特殊功能,而文件系统备份技术则确保了数据的安全性和可恢复性。了解这些技术和工具的使用方法,对于UNIX系统的管理和维护至关重要。
UNIX文件系统:伪文件系统与备份技术详解
4. 持久快照(待补充)
虽然文档中未详细提及持久快照,但可以从概念上理解,持久快照是指在系统重启后仍然存在的文件系统快照。与非持久快照不同,持久快照可以在系统故障或重启后继续用于数据恢复和备份操作。这对于需要长期保留数据状态的应用场景非常有用,例如在进行定期数据审计或合规性检查时,可以使用持久快照来获取特定时间点的文件系统状态。
5. 技术总结与对比
为了更好地理解不同文件系统和备份技术的特点,下面通过表格和流程图进行总结对比。
5.1 文件系统类型对比
| 文件系统类型 | 特点 | 应用场景 |
|---|---|---|
| UnixWare处理器文件系统 | 显示每个处理器的信息,如是否在线、类型、速度等;有写 - 只控制文件可设置CPU状态 | 快速了解机器配置和CPU运行情况 |
| 透明文件系统(TFS) | 挂载在只读文件系统之上,采用写时复制机制,实现文件共享与修改 | 软件开发中的文件共享场景 |
| 命名STREAMS(namefs) | 将文件与打开的STREAM关联,使读写操作指向STREAM | 通信栈开发 |
| FIFO文件系统(fifofs) | 处理命名管道,整合对命名管道的访问 | 涉及命名管道的文件操作 |
| 文件描述符文件系统 |
挂载在
/dev/fd
,方便访问进程打开的文件
| 脚本语言访问进程文件 |
5.2 备份工具对比
| 备份工具 | 特点 | 操作步骤 |
|---|---|---|
| tar | 可构建文件存档,有原始和USTAR两种格式 |
1. 创建存档:
tar cvf files.tar /path/to/files
2. 显示内容:
tar tvf files.tar
3. 提取文件:
tar xvf files.tar
|
| pax | 可读写符合POSIX 1003.1格式的存档,能读取多种旧格式 |
按POSIX标准使用,如
pax -w -f archive.pax /path/to/files
|
| vxdump/vxrestore | 可备份和恢复完整文件系统,支持0 - 9级转储 |
1. 备份:
vxdump -0 -f /tmp/dumpfile /fs1
2. 显示内容:
vxrestore -f /tmp/dumpfile -t
3. 恢复文件:
vxrestore -f /tmp/dumpfile -x hello
|
5.3 快照技术对比
| 快照类型 | 特点 | 创建步骤 |
|---|---|---|
| VxFS非持久快照 | 重启后丢失,采用写时复制技术,提供稳定冻结图像 |
1. 创建文件系统:
vxassist make fs1 100m
,
mkfs -F vxfs /dev/vx/rdsk/fs1 100m
,
mount -F vxfs /dev/vx/dsk/fs1 /fs1
2. 创建快照:
vxassist make snap 10m
,
mount -F vxfs -osnapof=/fs1,snapsize=20480 /dev/vx/dsk/snap /snap
|
6. 备份流程总结
下面通过mermaid流程图展示使用VxFS快照进行备份的完整流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(创建文件系统):::process
B --> C(创建文件):::process
C --> D(创建快照设备):::process
D --> E(创建快照):::process
E --> F{选择备份工具}:::decision
F -->|tar/cpio| G(使用传统工具备份):::process
F -->|vxdump| H(使用vxdump备份):::process
F -->|fscat| I(使用fscat备份):::process
G --> J([结束]):::startend
H --> J
I --> K(进行fsck日志重放):::process
K --> L(挂载备份文件系统):::process
L --> J
这个流程图展示了从创建文件系统到完成备份的整个过程,涵盖了不同备份工具的选择和后续操作。
7. 性能考虑
在使用这些文件系统和备份技术时,性能是一个重要的考虑因素。
- 文件系统操作性能 :如在使用VxFS快照时,虽然读取被快照文件系统不会导致性能下降,但写入操作时间可能会增加2 - 3倍。这是因为写入时可能需要将块复制到快照设备。因此,在高写入负载的场景下,需要谨慎使用快照功能。
-
备份性能
:不同的备份工具和方法对系统性能的影响也不同。例如,使用
vxdump进行全量备份时,可能会占用较多的系统资源和时间;而使用增量备份(指定非0级转储)则可以减少备份时间和资源消耗。在选择备份策略时,需要根据系统的实际情况和业务需求进行权衡。
8. 实际应用建议
-
对于系统管理员
:
- 定期进行文件系统备份,根据业务需求选择合适的备份工具和级别。例如,对于重要的系统文件,建议进行全量备份(0级转储);对于日常变化较小的数据,可以采用增量备份。
- 合理使用快照技术,在低活动期间进行快照操作,以减少对系统性能的影响。同时,确保快照设备有足够的空间来存储更改的块。
-
对于开发人员
:
- 利用透明文件系统(TFS)进行文件共享和开发,提高开发效率。
- 在开发通信栈时,使用命名STREAMS(namefs)来实现文件与通信流的关联。
总之,UNIX文件系统的伪文件系统和备份技术为系统管理和开发提供了丰富的功能和工具。通过深入了解这些技术的特点和使用方法,并根据实际需求进行合理选择和配置,可以提高系统的稳定性、数据的安全性和开发效率。
超级会员免费看
7

被折叠的 条评论
为什么被折叠?



