Linux 文件系统的运行:
将文件系统与目录树结合的动作我们称为『挂载』。 关于挂载的一些特性我们在第三章稍微提过, 重点是:挂载点一定是目录,该目录为进入该文件系统的入口。
文件系统的简单操作
du
实体链接与符号链接: ln
Hard Link (实体链接, 硬式连结或实际连结)
也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。那么想一想, 有没有可能有多个档名对应到同一个 inode 号码呢?有的!那就是 hard link 的由来。 所以简单的说:hard link 只是在某个目录下新增一笔档名链接到某 inode 号码的关连记录而已。
[root@www ~]# ln /etc/crontab . <==创建实体链接的命令 [root@www ~]# ll -i /etc/crontab /root/crontab 1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab 1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /root/crontab |
你可以发现两个档名都连结到 1912701 这个 inode 号码,所以您瞧瞧,是否文件的权限/属性完全一样呢? 因为这两个『档名』其实是一模一样的『文件』啦!而且你也会发现第二个字段由原本的 1 变成 2 了! 那个字段称为『连结』,这个字段的意义为:『有多少个档名链接到这个 inode 号码』的意思
hard link 是有限制的:
如果我们想要在系统里面新增一颗硬盘时,应该有哪些动作需要做的呢:
不过要进行挂载前,你最好先确定几件事:
那我怎么知道我的 Linux 有没有相关文件系统类型的驱动程序呢?我们 Linux 支持的文件系统之驱动程序都写在如下的目录中:
整个目录树最重要的地方就是根目录了,所以根目录根本就不能够被卸除的!问题是,如果你的挂载参数要改变, 或者是根目录出现『只读』状态时,如何重新挂载呢?最可能的处理方式就是重新启动 (reboot)! 不过你也可以这样做:
范例六:将 / 重新挂载,并加入参数为 rw 与 auto [root@www ~]# mount -o remount,rw,auto / |
重点是那个『 -o remount,xx 』的选项与参数!请注意,要重新挂载 (remount) 时, 这是个非常重要的机制!尤其是当你进入单人维护模式时,你的根目录常会被系统挂载为只读,这个时候这个命令就太重要了!
另外,我们也可以利用 mount 来将某个目录挂载到另外一个目录去喔!这并不是挂载文件系统,而是额外挂载某个目录的方法! 虽然底下的方法也可以使用 symbolic link 来连结,不过在某些不支持符号链接的程序运行中,还是得要透过这样的方法才行。
范例七:将 /home 这个目录暂时挂载到 /mnt/home 底下: [root@www ~]# mkdir /mnt/home [root@www ~]# mount --bind /home /mnt/home [root@www ~]# ls -lid /home/ /mnt/home 2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home/ 2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /mnt/home [root@www ~]# mount -l /home on /mnt/home type none (rw,bind) |
看起来,其实两者连结到同一个 inode 嘛! ^_^ 没错啦!透过这个 mount --bind 的功能, 您可以将某个目录挂载到其他目录去喔!而并不是整块 filesystem 的啦!所以从此进入 /mnt/home 就是进入 /home 的意思喔!
[root@www ~]# umount [-fn] 装置文件名或挂载点 选项与参数: -f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下; -n :不升级 /etc/mtab 情况下卸除。 |
就是直接将已挂载的文件系统给他卸除即是!卸除之后,可以使用 df 或 mount -l 看看是否还存在目录树中? 卸除的方式,可以下达装置文件名或挂载点,均可接受啦
除了磁盘的装置文件名之外,其实我们可以使用文件系统的标头(label)名称来挂载喔! 举例来说,我们刚刚卸除的 /dev/hdc6 标头名称是『vbird_logical』,你也可以使用 dumpe2fs 这个命令来查询一下啦!然后就这样做即可:
范例九:找出 /dev/hdc6 的 label name,并用 label 挂载到 /mnt/hdc6 [root@www ~]#dumpe2fs -h /dev/ hdc6 Filesystem volume name: vbird_logical .....底下省略..... # 找到啦!标头名称为 vbird_logical 啰! [root@www ~]# mount -L "vbird_logical" /mnt/hdc6 |
这种挂载的方法有一个很大的好处:『系统不必知道该文件系统所在的接口与磁盘文件名!』 更详细的说明我们会在下
磁盘参数修订
mknod
e2label
我们在 mkfs 命令介绍时有谈到配置文件系统标头 (Label) 的方法。 那如果格式化完毕后想要修改标头呢?就用这个 e2label 来修改了。那什么是 Label 呢? 我们拿你曾用过的 Windows 系统来说明。当你打开『文件总管』时,C/D等槽不是都会有个名称吗? 那就是 label (如果没有配置名称,就会显示『本机磁盘驱动器』的字样)
这个东西除了有趣且可以让你知道磁盘的内容是啥玩意儿之外,也会被使用到一些配置文件案当中! 举例来说,刚刚我们聊到的磁盘的挂载时,不就有用到 Label name 来进行挂载吗? 目前 CentOS 的配置文件,也就是那个 /etc/fstab 文件的配置都默认使用 Label name 呢! 那这样做有什么好处与缺点呢?
鸟哥一直是个比较『硬派』作风,所以我还是比较喜欢直接利用磁盘文件名来挂载啦! 不过,如果没有特殊需求的话,那么利用 Label 来挂载也成! 但是你就不可以随意修改 Label 的名称了!
tune2fs
hdparm
配置启动挂载:
启动挂载 /etc/fstab 及 /etc/mtab
刚刚上面说了许多,那么可不可以在启动的时候就将我要的文件系统都挂好呢?这样我就不需要每次进入 Linux 系统都还要在挂载一次呀!当然可以啰!那就直接到 /etc/fstab 里面去修修就行啰!不过,在开始说明前,这里要先跟大家说一说系统挂载的一些限制:
特殊装置 loop 挂载 (映象档不刻录就挂载使用)
想一想,既然能够挂载 DVD 的映象档,那么我能不能制作出一个大文件,然后将这个文件格式化后挂载呢? 好问题!这是个有趣的动作!而且还能够帮助我们解决很多系统的分割不良的情况呢!举例来说,如果当初在分割时, 你只有分割出一个根目录,假设你已经没有多余的容量可以进行额外的分割的!偏偏根目录的容量还很大! 此时你就能够制作出一个大文件,然后将这个文件挂载!如此一来感觉上你就多了一个分割槽啰! 用途非常的广泛啦!
底下我们在 /home 下创建一个 512MB 左右的大文件,然后将这个大文件格式化并且实际挂载来玩一玩! 这样你会比较清楚鸟哥在讲啥!
[root@www ~]# dd if=/dev/zero of=/home/loopdev bs=1M count=512 512+0 records in <==读入 512 笔数据 512+0 records out <==输出 512 笔数据536870912 bytes (537 MB) copied, 12.3484 seconds, 43.5 MB/s # 这个命令的简单意义如下: # if 是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的装置! # of 是 output file ,将一堆零写入到后面接的文件中。 # bs 是每个 block 大小,就像文件系统那样的 block 意义; # count 则是总共几个 bs 的意思。 [root@www ~]# ll -h /home/loopdev-rw-r--r-- 1 root root 512M Oct 28 02:29 /home/loopdev |
[root@www ~]# mkfs -t ext3 /home/loopdev mke2fs 1.39 (29-May-2006) /home/loopdev is not a block special device. Proceed anyway? (y,n) y<==由于不是正常的装置,所以这里会提示你! Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 131072 inodes, 524288 blocks 26214 blocks (5.00%) reserved for the super user .....以下省略..... |
[root@www ~]# mount -o loop /home/loopdev /media/cdrom/ [root@www ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on /home/loopdev 507748 18768 462766 4% /media/cdrom |
透过这个简单的方法,感觉上你就可以在原本的分割槽在不更动原有的环境下制作出你想要的分割槽就是了! 这东西很好用的!尤其是想要玩 Linux 上面的『虚拟机』的话, 也就是以一部 Linux 主机再切割成为数个独立的主机系统时,类似 VMware 这类的软件, 在 Linux 上使用 xen 这个软件,他就可以配合这种 loop device 的文件类型来进行根目录的挂载, 真的非常有用的喔! ^_^
使用实体分割槽建置swap
创建 swap 分割槽的方式也是非常的简单的!透过底下几个步骤就搞定啰:
过, swap 在被创建时,是有限制的喔!
们在前面的 block 介绍中谈到了一个 block 只能放置一个文件, 因此太多小文件将会浪费非常多的磁盘容量。但你有没有注意到,整个文件系统中包括 superblock, inode table 与其他中介数据等其实都会浪费磁盘容量喔!所以当我们在 /dev/hdc6 创建起 ext3 文件系统时, 一挂载就立刻有很多容量被用掉了!
另外,不知道你有没有发现到,当你使用 ls -l 去查询某个目录下的数据时,第一行都会出现一个『total』的字样! 那是啥东西?其实那就是该目录下的所有数据所耗用的实际 block 数量 * block 大小的值。 我们可以透过 ll -s 来观察看看上述的意义:
面的特殊字体部分,那就是每个文件所使用掉 block 的容量!举例来说,那个 crontab 虽然仅有 255bytes , 不过他却占用了两个 block (每个 block 为 4K),将所有的 block 加总就得到 104Kbytes 那个数值了。 如果计算每个文件实际容量的加总结果,其实只有 56.5K 而已~所以啰,这样就耗费掉好多容量了!面是最简单的 parted 命令功能简介,你可以使用『 man parted 』,或者是『 parted /dev/hdc help mkpart 』去查询更详细的数据。比较有趣的地方在于分割表的输出。我们将上述的分割表示意拆成六部分来说明:
接下来我们尝试来创建一个全新的分割槽吧!因为我们仅剩下逻辑分割槽可用,所以等一下底下我们选择的会是 logical 的分割类型喔!
Linux上常见的压缩命令就是 gzip 与 bzip2 ,至於 compress 已经退流行了。 gzip 是由 GNU 计画所开发出来的压缩命令,该命令已经取代了 compress 。 后来 GNU 又开发出 bzip2 这个压缩比更好的压缩命令!不过,这些命令通常仅能针对一个文件来压缩与解压缩,如此一来, 每次压缩与解压缩都要一大堆文件,岂不烦人?此时,那个所谓的『打包软件, tar』就显的很重要啦!
这个 tar 可以将很多文件『打包』成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是『打包』而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能,后来,GNU 计画中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能!
gzip, zcat
gzip 可以说是应用度最广的压缩命令了!目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件。 至於 gzip 所创建的压缩档为 *.gz 的档名喔!
[root@www tmp]# zcat man.config.gz
# 由於 man.config 这个原本的文件是是文字档,因此我们可以尝试使用 zcat 去读取!
# 此时萤幕上会显示 man.config.gz 解压缩之后的文件内容!
要察看档名非常的简单!可以这样做:
[root@www ~]# tar -jtv -f /root/etc.tar.bz2 . ...前面省略.... -rw-r--r-- root/root 1016 2008-05-25 14:06:20 etc/dbus-1/session.conf -rw-r--r-- root/root 153 2007-01-07 19:20:54 etc/esd.conf -rw-r--r-- root/root 255 2007-01-06 21:13:33 etc/crontab |
[root@www ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \ > --exclude=/root/system.tar.bz2 /etc /root
|
另外值得一提的是,tar 打包出来的文件有没有进行压缩所得到文件称呼不同喔! 如果仅是打包而已,就是『 tar -cv -f file.tar 』而已,这个文件我们称呼为 tarfile 。 如果还有进行压缩的支持,例如『 tar -jcv -f file.tar.bz2 』时,我们就称呼为 tarball (tar 球?)!
特殊应用:利用管线命令与数据流
完整备份工具:dump
其实 dump 的功能颇强,他除了可以备份整个文件系统之外,还可以制定等级喔!什么意思啊! 假设你的 /home 是独立的一个文件系统,那你第一次进行过 dump 后,再进行第二次 dump 时, 你可以指定不同的备份等级,假如指定等级为 1 时,此时新备份的数据只会记录与第一次备份所有差异的文件而已。 看不懂吗?没关系!我们用一张简图来说明。
备份档就是在急用时可以回复系统的重要数据,所以有备份当然就得要学学如何复原了! dump 的复原使用的是 restore 这个命令!这个命令的选项也非常的多~您可以自行 man restore 瞧瞧! 鸟哥在这里仅作个简单的介绍罗!
光盘写入工具
那么文字模式的烧录行为要怎么处理呢?通常的作法是这样的:
其实 mkisofs 有非常多好用的选项可以选择,不过如果我们只是想要制作数据光盘时,上述的选项也就够用了。 光盘的格式一般称为 iso9660 ,这种格式一般仅支持旧版的 DOS 档名,亦即档名只能以 8.3 (档名8个字节,扩展名3个字节) 的方式存在。如果加上 -r 的选项之后,那么文件资讯能够被记录的比较完整,可包括UID/GID与权限等等! 所以,记得加这个 -r 的选项
cdrecord:光盘烧录工具
由於 CD/DVD 都是使用 cdrecord 这个命令,因此不论是 CD 还是 DVD 片,下达命令的方法都差不多!不过, DVD 的写入需要额外的 driveropts=burnfree 或 -dao 等选项的辅助才行。 另外,CD 片有 CD-R(一次写入) 与 CD-RW(重复写入),至於 DVD 则主要有两种格式,分别是 DVD-R 及 DVD+R 两种格式。 如果是可重复读写的则为: DVD-RW, DVD+RW 。除了 DVD+RW 的抹除方法可能不太一样之外,其他写入的方式则是一样的。
其他常见的压缩与备份工具
dd