一. 文件系统类型
在 AIX 5L Version 5.3 中,支持下列类型的文件系统:
1.1日志文件系统
之所以将这种类型文件系统称为日志文件系统是因为,这种系统使用日志技术来维护控制结构的完整性。每个日志文件系统必须位于不同的 JFS 逻辑卷。因此,该文件系统的大小为一个逻辑分区大小的倍数。
1.2 增强的日志文件系统
这是初始日志文件系统的增强版本。它使用基于区段的分配以支持更高的性能、更大的文件系统和更大的文件大小。每个增强的日志文件系统必须位于不同的 JFS2 逻辑卷。当使用缺省选项安装操作系统时,将创建 JFS2 文件系统。
1.3 网络文件系统
网络文件系统 (NFS) 是一种分布式文件系统,它允许用户访问位于远程计算机的文件和目录,可以像使用本地文件和目录那样使用这些远程文件和目录。
1.4 CD-ROM 文件系统
CD-ROM 文件系统 (CDRFS) 是一种文件系统类型,它允许您通过一般的文件系统接口来访问 CD-ROM 中的内容。
二. 文件系统结构
日志文件系统使用了各种数据结构,如超级块、分配组、索引节点,块、分段和设备日志。
2.1 超级块
超级块中包含关于文件系统的控制信息,如文件系统的整体大小(单位为 512 字节的块)、文件系统名称、文件系统日志设备、版本编号、索引节点的数目、空闲索引节点列表、空闲数据块列表、创建时间和日期,以及文件系统状态。所有这些数据都存储在文件系统的第一个逻辑块中。如果这些数据损坏,可能会使得该文件系统无法使用。所以,系统在逻辑块 31 中保存了超级块的另一个副本。
2.2 分配组
分配组由索引节点及其相应的数据块组成。分配组可以跨越多个相邻的磁盘块,并且提高 I/O 操作的速度。JFS 和 JFS2 文件系统都使用了分配组。对于 JFS 文件系统,可以在创建文件系统时指定分配组的大小。
2.3 索引节点
索引节点包含关于文件的控制信息,如类型、大小、拥有者、文件创建、修改或者最近访问的日期和时间。它还包含指向存储文件实际数据的数据块的指针。每个文件都具有对应的索引节点。
对于 JFS 文件系统,索引节点的最大数目(对应着文件的最大数目),由创建文件系统时所指定的每个索引节点拥有的字节数(number of bytes per inode,nbpi)值来确定。对于文件系统中的每个 nbpi 字节,都会创建一个索引节点。索引节点的总数是固定的。nbpi 值需要与分配组大小相关联。
JFS 将所有的文件系统限制为 16 MB (224) 个索引节点。
JFS2 文件系统动态地管理索引节点所需的空间,所以不存在任何 nbpi 参数。
2.4 数据块
数据块存储了文件的实际数据,或者指向其他数据块的指针。磁盘块大小的缺省值为 4 KB。
2.5 分段
逻辑块的分段可用于支持小于逻辑块标准大小 (4 KB) 的文件。这个规则仅适用于文件大小小于 32 KB 的最后一个逻辑块。
如果只有 JFS 文件系统,您可以选择使用压缩使得文件的所有逻辑块存储为相邻分段的序列。对文件系统进行压缩,将增加使用该文件系统时 CPU 的使用量和 I/O 活动。
如果需要支持大量较小的文件,这些特性是非常有价值的。在安装的时候,必须为文件系统指定分段的大小。不同的文件系统可以使用不同的分段大小。
三. 设备日志
日志文件系统的日志存储了关于文件系统元数据更改的事务信息。如果计算机崩溃,可以使用该数据来回滚未完成的操作。JFS 文件系统用于对 jfslog 类型的逻辑卷进行日志记录,而 JFS2 文件系统用于对 jfs2log 类型的逻辑卷进行日志记录。
不对数据块中的数据进行日志记录。日志设备用于确保文件系统的完整性,而不是数据的完整性。
在安装了操作系统之后,rootvg 卷组中所有的文件系统都使用逻辑卷 hd8 作为公共的日志。
您可以创建一个能够使用内联日志 (inline log) 的 JFS2 文件系统。这意味着,可以将日志数据写入到与该文件系统相同的逻辑卷,而不是写入到日志逻辑卷。
四. 文件系统的区别
下表显示了 JFS 和 JFS2 文件系统之间的一些区别。
功能
JFS
JFS2
体系结构上最大的文件系统大小
1 TB
4 PB
体系结构上最大的文件大小
64 GB
4 PB
索引节点的数目
在创建文件系统时确定
动态
索引节点大小
128 字节
512 字节
分段大小
512
512
块大小
4096
4096
目录组织
线性
B-树
压缩
是
否
创建时缺省的所有权
sys.sys
root.system
缺省文件模式的 SGID
SGID=on
SGID=off
配额
是
是
日志文件系统的区别
JFS 和 JFS2 文件系统可以共存于相同的系统中。
如果您需要将数据从 JFS 文件系统迁移到 JFS2 文件系统,那么您必须对 JFS 文件系统进行备份,然后将数据还原到 JFS2 文件系统。
五. 对文件系统进行碎片整理
分段和压缩的使用,以及大量文件的创建和删除,都可能降低连续的空闲磁盘空间的数量。defragfs 命令可用于提高或者报告文件系统中连续空间的状态。 要对文件系统 /home 进行碎片整理,可以使用下面的命令:
defragfs /home
六. 显示关于索引节点的信息
可以使用 istat 命令来显示关于某个特定索引节点的信息.
# istat /etc/passwd
Inode 66 on device 10/4 File
Protection: rw-r--r--
Owner: 0(root) Group: 7(security)
Link count: 1 Length 644 bytes
Last updated: Thu Dec 1 18:14:12 CST 2005
Last modified: Thu Dec 1 18:14:12 CST 2005
Last accessed: Mon Dec 5 17:04:17 CST 2005
七. 对文件系统问题进行故障排除
7.1 对超级块错误进行恢复
如果您在使用 fsck 或者 mount 命令时收到下面的错误之一,那么该问题可能是超级块遭到损坏:
fsck: Not an AIX3 file system
fsck: Not an AIXV3 file system
fsck: Not an AIX4 file system
fsck: Not an AIXV4 file system
fsck: Not a recognized file system type
mount: invalid argument
使用下列命令的其中一个,通过将超级块备份还原到主超级块,从而解决这个问题:
dd count=1 bs=4k skip=31 seek=1 if=/dev/lv00 of=/dev/lv00
在完成了还原过程之后,使用 fsck 命令检查文件系统的完整性。如果该操作无法解决这个问题,那么重新创建文件系统,并从备份还原数据。
7.2 无法卸载文件系统
如果文件系统中存在任何处于活动状态的引用,则不能卸载该文件系统。下面的情况可能导致一个已装入的文件系统中存在打开的引用:
(1)文件系统中存在打开的文件。在卸载文件系统之前,必须关闭这些文件。要确定指定的文件系统中所有包含打开引用的进程的进程 ID,最好的方法是使用 fuser 命令。可以使用 kill 命令终止包含打开引用的进程,然后就可以完成卸载工作了。
(2)如果文件系统仍然处于繁忙状态并且无法对其进行卸载,那么这可能是由于加载了内核扩展,但存在于源文件系统中。fuser 命令无法显示这些类型的引用,因为并没有涉及到任何用户进程。然而,genkex 命令将报告所有已加载的内核扩展。
(3)该文件系统中装入了其他文件系统。如果该文件系统中装入了任何其他文件系统,那么将在源文件系统中装入其他文件系统的装入点存在打开的引用。要卸载某个文件系统,需要卸载其中所装入的所有文件系统。
(4)用户正使用该文件系统中的目录作为其当前工作目录。对于使用某个目录作为其当前工作目录的进程,fuser 命令将在对应的进程 ID 后面追加字母“c”,而 -u 标志可以表示进程的拥有者。可以将其与 find 命令一同使用,如下面的示例所示:
# find /home -type d -exec fuser -u {} /;
/home:
/home/lost+found:
/home/guest:
/home/kenzie:3548c(kenzie)
7.3 文件系统没有剩余空间
文件系统没有剩余空间可能会产生各种各样的问题。例如,有些系统创建的文件系统,如 /、/usr、/var 和 /tmp,由某些系统命令所使用。如果这些文件系统中没有可用空间,那么可能会产生一些预料之外的结果。请始终确保在这些文件系统中存在足够的空闲空间。您可以使用诸如 df 或 du 之类的命令,监视您的文件系统的空间使用情况。
八. 创建一个文件系统
AIX 5L Version 5.3 中的每个文件系统都必须位于某个逻辑卷。
当您创建文件系统时,如果您没有指定一个以前创建的逻辑卷,那么系统将使用系统生成的名称创建一个逻辑卷,并使用缺省值作为该逻辑卷的特征。文件系统的大小非常接近逻辑分区大小的倍数。文件系统的大小不能超过逻辑卷的标准最大逻辑分区数。将向 /etc/filesystem 中添加一个包含该文件系统详细信息的节,并将新的数据写入到 ODM。
在示例中,我们说明了如何使用 crfs 命令,如下所示:
(1)lsvg -l testvg 说明 testvg 不包含任何 jfs、jfs2、jfslog 和 jfs2log 类型的逻辑卷。
(2)crfs -v jfs -g testvg -a size=10M -m /fs1 将在卷组 testvg 创建一个大小为 10 MB 的 jfs 文件系统,并且装入点为 /fs1。目前没有任何 jfs 逻辑卷,所以系统将创建一个,并指定其名称为 lv00。目前没有任何 jfs 日志设备,所以系统将创建一个,并指定其名称为 loglv00。
(3)crfs -v jfs2 -g testvg -a size=10M -p ro -m /fs2 将在卷组 testvg 中创建一个大小为 10 MB 的 jfs2 文件系统,其装入点为 /fs2,并且具有只读权限。目前没有任何 jfs2 逻辑卷,所以系统将创建一个,并指定其名称为 fslv00。目前没有任何 jfs2 日志设备,所以系统将创建一个,并指定其名称为 loglv01。
(4)lslv lv00 和 lslv fslv00 说明所创建的逻辑卷使用了它们缺省的特征。
(5)cat /etc/filesystems|grep -ip fs1 显示了 /etc/filesystems 中与 fs1 相对应的节。
示例:创建文件系统时不指定逻辑卷
# lsvg -l testvg
testvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
# crfs -v jfs -g testvg -a size=10M -m /fs1
Based on the parameters chosen, the new /fs1 JFS file system
is limited to a maximum size of 134217728 (512 byte blocks)
New File System size is 262144
# crfs -v jfs2 -g testvg -a size=10M -p ro -m /fs2
File system created successfully.
130864 kilobytes total disk space.
New File System size is 262144
# lsvg -l testvg
testvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
loglv00 jfslog 1 1 1 closed/syncd N/A
lv00 jfs 1 1 1 closed/syncd /fs1
loglv01 jfs2log 1 1 1 closed/syncd N/A
fslv00 jfs2 1 1 1 closed/syncd /fs2
# lslv lv00
LOGICAL VOLUME: lv00 VOLUME GROUP: testvg
LV IDENTIFIER: 00c478de00004c0000000107d96de510.2 PERMISSION: read/write
VG STATE: active/complete LV STATE: closed/syncd
TYPE: jfs WRITE VERIFY: off
MAX LPs: 512 PP SIZE: 128 megabyte(s)
COPIES: 1 SCHED POLICY: parallel
LPs: 1 PPs: 1
STALE PPs: 0 BB POLICY: relocatable
INTER-POLICY: minimum RELOCATABLE: yes
INTRA-POLICY: middle UPPER BOUND: 32
MOUNT POINT: /fs1 LABEL: /fs1
MIRROR WRITE CONSISTENCY: on/ACTIVE
EACH LP COPY ON A SEPARATE PV ?: yes
Serialize IO ?: NO
# lslv fslv00
LOGICAL VOLUME: fslv00 VOLUME GROUP: testvg
LV IDENTIFIER: 00c478de00004c0000000107d96de510.4 PERMISSION: read/write
VG STATE: active/complete LV STATE: closed/syncd
TYPE: jfs2 WRITE VERIFY: off
MAX LPs: 512 PP SIZE: 128 megabyte(s)
COPIES: 1 SCHED POLICY: parallel
LPs: 1 PPs: 1
STALE PPs: 0 BB POLICY: relocatable
INTER-POLICY: minimum RELOCATABLE: yes
INTRA-POLICY: middle UPPER BOUND: 32
MOUNT POINT: /fs2 LABEL: /fs2
MIRROR WRITE CONSISTENCY: on/ACTIVE
EACH LP COPY ON A SEPARATE PV ?: yes
Serialize IO ?: NO
# cat /etc/filesystems|grep -ip fs1
/fs1:
dev = /dev/lv00
vfs = jfs
log = /dev/loglv00
mount = false
account = false
可以指定以前创建的逻辑卷的名称。逻辑卷类型必须与文件系统类型相匹配。文件系统的大小非常接近逻辑分区大小的倍数。将向 /etc/filesystem 中添加一个包含该文件系统详细信息的节,并对 ODM 进行更新。
在示例中,我们说明了如何使用 crfs 命令,如下所示:
(1)lsvg -l testvg 说明 jfs2 类型的 testlv 逻辑卷不与任何文件系统相关联,并且已经定义了一个 jfs2 日志设备。testlv 只有一个大小为 128 MB 的分区。
(2)crfs -v jfs2 -d /dev/testlv -a logname=loglv01 -m /test -a size=130M 将在现有的、名为 testlv 的逻辑卷创建一个 jfs2 文件系统,该文件系统使用 jfs2 日志设备 loglv01,并将 /test 作为装入点。因为我们为该文件系统指定的大小要大于逻辑卷本身的大小,所以将忽略 size 参数,并且该文件系统最终的大小将接近于逻辑卷的大小。
(3)cat /etc/filesystems|grep -ip test 显示了 /etc/filesystems 中与 test 相对应的节。
示例: 在以前定义的逻辑卷中创建文件系统
# lsvg -l testvg
testvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
loglv00 jfslog 1 1 1 closed/syncd N/A
lv00 jfs 1 1 1 closed/syncd /fs1
loglv01 jfs2log 1 1 1 closed/syncd N/A
fslv00 jfs2 1 1 1 closed/syncd /fs2
testlv jfs2 1 1 1 closed/syncd N/A
# crfs -v jfs2 -d /dev/testlv -a logname=loglv01 -m /test -a size=130M
crfs: Warning: device name given, size parameter ignored.
File system created successfully.
130864 kilobytes total disk space.
New File System size is 262144
# cat /etc/filesystems|grep -ip test
/test:
dev = /dev/testlv
vfs = jfs2
log = /dev/loglv01
mount = false
account = false
九. 装入和卸载文件系统
装入(mount)指的是使得位于某个位置的用户能够使用文件系统、文件、目录、设备和特殊文件。这是使得一个文件系统可以访问的唯一方法。
必须在装入文件系统之前创建装入点。在将文件系统装入到某个目录时,所装入文件系统的 root 目录的权限将优先于装入点的权限。
在示例中,我们使用了 mount 命令,如下所示:
(1)mount /dev/fslv02 /testfs 尝试将 /test 装入到一个不存在的目录,这将产生一个错误。
(2)mount /dev/fslv02 /test 将文件系统装入到一个现有的目录。
(3)umount /testfs 尝试卸载一个并不存在的文件系统,这将产生一个错误。
(4)umount /test 将卸载 /test 文件系统。
示例:装入和卸载文件系统
# mount /dev/fslv02 /testfs
mount: 0506-324 Cannot mount /dev/fslv02 on /testfs: A file or directory in the path name does not exist.
# umount /dev/fslv02 /test
umount: 0506-347 Cannot find anything to unmount.
# mount /dev/fslv02 /test
# umount /testf
umount: 0506-347 Cannot find anything to unmount.
# umount /test
如果您希望装入所有的文件系统,那么您可以使用下面的命令,以便一次性装入所有的文件系统:mount {-a|all}
十. 显示已装入的文件系统
您可以使用不带任何标志的 mount 命令,以显示关于当前所有已装入的文件系统的信息。
示例:使用 mount 命令显示已装入的文件系统
# mount
node mounted mounted over vfs date options
-------- --------------- --------------- ------ ------------ ---------------
/dev/hd4 / jfs2 Nov 27 12:36 rw,log=/dev/hd8
/dev/hd2 /usr jfs2 Nov 27 12:36 rw,log=/dev/hd8
/dev/hd9var /var jfs2 Nov 27 12:36 rw,log=/dev/hd8
/dev/hd3 /tmp jfs2 Nov 27 12:36 rw,log=/dev/hd8
/dev/hd1 /home jfs2 Nov 27 12:36 rw,log=/dev/hd8
/proc /proc procfs Nov 27 12:36 rw
/dev/hd10opt /opt jfs2 Nov 27 12:36 rw,log=/dev/hd8
/dev/testlv /test jfs2 Nov 28 19:54 rw,log=/dev/loglv01
您可以使用 lsfs 命令来显示文件系统的特征。这个命令将显示所有类型的文件系统的数据。
# lsfs -a
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/hd4 -- / jfs2 262144 -- yes no
/dev/hd1 -- /home jfs2 262144 -- yes no
/dev/hd2 -- /usr jfs2 2359296 -- yes no
/dev/hd9var -- /var jfs2 262144 -- yes no
/dev/hd3 -- /tmp jfs2 262144 -- yes no
/proc -- /proc procfs -- -- yes no
/dev/hd10opt -- /opt jfs2 262144 -- yes no
/dev/lv00 -- /fs1 jfs 262144 -- no no
/dev/fslv00 -- /fs2 jfs2 262144 ro no no
# lsfs -q
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/hd4 -- / jfs2 262144 -- yes no
(lv size: 262144, fs size: 262144, block size: 4096, sparse files: yes, inline log: no,
inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
/dev/hd1 -- /home jfs2 262144 -- yes no
(lv size: 262144, fs size: 262144, block size: 4096, sparse files: yes, inline log: no,
inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
/dev/hd2 -- /usr jfs2 2359296 -- yes no
(lv size: 2359296, fs size: 2359296, block size: 4096, sparse files: yes, inline log:
no,inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
/dev/hd9var -- /var jfs2 262144 -- yes no
(lv size: 262144, fs size: 262144, block size: 4096, sparse files: yes, inline log: no,
inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
/dev/hd3 -- /tmp jfs2 262144 -- yes no
(lv size: 262144, fs size: 262144, block size: 4096, sparse files: yes, inline log: no,
inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
/proc -- /proc procfs -- -- yes no
/dev/hd10opt -- /opt jfs2 262144 -- yes no
(lv size: 262144, fs size: 262144, block size: 4096, sparse files: yes, inline log: no,
inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
/dev/lv00 -- /fs1 jfs 262144 -- no no
(lv size: 262144, fs size: 262144, frag size: 4096, nbpi: 4096, compress: no, bf: false, ag: 8)
/dev/fslv00 -- /fs2 jfs2 262144 ro no no
(lv size: 262144, fs size: 262144, block size: 4096, sparse files: yes, inline log: no,
inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
十一. 删除文件系统
您可以使用 rmfs 命令来删除文件系统。该命令将从 /etc/filesystems 中删除相应的节,以及该文件系统所处的逻辑卷。
# lsvg -l testvg
testvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
loglv00 jfslog 1 1 1 closed/syncd N/A
lv00 jfs 1 1 1 closed/syncd /fs1
loglv01 jfs2log 1 1 1 open/syncd N/A
fslv00 jfs2 1 1 1 closed/syncd /fs2
testlv jfs2 1 1 1 open/syncd /test
# rmfs /test
rmfs: 0506-921 /test is currently mounted.
# umount /test
# rmfs /test
rmlv: Logical volume testlv is removed.
# lsvg -l testvg
testvg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
loglv00 jfslog 1 1 1 closed/syncd N/A
lv00 jfs 1 1 1 closed/syncd /fs1
loglv01 jfs2log 1 1 1 closed/syncd N/A
fslv00 jfs2 1 1 1 closed/syncd /fs2
# cat /etc/filesystems|grep test
十二. 更改文件系统的属性
您可以使用 chfs 命令来更改文件系统的某些属性,如装入点权限、日志设备,或者大小,如示例所示。如果文件系统新的大小要大于逻辑卷的大小,那么将对逻辑卷进行扩展以容纳该文件系统,假设它没有超过最大逻辑分区数。
# lsfs -a
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/hd4 -- / jfs2 262144 -- yes no
/dev/hd1 -- /home jfs2 262144 -- yes no
/dev/hd2 -- /usr jfs2 2359296 -- yes no
/dev/hd9var -- /var jfs2 262144 -- yes no
/dev/hd3 -- /tmp jfs2 262144 -- yes no
/proc -- /proc procfs -- -- yes no
/dev/hd10opt -- /opt jfs2 262144 -- yes no
/dev/lv00 -- /fs1 jfs 262144 -- no no
/dev/fslv00 -- /fs2 jfs2 262144 ro no no
# chfs -a size=250M -p rw /fs2
Filesystem size changed to 524288
# lsfs -a
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/hd4 -- / jfs2 262144 -- yes no
/dev/hd1 -- /home jfs2 262144 -- yes no
/dev/hd2 -- /usr jfs2 2359296 -- yes no
/dev/hd9var -- /var jfs2 262144 -- yes no
/dev/hd3 -- /tmp jfs2 262144 -- yes no
/proc -- /proc procfs -- -- yes no
/dev/hd10opt -- /opt jfs2 262144 -- yes no
/dev/lv00 -- /fs1 jfs 262144 -- no no
/dev/fslv00 -- /fs2 jfs2 524288 rw no no
十三. 检查文件系统的一致性
fsck 命令可以检查文件系统的一致性,并以交互的方式修复文件系统。您不应该对一个已装入的文件系统运行 fsck 命令。您必须能够读取该文件系统所处的设备文件。fsck 命令尝试修复文件系统元数据结构,显示关于所找到的不一致内容的信息,并提示您使用相应的权限对其进行修复。它并不恢复数据块中的数据。如果您丢失了数据,那么您必须从备份进行还原。
fsck 命令将所检测到的孤立的文件和目录放到文件系统 root 目录中的 lost+found 目录中。
在系统启动时,将调用 fsck 命令对 /、/usr、/var 和 /tmp 文件系统进行验证。如果验证不成功,则将使得系统无法正常启动。
十四. 日志设备
下面的部分描述了关于文件系统日志的基本信息。
14.1 创建日志设备
在安装系统时,将在 hd8 中为 rootvg 创建专门的日志设备。当您的文件系统的大小不断增加时,您应该考虑增加缺省日志的大小,或者创建新的日志设备。
要创建日志设备,您应该使用 mklv 命令,并将逻辑卷类型指定为 jfslog 或者 jfs2log。
14.2 初始化日志设备
可以使用 logform 命令对日志设备进行初始化,以清除所有的日志记录。相同的命令也可以用于 jfslog 设备、jfs2log2 设备或者内联日志。logform 命令不会影响数据本身。
要对名为 loglv01 的 jf2log 设备进行初始化,可以使用下面的命令:
logform /dev/loglv01