基础学习篇
- 第六章 :Linux 的档案权限与目录配置
- 第七章 :档案与目录管理
- 第八章 :Linux 磁盘与文件系统管理
- 第九章 :文件与文件系统的压缩与打包
- 第十章 :Vim程序编辑器
第六章 :Linux 的档案权限与目录配置
1. 权限设置
chgrp :改变档案所属群组
chown :改变档案拥有者
chmod :改变档案的权限, SUID, SGID, SBIT 等等的特性
[root@www~]# chmod 777 文件名
cp :复制文件
[root@www~]# cp 源文件 目标文件
事实上,chown 也可以使用『chown user.group file』,亦即在拥有者与群组间加上小数点『.』也行! 不过很多朋友在设定账号时,喜欢在账号当中加入小数点(例如vbird.tsai这样的账号格式),这就会造成系统的误判了! 所以我们比较建议使用冒号『:』来隔开拥有者与群组啦!此外,chown 也能单纯的修改所属群组呢! 例如『chown .sshd install.log』就是修改群组~看到了吗?就是那个小数点的用途!
2. 权限对档案的重要性
3. 权限对目录的重要性
Linux下的档案类型:一般文件(regular file)-,目录(directory)d,链接文件(link)l,设备文件(device)【区块设备b和字符设备c】,接口文件(socket)s,数据传输文件(pipe)p
4. Linux目录配置的依据—FHS
因为利用 Linux来开发产品或 distributions的社群/公司与个人实在太多了, 如果每个人都用自己的想法来配置档案放置的目录,那么将可能造成很多管理上的困扰。 你能想象,你进入一个企业之后,所接触到的 Linux目录配置方法竟然跟你以前学的完全不同吗? 所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准!
根据 FHS(http://www.pathname.com/fhs/)的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循 FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为 Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。
事实上,FHS是根据过去的经验一直再持续的改版的,FHS依据文件系统使用的频繁与否与是否允许使用者随意更动, 而将目录定义成为四种交互作用的形态,用表格来说有点像底下这样:
上表中的目录就是一些代表性的目录,该目录底下所放置的数据在底下会谈到,这里先略过不谈。 我们要了解的是,什么是那四个类型?
可分享的:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;
不可分享的:自己机器上面运作的装置档案或者是与程序有关的 socket 档案等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。
不变的:有些数据是不会经常变动的,跟随着 distribution 而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等;
可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。
事实上,FHS针对目录树架构仅定义出三层目录底下应该放置什么数据而已,分别是底下这三个目录的定义:
/ (root, 根目录):与开机系统有关;
/usr (unix software resource):与软件安装/执行有关;
/var (variable):与系统运作过程有关。
为什举要定义出这三层目录呢?其实是有意义的喔!每层目录底下所应该要放置的目录也都又特定的规定!
5. 根目录 (/) 的意义与内容:
根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的, 同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心档案、开机所需程序、 函式库等等档案数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在 FHS的要求方面,他希望根目录不要放在非常大的分割槽内, 因为越大的分割槽妳会放入越多的数据,如此一来根目录所在分割槽就可能会有较多发生错误的机会。
因此 FHS标准建议:根目录(/)所在分割槽应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分割槽内,保持根目录越小越好。 如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。
有鉴于上述的说明,因此 FHS定义出根目录(/)底下应该要有底下这些次目录的存在才好:
除了这些目录的内容之外,另外要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载, 其他分割槽则是在开机完成之后才会持续的进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录, 就不能够与根目录放到不同的分割槽去!那哪些目录不可与根目录分开呢?有底下这些:
/etc:配置文件
/bin:重要执行档
/dev:所需要的装置档案
/lib:执行档所需的函式库与核心所需的模块
/sbin:重要的系统执行文件
这五个目录千万不可与根目录分开在不同的分割槽!
6. /usr 的意义与内容:
依据 FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static), 如果你知道如何透过网络进行分割槽的挂载(例如在朋务器篇会谈到的 NFS朋务器),那么/usr 确实可以分享给局域网络内的其他主机来使用喔!
很多读者都会误会/usr 为user 的缩写,其实usr 是Unix Software Resource 的缩写, 也就是『Unix操作系统软件资源』所放置的目录,而不是用户的数据啦! FHS 建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。 因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr底下,因此这个目录有点类似Windows 系统的『C:\Windows\ + C:\Program files\』这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。 一般来说,/usr的次目录建议有底下这些:
7. /var 的意义与内容:
如果/usr 是安装时会占用较大硬盘容量的目录,那么/var就是在系统运作后才会渐渐占用硬盘容量的目录。 因为/var 目录主要针对常态性变动的档案,包括快取(cache)、登录档(log file)以及某些软件运作所产生的档案, 包括程序档案(lock file, run file),或者例如MySQL 数据库的档案等等。常见的次目录有:
针对FHS,各家distributions的异同由于 FHS仅是定义出最上层(/)及次层(/usr, /var)的目录内容应该要放置的档案与目录数据, 因此,在其他次目录层级内,就可以随开发者自行来配置了。举例来说,CentOS的网络设定数据放在 /etc/sysconfig/network-scripts/ 目录下,但是 SuSE 则是将网络放置在 /etc/sysconfig/network/ 目录下,目录名称可是不同的呢!不过只要记住大致的 FHS标准,差异性其实有限啦!
8. 目录树(directory tree)
另外,在 Linux底下,所有的档案与目录都是由根目录开始的!那是所有目录与档案的源头~ 然后再一个一个的分支下来,有点像是树枝状. 因此,我们也称这种目录配置方式为:『目录树(directory tree)』 这个目录树有什么特性呢?他主要的特性有:
目录树的起始点为根目录 (/, root);
每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。
每一个档案在此目录树中的文件名(包含完整路径)都是独一无二的。
如果我们将整个目录树以图标的方法来显示,并且将较为重要的档案数据列出来的话,那么目录树架构有点像这样:
根据 FHS 的定义,最好能够将/var 独立出来, 这样对于系统的数据还有一些安全性的保护!因为至少/var 死掉时,你的根目录还会活着! 还能够进入救援模式!
分区建议:
/boot
/:
/var:
/usr:
/home:
第七章 :档案与目录管理
1.常见处理目录的命令:
-
cd:切换目录
-
pwd :显示当前目录
-
mkdir:新建一个新的目录
-
rmdir:删除一个空的目录
-
mv:移动文件或目录
-
rm:移除文件或目录
2.取得路径的文件名与目录名称
我们前面介绍的完整文件名 (包含目录名称与文件名) 当中提到,完整档名最长可以到达 4096 个字符。 那么你怎么知道那个是档名?那个是目录名?就是利用斜线 (/) 来分辨! 其实,取得文件名或者是目录名称,一般的用途应该是在写程序的时候,用来判断之用的~ 所以,这部分的指令可以用在第三篇内的 shell scripts 里头喔! 底下我们简单的以几个范例来谈一谈 basename 与 dirname 的用途!
3. 档案内容查阅:
如果我们要查阅一个档案的内容时,该如何是好呢?这里有相当多有趣的指令可以来分享一下: 最常使用的显示档案内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的档案 (好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到!好了,说说各个指令的用途吧!
cat 由第一行开始显示档案内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示档案内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巳几行
od 以二进制的方式读取档案内容!
4. 修改档案时间或建置新档: touch
我们在 ls 这个指令的介绍时,有稍微提到每个档案在 linux底下都会记录讲多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?
modification time (mtime):
当该档案的『内容数据』变更时,就会更新这个时间!内容数据指的是档案的内容,而不是档案的属性或权限喔!
status time (ctime):
当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。
access time (atime):
当『该档案的内容被取用』时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会更新该档案的 atime 了。
touch这个命令最常使用的情况是:
1:创建一个空的文件
2:将某个文件日期改为目前日期
例子:
5. umask用法:目前用户在新建文件或目录时候的权限默认值
在默认权限的属性上,目录与档案是不一样的。从第六章我们知道 x 权限对于目录是非常重要的! 但是一般档案的建立则不应该有执行的权限,因为一般档案通常是用在于数据的记录嘛!当然不需要执行的权限了。 因此,预设的情况如下:
若使用者建立为『档案』则预设『没有可执行( x )权限』,亦即只有 rw 这两个项目, 也就是最大为 666 分,预设权限如下: -rw-rw-rw-
若用户建立为『目录』,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放, 亦即为 777 分,预设权限如下: drwxrwxrwx
要注意的是,umask 指的是『该默认值需要减掉的权限!』如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:
建立档案时:(-rw-rw-rw-) - (-----w–w-) ==> -rw-r–r–
建立目录时:(drwxrwxrwx) - (d----w–w-) ==> drwxr-xr-x
例子:
6. find指令
find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
第八章 :Linux 磁盘与文件系统管理
1. 文件系统特性
2. 文件系统的运作方式
常常会听到所谓的『碎片整理』吧? 需要碎片整理的原因就是档案写入的 block 太过于离散了,此时档案读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个档案所属的 blocks 汇整在一起,这样数据的读取会比较容易啊! 想当然尔,FAT 的文件系统需要三不五时的碎片整理一下,那么 Ext2 是否需要磁盘重整呢?
由于Ext2 是索引式文件系统,基本上不太需要常常进行碎片整理的。但是如果文件系统使用太久, 常常删除/编辑/新增档案时,那么还是可能会造成档案数据太过于离散的问题,此时或许会需要进行重整一下的. 不过,老实说,鸟哥倒是没有在 Linux 操作系统上面进行过 Ext2/Ext3 文件系统的碎片整理。
3. Linux 的 EXT2 文件系统(inode):
(1) data block (资料区块)
data block 是用来放置档案内容数据地方,在 xt2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录啦。 不过要注意的是,由于 block 大小的差异,会寻致该文件系统能够支持的最大磁盘容量与最大单一档案容量并不相同。 因为 block 大小而产生的 Ext2 文件系统限制如下:
(2) inode table (inode表格)
基本上,inode 记录的档案数据至少有底下这些:(注4)
该档案的存取模式(read/write/excute);
该档案的拥有者与群组(owner/group);
该档案的容量;
该档案建立或状态改变的时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
定义档案特性的旗标(flag),如 SetUID…;
该档案真正内容的指向 (pointer);
inode 的数量与大小也是在格式化时就已经固定了,除此之外 inode 还有些什么特色呢?
每个 inode 大小均固定为 128 bytes;
每个档案都仅会占用一个 inode 而已;
承上,因此文件系统能够建立的档案数量与 inode 的数量有关;
系统读取档案时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。
这样子 inode 能够指定多少个 block 呢?我们以较小的 1K block 来说明好了,可以指定的情况如下:
12 个直接指向: 12*1K=12K
由于是直接指向,所以总共可记录 12 笔记录,因此总额大小为如上所示;
间接: 256*1K=256K
每笔 block 号码的记录会花去 4bytes,因此 1K 的大小能够记录 256 笔记录,因此一个间接可以记录的档案大小如上;
双间接: 2562561K=2562K
第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个号码,因此总额大小如上;
三间接: 256256256*1K=2563K
第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个第三层,每个第三层可以指定256 个号码,因此总额大小如上;
总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256256 + 256256*256 (K) = 16GB
此时我们知道当文件系统将 block 格式化为 1K 大小时,能够容纳的最大档案为 16GB,比较一下文件系统限制表的结果可发现是一致的!但这个方法不能用在 2K 及 4K block 大小的计算中, 因为大于2K 的 block 将会受到 Ext2 文件系统本身的限制,所以计算的结果会不太符合之故。
(3) Superblock (超级区块)
Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有:
block 与 inode 的总量;
未使用与已使用的 inode / block 数量;
block 与inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes);
filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;
一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为1 。
Superblock 是非常重要的,因为我们这个文件系统的基本信息都写在这里,因此,如果 superblock死掉了, 你的文件系统可能就需要花费很多时间去挽救啦!一般来说,superblock 的大小为1024bytes。相关的 superblock 讯息我们等一下会以 dumpe2fs 指令来呼叫出来观察喔!
此外,每个 blockgroup 都可能含有 superblock 喔!但是我们也说一个文件系统应该仅有一个superblock 而已,那是怎么回事啊? 事实上除了第一个block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有 superblock 则该 superblock 主要是做为第一个 blockgroup 内 superblock 的备份,这样可以进行 superblock 的救援呢!
(4) Filesystem Description (文件系统描述说明)
这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于 哪一个 block 号码之间。这部份也能够用 dumpe2fs 来观察的。
(5) block bitmap (区块对照表)
如果你想要新增档案时总会用到 block 吧!那你要使用那个 block 来记录呢?当然是选择『空的block 』来记录新档案的数据啰。 那你怎么知道那个 block 是空的?这就得要透过 block bitmap 的辅助了。从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置档案啰。
同样的,如果你删除某些档案时,那么那些档案原本占用的 block 号码就得要释放出来, 此时在block bitmpap 当中相对应到该 block 号码的标志就得要修改成为『未使用中』啰!这就是 bitmap的功能。
(6) inode bitmap (inode 对照表)
这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码, 至于 inode bitmap 则是记录使用与未使用的 inode 号码啰!
4. 与目录树的关系
由前一小节的介绍我们知道在 Linux 系统下,每个档案(不管是一般档案还是目录档案)都会占用一个inode , 且可依据档案内容的大小来分配多个 block 给该档案使用。而由第六章的权限说明中我们知道目录的内容在记录文件名, 一般档案才是实际记录数据内容的地方。那么目录与档案在 Ext2 文件系统当中是如何记录数据的呢? 基本上可以这样说:
(1) 目录
当我们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 于至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。也就是说目录所占用的 block 内容在记录如下的信息:
(2) 档案:
当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配一个 inode 与相对于该档案大小的block 数量给该档案。例如:假设我的一个 block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode 与 25 个 block 来储存该档案! 但同时请注意,由于 inode 仅有 12个直接指向,因此还要多一个 block 来作为区块号码的记录喔!
5. 目录树读取:
inode 本身并不记录文件名,文件名的记录是在目录的 block 当中。 因此在第六章档案与目录的权限说明中, 我们才会提到『新增/删除/更名文件名与目录的 w 权限有关』的特色!那么因为文件名是记录在目录的 block 当中, 因此当我们要读取某个档案时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取档案的 inode 号码, 最终才会读到正确的档案的 block 内的数据。
由于 目录树是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的 inode 号码(通常一个filesystem 的最顶层 inode 号码会由 2 号开始喔!),此时就能够得到根目录的 inode 内容,并依据该inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的档名。
举例来说,如果我想要读取 /etc/passwd 这个档案时,系统是如何读取的呢?
如上表所示,该档案的读取流程为(假设读取者身份为 vbird 这个一般身份使用者):
(1). / 的 inode:
透过挂载点的信息找到 /dev/hdc2 的 inode 号码为 2 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r与 x) ;
(2). / 的 block:
经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (1912545);
(3). etc/ 的 inode:
读取 1912545 号 inode 得知 vbird 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
(4). etc/ 的 block:
经过上个步骤取得 block 号码,并找到该内容有 passwd 档案的 inode 号码 (1914888);
(5). passwd 的 inode:
读取 1914888 号 inode 得知 vbird 具有 r 的权限,因此可以读取 passwd 的 block 内容;
(6). passwd 的 block:
最后将该 block 内容的数据读出来。
6. filesystem 大小与磁盘读取效能:
另外,关于 文件系统的使用效率上,当你的一个文件系统规划的很大时,例如 100GB 这么大时, 由于硬盘上面的数据总是来来去去的,所以,整个文件系统上面的档案通常无法连续写在一起(block 号码不会连续的意思), 而是填入式的将数据填入没有被使用的 block 当中。如果档案写入的 block 真的分的很散, 此时就会有所谓的档案数据离散的问题发生了。
如前所述,虽然我们的 ext2 在 inode 处已经将该档案所记录的 block 号码都记上了, 所以资料可以一次性读取,但是如果档案真的太过离散,确实还是会发生读取效率低落的问题。 因为磁盘读取头还是得要在整个文件系统中来来去去的频繁读取! 果真如此,那么可以将整个 filesystme 内的数据全部复制出来,将该 filesystem 重新格式化, 再将数据给他复制回去即可解决这个问题。
此外,如果 filesystem 真的太大了,那么当一个档案分别记录在这个文件系统的最前面与最后面的 block 号码中, 此时会造成硬盘的机械手臂移动幅度过大,也会造成数据读取效能的低落。而且读取头再搜寻整个 filesystem 时, 也会花费比较多的时间去搜寻!因此, partition 的规划并不是越大越好, 而是真的要针对您的主机用途来进行规划才行!
7. EXT2/EXT3 档案的存取与日志式文件系统的功能
上一小节谈到的仅是读取而已,那么如果是新建一个档案或目录时,我们的 Ext2 是如何处理的呢? 这个时候就得要 block bitmap 及 inode bitmap 的帮忙了!假设我们想要新增一个档案,此时文件系统的行为是:
(1). 先确定用户对于 欲新增档案的目录是否具有 w 与 x 的权限,若有的话才能新增;
(2). 根据 inode bitmap 找到没有使用的 inode 号码,并将新档案的权限/属性写入;
(3). 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新inode 的 block 指向数据;
(4). 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新superblock 的内容。
一般来说,我们将 inode table 与 data block 称为数据存放区域,至于 其他例如 superblock、 block bitmap 与 inode bitmap 等区段就被称为 metadata (中介资料) 。因为 superblock, inode bitmap 及 block bitmap 的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此才被称为中介数据的啦。
- 日志式文件系统 (Journaling filesystem)
为了避免上述提到的文件系统不一致的情况发生,因此我们的前辈们想到一个方式, 如果在我们的filesystem 当中规划出一个区块,该区块专门在记录写入或修订档案时的步骤, 那不就可以简化一致性检查的步骤了?也就是说:
(1). 预备:当系统要写入一个档案时,会先在日志记录区块中记录某个档案准备要写入的信息;
(2). 实际写入:开始写入档案的权限不数据;开始更新 metadata 的数据;
(3). 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该档案的记录。
在这样的程序当中,万一数据的记录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就可以知道那个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 这样就可以达到快速修复 filesystem 的能力了!这就是日志式档案最基础的功能.
9. Linux 文件系统的运作:
我们现在知道了目录树与文件系统的关系了,但是我们也知道, 所有的数据都得要加载到内存后 CPU 才能够对该数据进行处理。想一想,如果你常常编辑一个好大的档案, 在编辑的过程中又频繁的要系统来写入到磁盘中,由于 磁盘写入的速度要比内存慢很多, 因此你会常常耗在等待硬盘的写入/读取上。
为了解决这个效率的问题,因此我们的 Linux 使用的方式是透过一个称为异步处理 (asynchronously)的方式。所谓的异步处理是这样的:
当系统加载一个档案到内存后,如果该档案没有被更动过,则在内存区段的档案数据会被设定为干净(clean)的。 但如果内存中的档案数据被更改过了(例如你用 nano 去编辑过这个档案),此时该内存中的数据会被设定为脏的 (Dirty)。此时所有的动作都还在内存中执行,并没有写入到磁盘中! 系统会不定时的将内存中设定为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。 也可以利用 sync指令来手动强迫写入磁盘。
我们知道内存的速度要比硬盘快的多,因此如果能够将常用的档案放置到内存当中,这不就会增加系统性能吗? 没错!是有这样的想法!因此我们 Linux 系统上面文件系统与内存有非常大的关系喔:
系统会将常用的档案数据放置到主存储器的缓冲区,以加速文件系统的读/写;
承上,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能;
你可以手动使用 sync 来强迫内存中设定为 Dirty 的档案回写到磁盘中;
若正常关机时,关机指令会主动呼叫 sync 来将内存的数据回写入磁盘内;
但若不正常关机(如跳电、当机或其他不明原因),由于 数据尚未回写到磁盘内, 因此重新启动后可能会花很多时间在进行磁盘检验,甚至可能寻致文件系统的损毁(非磁盘损毁)。
10. 挂载点的意义 (mount point):
每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。 关于 挂载的一些特性我们在第三章稍微提过, 重点是:挂载点一定是目录,该目录为进入该文件系统的入口。 因此并不是你有任何文件系统都能使用,必项要『挂载』到目录树的某个目录后,才能够使用该文件系统的。
举例来说,如果你是依据鸟哥的方法安装你的 CentOS 5.x 的话, 那么应该会有三个挂载点才是,分别是 /, /boot, /home 三个 (鸟哥的系统上对应的装置文件名为 /dev/hdc2, /dev/hdc1, /dev/hdc3)。
那如果观察这三个目录的 inode 号码时,我们可以发现如下的情况:
看到了吧!由于 filesystem 最顶层的目录之 inode 一般为 2 号,因此可以发现 /, /boot, /home 为三个不同的 filesystem (因为每一行的文件属性并不相同,且三个目录的挂载点也均不相同之故。)
我们在第七章一开始的路径中曾经提到根目录下的 . 与 … 是相同的东西, 因为权限是一模一样嘛!如果使用文件系统的观点来看,同一个 filesystem 的某个 inode 只会对应到一个档案内容而已(因为一个档案占用一个 inode 之故), 因此我们可以透过判断 inode 号码来确认不同文件名是否为相同的档案喔!
所以可以这样看:
上面的信息中由于挂载点均为 / ,因此三个档案 (/, /., /…) 均在同一个 filesystem 内,而这三个档案的 inode 号码均为 2 号,因此这三个档名都指向同一个 inode 号码,当然这三个档案的内容也就完全一模一样了! 也就是说,根目录的上层 (/…) 就是他自己!
11. 其他 Linux 支持的文件系统与 VFS
虽然 Linux 的标准文件系统是 ext2 ,且还有增加了日志功能的 ext3 ,事实上,Linux 还有支持很多文件系统格式的, 尤其是最近这几年推出了好几种速度很快的日志式文件系统,包括 SGI 的 XFS 文件系统, 可以适用更小型档案的 Reiserfs 文件系统,以及 Windows 的 FAT 文件系统等等, 都能够被 Linux 所支持喔!常见的支持文件系统有:
传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;
日志式文件系统: ext3 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS
网络文件系统: NFS / SMBFS
12.文件系统的简单操作
(1):磁盘与目录的容量:
磁盘的整体数据在superblock块中,但是每个各别文件的容量则在inode当中。
df:列出文件系统的整体磁盘使用量
du:评估文件系统的磁盘使用量
13.磁盘的分区、格式化、检验与挂载
1.磁盘分区:fdisk
第九章 :文件与文件系统的压缩与打包
1.常见的压缩文件案扩展名
- .z compress:程序压缩的文件
- .gz gzip:程序压缩的文件
- .bz2 bzip2程序压缩的文件
- .tar tar程序打包的数据,并没有压缩过
- .tar.gz tar程序打包的文件,其中经过gzip的压缩
- .tar.bz2 tar程序打包的文件,其中经过bzip2的压缩
2.压缩命令
1.compress:不常用
(安装命令)
(2)使用方法
2.gzip
3.tar
使用方法:
第十章 :Vim程序编辑器
1.vi进入一般模式
[root@www~]# vi test.txt
- 在一般模式下,只要按下i,o,a等字符就可以进入编辑模式。在编辑模式下你可以看到左下角状态栏会出现-INSERT-的字样。那就是可以输入任意字符的提示。
- 按下【Esc】键回到一般模式
- 在一般模式下输入“:wq”保存后离开vi