磁盘与文件系统管理这部分内容太多,看了两遍,东西是弄明白了,但东西太多写的时候无从下手,网上查了半天也找不到好的文章参考,看到的还是鸟哥的东西,为了和前面后面文章衔接,所以只能copy这篇文章了,特此申明本文不是本人所写而是鸟哥的,本人只是重新排版 我们在前面的档案权限介绍的章节当中,提到很多的权限与属性的观念,那么接下来要了解的是, 这些属性是记录在硬盘的那个地方?这里就要特别了解到 Linux 文件系统( filesystem )是如何记录档案, 与档案是如何被读取的啰!而要了解整个文件系统的观念,就不能不知道硬盘的组成组件! 所以,在这个章节当中,我们由最基础的硬盘组成组件介绍起,并介绍 inode 与链接文件等基本知识, 以及如何利用开机即可挂载的方式来使我们的各个 partition 可以在开机时就已经进行好挂载的动作喔!
一、文件系统1、 在告知系统我的 partition 所在的起始与结束磁柱之后,再来则是需要将 partition 格式化为『我的操作系统认识的文件系统( Filesystem )』啰!因为每个操作系统认识的 filesystem 并不相同!例如 Windows 操作系统在默认状态下就无法认识 Linux 的文件系统 ( 这里指 Linux 的标准文件系统 ext2 )。所以当然要针对我们的操作系统来格式化 partition 啰! 2、我们可以说,每一个 partition 就是一个 Filesystem ,那么一个 partition 是否可以具有两个 Filesystem 呢?!理论上应该是不行的!因为每个文件系统都有其独特的支持方式,例如 Linux 的 ext3 就无法被 Windows 系统所读取!而你将一个 partition 格式化的时候,总不能格式化为 ext3 也同时格式化为 fat32 吧?!那是不可能的啊! 3、不论是哪一种 filesystem ,数据总是需要储存的吧!既然硬盘是用来储存数据的,想当然,数据就必须写入硬盘啦!刚刚我们提到硬盘的最小储存单位是 sector(扇区) ,不过数据所储存的最小单位并不是 sector 喔,因为用 sector 来储存太没有效率了。怎么说呢?因为一个 sector 只有 512 Bytes ,而磁头是一个一个 sector 的读取,也就是说,如果我的档案有 10 MBytes ,那么为了读这个档案, 我的磁头必须要进行读取 (I/O) 20480 次! 4、为了克服这个效率上的困扰,所以就有逻辑区块( Block )的产生了! 逻辑区块是在 partition 进行 filesystem 的格式化时, 所指定的『最小储存单位』,这个最小储存单位当然是架构在 sector 的大小上面( 因为 sector 为硬盘的最小物理储存单位啊! ),所以啦, Block 的大小为 sector 的 2 的次方倍数。此时,磁头一次可以读取一个 block ,如果假设我们在格式化的时候,指定 Block 为 4 KBytes ( 亦即由连续的八个 sector 所构成一个 block ),那么同样一个 10 MBytes 的档案, 磁头要读取的次数则大幅降为 2560 次,这个时候可就大大的增加档案的读取效能啦! 5、 不过,Block 单位的规划并不是越大越好喔!怎么说呢?因为一个 Block 最多仅能容纳一个档案 (这里指 Linux 的 ext2 文件系统)!这有什么问题呢?举例来说好了,假如您的 Block 规划为 4 KBytes ,而您有一个档案大小为 0.1 KBytes ,这个小档案将占用掉一个 Block 的空间,也就是说,该 Block 虽然可以容纳 4 Kbytes 的容量,然而由于档案只占用了 0.1 Kbytes ,所以,实际上剩下的 3.9 KBytes 是不能再被使用了,所以,在考虑 Block 的规划时,需要同时考虑到: 因此,在规划您的磁盘时,需要留意到您主机的用途来进行规划较佳!例如 BBS 主机由于文章较短, 也就是说档案较小,那么 Block 小一点的好;而如果您的主机主要用在储存大容量的档案, 那么考虑到效能,当然 Block 理论上,规划的大一点会比较妥当啦!
6、Superblock:如同前面说的,当我们在进行磁盘分区( partition )时,每个磁盘分区槽( partition )就是一个文件系统( filesystem ), 而每个文件系统开始的位置的那个 block 就称为 superblock ,superblock 的作用是储存像是文件系统的大小、空的和填满的区块,以及他各自的总数和其他诸如此类的信息等等, 这也就是说,当您要使用这一个磁盘分区槽( 或者说是文件系统 )来进行数据存取的时候,第一个要经过的就是 superblock 这个区块了,所以啰, superblock 坏了,您的这个磁盘槽大概也就回天乏术了!
二、Linux 的 EXT2 文件系统( inode )1、看完了上面的说明,您应该对于硬盘有一定程度的认识了!好了,那么接下来就是要谈一谈 Linux 的文件系统( Filesystem )啰!我们这里以 Linux 最标准的 ext2 这个文件系统来作为说明。在 Linux 系统当中,每个档案不止有档案的内容数据,还包括档案的种种属性,例如:所属群组、 所属使用者、能否执行、档案建立时间、档案特殊属性等等。由于 Linux 操作系统是一个多人多任务的环境,为了要保护每个用户所拥有数据的隐密性, 所以具有多样化的文件属性是在所难免的!在标准的 ext2 文件系统当中,我们将每个档案的内容分为两个部分来储存,一个是档案的属性,另一个则是档案的内容。 2、 为了应付这两个不同的咚咚,所以 ext2 规划出 inode 与 Block 来分别储存档案的属性( 放在 inode 当中 )与档案的内容( 放置在 Block area 当中 )。当我们要将一个 partition 格式化( format )为 ext2 时,就必须要指定 inode 与 Block 的大小才行,也就是说,当 分割槽 被格式化为 ext2 的文件系统时,他一定会有 inode table 与 block area 这两个区域。 3、Block 已经在前面说过了,他是数据储存的最小单位。那么 inode 是什么?简单的说, Block 是记录『档案内容数据』的区域,至于 inode 则是记录『该档案的相关属性,以及档案内容放置在哪一个 Block 之内』的信息。 简单的说, inode 除了记录档案的属性外,同时还必须要具有指向( pointer )的功能,亦即指向档案内容放置的区块之中,好让操作系统可以正确的去取得档案的内容啊! 底下几个是 inode 记录的信息(当然不止这些):
4、inode的数量不大小也是在格式化时就已经固定了,除此之外 inode 还有些什么特性?
一般的一个inode中有 12个直接记录block 一个间接,一个双间接,一个三间接记录区,inode的图形结构:
5、在前面linux档案管理当中提到过利用 ls 查询档案所记载的时间,就是 atime / ctime / mtime 三种时间。这三种时间的意义我们已经在前一章的touch指令介绍时提过,这三种时间就是记录在 inode 里面的啦~ 如果回到前一章,您会发现,我们可以利用ls的相关功能来查询到时间喔!而默认的显示时间是 mtime 。
6、[root@linux ~]# ls -la --time=atime PATH 那个 PATH 是您所想要查询的档案或目录名称。利用上面的 ls 相关参数,就可以取得您想要知道的档案相关的三种时间啰~ 至于一个 inode 的大小为 128 bytes 这么大 (可以使用底下要介绍的dumpe2fs 来查阅 inode 的大小喔!) !好了,那么我的 Linux 系统到底是如何读取一个档案的内容呢?底下我们分别针对目录与档案来说明: 7、要注意的是, inode 本身并不纪录文件名,而是记录档案的相关属性,至于文件名则是记录在目录所属的 block 区域! 那么档案与目录的关系又是如何呢?就如同上面的目录提到的,档案的相关链接会记录在目录的 block 数据区域, 所以当我们要读取一个档案的内容时,我们的 Linux 会先由根目录 / 取得该档案的上层目录所在 inode , 再由该目录所记录的档案关连性 (在该目录所属的 block 区域) 取得该档案的 inode , 最后在经由 inode 内提供的 block 指向,而取得最终的档案内容。我们以 /etc/crontab 这个档案的读取为例, 他的内容资料是这样取得的:
图三、读取 /etc/crontab 的简易流程示意。 8、一块 partition 在 ext2 底下会被格式化为 inode table 与 block area 两个区域, 所以在图三里面,我们将 partition 以长条的方式来示意,会比较容易理解的啦!而读取 /etc/crontab 的流程为: (1)、操作系统根据根目录( / )的相关资料可取得 /etc 这个目录所在的 inode ,并前往读取 /etc 这个目录的所有相关属性; (2)、根据 /etc 的 inode 的资料,可以取得 /etc 这个目录底下所有档案的关连数据是放置在哪一个 Block 当中,并前往该 block 读取档案的关连性内容 (3)、由上个步骤的 Block 当中,可以知道 crontab 这个档案的 inode 所在地,并前往该 inode ; (4)、由上个步骤的 inode 当中,可以取得 crontab 这个档案的所有属性,并且可前往由 inode 所指向的 Block 区域,顺利的取得 crontab 的档案内容。 9、整个读取的流程大致上就是这样,如果您想要实作一下以了解整个流程的话,可以这样试做看看:
(1)、 察看一下根目录所记载的所有档案关连性数据
(2)、察看一下 /etc/ 内的档案关连性的数据 10、所以您知道,目录的最大功能就是在提供档案的关连性,在关连性里面, 当然最主要的就是『档名与 inode 的对应数据』啰!另外,关于 EXT2 文件系统,这里有几点小事情要提醒一下: 11、简单的归纳一下, ext2 有几个特色: 12、另外,关于 partition 的使用效率上,当您的一个 partition 规划的很大时,例如 100GB 这么大, 由于硬盘上面的数据总是来来去去的,所以,整个 partition 上面的档案通常无法连续写在一起, 而是填入式的将数据填入没有被使用的 block 当中。如果档案写入的 block 真的分的很散, 此时就会有所谓的档案离散的问题发生了。虽然我们的 ext2 在 inode 处已经将该档案所记录的 block number 都记上了,所以资料可以一次性读取,但是如果档案真的太过离散,确实还是会发生读取效率低落的问题。 果真如此,那么可以将整个 partition 内的数据全部复制出来,将该 partition 重新格式化, 再将数据给他复制回去即可解决。
13、此外,如果 partition 真的太大了,那么当一个档案分别记录在这个 partition 的最前面与最后面的 block, 此时会造成硬盘的机械手臂移动幅度过大,也会造成数据读取效能的低落。因此, partition 的规划并不是越大越好, 而是真的要针对您的主机用途来进行规划才行!^_^
三、EXT2/EXT3 档案的存取与日志式文件系统的功能1、综合上面谈的种种,我们可以知道,当一个 ext2 的 filesystem 被建立时, 他拥有 superblock / group description / block bitmap / inode bitmap / inode table / data blocks 等等区域。要注意的是,每个 ext2 filesystem 在被建立的时候,会依据 partition 的大小, 给予数个 block group ,而每个 block group 就有上述的这些部分。整个 filesystem 的架构可以下图展现:
图四、整个 filesystem 的展现示意图 2、我们将整个 filesystem 简单化, 假设仅有一个 block group ,那么上面的各个部分分别代表什么呢? 3、如果想要知道某个 ext2/ext3 的文件系统内,关于上述提到的相关信息时,可以使用 dumpe2fs 这个指令来读取,举例来说,鸟哥将我自己的主机 /dev/hda1 读出 ext3 的讯息:
[root@linux ~]# dumpe2fs /dev/hda1
Group 0: (Blocks 0-32767) 4、透过这些记录,我们可以很轻易的就知道哪些 inode 没有被使用,哪些 block 还可以记录, 如此一来,在新增、建立档案与目录时,系统就会根据这些记录来将数据分别写入尚未被使用的 inode 与 block area 了! 不过,要注意的是,当我们新增一个档案(目录)时: (1)、根据 inode bitmap / block bitmap 的信息,找到尚未被使用的 inode 与 block , 进而将档案的属性与数据分别记载进 inode 与 block ; (2)、将刚刚被利用的 inode 与 block 的号码 (number) 告知 superblock、inode bitmap、block bitmap 等,让这些 metadata 更新信息。 一般来说,我们将 inode table 与 block area 称为数据存放区域,至于其他的例如 superblock、 block bitmap 与 inode bitmap 等记录就被称为 metadata 啰。经由上面两个动作,我们知道一笔数据写入硬盘时, 会有这两个动作。 5、数据的不一致 (Inconsistent) 状态 那么万一您的档案在写入硬盘时,因为不知名原因导致系统中断(例如突然的停电啊、 系统核心发生错误啊~等等的怪事发生时),所以数据就只有纪录到动作一,而动作二尚未进行~ 这就会产生 metadata 与数据存放区产生不一致 (Inconsistent) 的情况发生了。
6、在早期的 EXT2 文件系统中,如果发生这个问题,那么系统在重新启动的时候, 就会藉由 Superblock 当中记录的 valid bit 与 filesystem state 等状态来判断是否强制进行数据一致性的检查!检查则以e2fsck 这支程序来进行的。 不过,这样的检查真的是很费时~因为要针对 metadata 区域与实际数据存放区来进行比对, 呵呵~得要搜寻整个 partition 呢~哇!系统真忙碌~而且在对 Internet 提供服务的服务器主机上面, 这样的检查真的会造成主机复原时间的拉长~真是麻烦~这也就造成后来所谓日志式文件系统的兴起了。
7、稍微了解了所谓数据不一致的状态后,再来要了解的,就是,那么为何要有日志式文件系统的产生呢? 我们已经在linux文件系统中 当中提到过一些文件系统的注意事项, 也提过日志式 (Journal) 文件系统的相关功能,这里我们再稍微深入的讨论一下。
8、刚刚提到了,在 EXT2 文件系统当中,要进行档案的写入时,会将数据分别在数据存放区与 metadata 区记录下来, 若当这两个动作无法一次完成时,就会造成所谓的不一致现象。若发生不一致现象, 因为系统不知道是那个档案发生不一致现象,所以就会将整个 filesystem 做一致性的检查,如此一来,很费时啊! 想一想,如果在我们的 filesystem 当中,要是能够规划出一个区块,专门来记录写入或修订档案时的步骤, 那不就可以简化一致性检查的步骤了?也就是说: (1)、当系统要写入一个档案的时候,会先在日志记录区块中纪录:某个档案准备要写入磁盘了; (2)、开始写入档案的权限与数据; (3)、开始更新 metadata 的数据; (4)、完成数据与 metadata 的更新后,在日志记录区块当中完成该档案的纪录。 9、在这样的程序当中,万一数据的纪录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就可以知道那个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 真的就可以达到快速修复 filesystem 的能力了!这就是日志式档案最基础的功能啰~ 那么我们的 ext2 可达到这样的功能吗?当然可以啊! 就透过 ext3 即可! ext3 是 ext2 的升级版本,并且可向下兼容 ext2 版本呢! 所以啰,目前我们才建议大家,可以直接使用 ext3 这个 filesystem 啊! ^_^
四、Linux 文件系统的运作1、我们知道整个 ext2/ext3 的数据存取是透过 journal 与 metadata 还有数据存放区在纪录的。 不过,实际上, Linux 文件系统在运作的时候,真的要将数据直接存放到硬盘上面吗?! 有没有更有效率的作法?
2、我们来看看整部计算机的运作当中,那个数据的访问速度最慢呢?数据处理最快速的地方应该是 CPU 了, 接下来则是主存储器 (RAM) ,至于硬盘,哈哈!没错,速度可是比 CPU 还有 RAM 要慢的很多很多。 为了让 Linux 加快整个系统的存取效率,因此在 Linux 上面通常采取异步处理( asynchronously )的方式。
3、 什么是异步呢?举例来说:『当系统读取了某一个档案, 则该档案所在的区块数据会被加载到内存当中,所以该磁盘区块就会被放置在主存储器的缓冲快取区中, 若这些区块的数据被改变时,刚开始数据仅有主存储器的区块数据会被改变, 而且在缓冲区当中的区块数据会被标记为『 Dirty 』,这个时候磁盘实体区块尚未被修正! 所以亦即表示,这些『 Dirty 』区块的数据必需回写到磁盘当中, 以维持磁盘实体区块上的数据与主存储器中的区块数据的一致性。』
4、 为什么要这么做呢?这是因为主存储器的运作速度比起硬盘来实在是快太多了, 万一系统当中有一个档案相当的大,而又持续性的存取,那么由于较慢的硬盘访问速度,将使得整个 Linux 速度被拖垮,所以才会使用异步方式的数据处理啊!不过, 也由于硬盘与主存储器的数据可能没有同步化,因此,如果 Linux 不正常关机( 例如跳电或者是当机 )时,则由于数据尚未回写入磁盘当中,会导致系统在再次开机时,会花相当多的时间进行磁盘检验, 同时也有可能造成磁盘的损毁啊!
五、挂载点的意义 (mount point)1、我们上面提到的都是关于文件系统 (filesystem),但是要能够让我们的 Linux 使用的话, 非得挂载 (mount)上我们的 Linux 系统才行啊! 刚刚我们上面提到了目录可以记录文件名与 inode 的相关信息,此外, 目录也是让我们得以跟 filesystem 产生对应的入口点。因此,我们称那个入口点目录为『挂载点 (mount point) !
2、 举例来说,在鸟哥的 安装 FC4 范例当中,我们将硬盘分割为几大部分, 同时主要将 / 与 /home 设定为两个 partition 的挂载点。假设 / 是接在 /dev/hda1 , 而 /home 是接在 /dev/hda2 上面,那么,也就是说,在 /home 底下的所有次目录,使用的都是 /dev/hda2 那个分割槽的资料呢!而非 /home 的则都是使用 /dev/hda1 的数据!
3、那么来看看系统中如果主要分为 / 与 /home 时,他们对应的 inode 会有什么现象呢?
[root@linux ~]# ls -lid / /home 看到了吧?咦!怎么 / 与 /home 的 inode number 都是 2 啊??这太不合理了~ 原因很简单啊!因为 / 是 /dev/hda1 而 /home 是 /dev/hda2 ,这两个 partition 都有 inode number 为 2 的号码啊!所以啊,请注意, 挂载点一定是『目录』而不是档案喔! 也就是说,这个挂载点就是进入该 filesystem 的入口啦!
六、其他 Linux 支持的文件系统1、 虽然 Linux 的标准文件系统是 ext2 ,且还有增加了日志功能的 ext3 之外,事实上,Linux 还有支持很多文件格式的, 尤其是最近这几年推出了好几种速度很快的日志式文件系统,包括 SGI 的 XFS 文件系统, 可以适用更小型档案的 Reiserfs 文件系统,以及 Windows 的 FAT 文件系统等等, 都能够被 Linux 所支持喔!常见的支持文件系统有: 2、想要知道您的 Linux 支持的文件系统有哪些,可以察看底下这个目录:
[root@linux ~]# ls -l /lib/modules/`uname -r`/kernel/fs 系统目前已启用的文件系统则有:
[root@linux ~]# cat /proc/filesystems 假设您的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用 /dev/hda2 ,用 reiserfs , 那么您取用 /home/dmtsai/.bashrc 时,有特别指定要用的什么文件系统的模块来读取吗?! 应该是没有吧!嘿嘿!这个就是我们 Linux kernel 的 Virtual Filesystem Switch (VFS) 的功能啦!透过这个 VFS 的功能来管理所有的 filesystem, 省去我们需要自行设定读取文件系统的定义啊~方便很多!
七、文件系统的简单操作1、在了解了一些简单的硬盘与文件系统的概念之后,并且知道如何以 ls 查询文件系统相关的信息后, 接下来就是得要了解如何知道整个磁盘的剩余容量与总容量啰~此外,也得要知道一下,前一章还没有介绍到的连结档 (link file) 啰~
2、磁盘与目录的容量: 在文字接口底下有什么方法可以查看目前的磁盘最大容许容量、已经使用掉的容量、 目前所在目录的已使用容量?还有还有,怎么知道目前目录底下使用掉的硬盘容量呢? 以及如何查询目前的 inodes 数目?呵呵!底下我们就来谈一谈主要的两个指令:
[root@linux ~]# df [-ahikHTm] [目录或文件名]
范例二:将容量结果以易读的容量格式显示出来
范例三:将系统内的所有特殊文件格式及名称都列出来
范例四:将 /etc 底下的可用的磁盘容量以易读的容量格式显示
范例五:将目前各个 partition 当中可用的 inode 数量列出 3、这是用来显示目前磁盘的总容量与剩余可用容量的指令!需要注意的是, 由于我们的档案或者是外挂的磁盘都是加在『 / 』底下,所以当根目录没有空间的时候, 嘿嘿!你的 Linux 系统可能大概就要挂了吧~当然啰!你可以将你的数据放置在加挂的硬盘中, 那么如何知道目前哪一个磁盘还有多少空间呢?! 4、这里要请大家再复习一下,我们的硬盘扇区规划中, primary 扇区每一颗硬盘最多只允许 4 个,其他的就放置在 Extended 扇区中了!而,硬盘的代号与 IDE 的插槽是有关系的! 如果忘记了,那就回去复习一下吧!好了!假设我只有一棵硬盘,且放在 IDE 的 master ,那么我的硬盘就是 /dev/hda 啰!而在这颗硬盘中的分割扇区就可以由 /dev/hda1 开始向上加!
5、OK,那么使用 df -k 之后,假设我的硬盘分为 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5 与 /dev/hda6 ,咦! /dev/hda4 跑去哪里了!呵呵!其实 /dev/hda4 通常就是 Extended 扇区啦!而后面的 /dev/hda5, /dev/hda6 等扇区就是由 /dev/hda4 所切出来的!所以 /dev/hda5 + /dev/hda6 = /dev/hda4 !当然,如果还有没有显示出来的,例如 Swap ,则 /dev/hda4 还有可能更大呦!
那么来解释一下上面的数据吧! 另外,需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个扇区,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是 Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』的, 所以当然没有占任何的硬盘空间啰!
[root@linux ~]# du [-ahskm] 档案或目录名称
范例二:同范例一,但是将档案的容量也列出来
范例三:检查根目录底下每个目录所占用的容量 在 Windows 底下可以使用档案总管来管理你的磁盘,在 Linux 底下也可以轻易的以 du 来知道目前磁盘的档案容量耶!在默认的情况下,容量的输出是以 KB 来设计的, 如果你想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可啰!而, 如果你只想要知道该目录占了多少容量的话,呵呵,使用 -s 就可以啦!另外, 如同上面的范例三,可以利用通配符 * 来加快你的搜寻喔!
八、连结档的介绍: ln1、什么是连结档呢?其实连结档有点类似 Windows 底下的『快捷方式』!也就是很多的连结档案( link file )其实都指向同一个来源档案( source file )!不过,在所有的文件类型当中, 连结档算是比较难理解的一部份了!因为连结档还分成 Hard link 与 symbolic link 两种,这两种连结档在架构上是完全不一样的咚咚,底下就来好好的谈一谈先!
在前一节当中,我们提到档案的读取方式为: (1)、先由一层一层的目录取得档案相关的关连数据, (2)、再到对应的 inode 取得档案的属性,以及档案内容数据所在的 Block , (3)、最后到 Block area 取得档案的数据。 那么 hard link 怎么制作档案的连结呢?!很简单, Hard Link 只是在某个目录下新增一个该档案的关连数据而已!
2、举个例子来说,假设我的 /root/crontab 为一个 hard link 的档案,他连结到 /etc/crontab 这个档案,也就是说,其实 /root/crontab 与 /etc/crontab 是同一个档案,只是有两个目录( /etc 与 /root )记录了 crontab 这个档案的关连数据罢了!也就是说,我由 /etc 这个目录所记录的关连数据可知道 crontab 的 inode 放置在 A 处,而由 /root 这个目录下的关连数据, crontab 同样也指到 A 处的 inode !所以啰, crontab 这个档案的 inode 与 block 都没有改变, 有的只是有两个目录记录了关连数据。
3、那这样有什么好处呢?最大的好处就是『安全!』如同上面提到的 /root/crontab 与 /etc/crontab 中, 不管哪一个档案被删除了,其实仅是移除一笔目录底下的档案关连性数据,并没有更动到原本档案的 inode 与 block 资料呢!而且,不论由那个目录链接到正确的 crontab 的 inode 与 block , 都可以正确无误的进行数据的修改喔! ^_^
4、一般来说,使用 hard link 设定链接文件时,磁盘的空间与 inode 的数目都不会改变! 由上面的说明来看,我们可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据,所以当然不会用掉 inode 与磁盘空间啰!
5、由于 hard link 是在同一个 partition 上面进行数据关连的建立,所以 hard link 是有限制的: 不能跨 Filesystem 还好理解,因为 hard link 本来就是在一个 partition 内建立关连性的, 那不能 hard link 到目录又是怎么回事呢?这是因为如果使用 hard link 链接到目录时, 链接的数据被需要连同被链接目录底下的所有数据都建立链接,举例来说,如果你要将 /etc 使用硬式链接建立一个 /etc_hd 的目录时,那么在 /etc_hd 底下的所有数据同时都与 /etc 底下的数据要建立 hard link 的,而不能仅是连结到 /etc_hd 与 /etc 而已。 并且,未来如果需要在 /etc_hd 底下建立新档案时,连带的, /etc 底下的数据又得要建立一次 hard link ,因此造成环境相当大的复杂度。 所以啰,目前 hard link 对于目录暂时还是不支持的啊!
相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一个独立的档案, 而这个档案会让数据的读取指向他 link 的那个档案内容!由于只是利用档案来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的档案会『开不了』, 会一直说『无法开启某档案!』。这里还是得特别留意,这个 Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所建立的档案为一个独立的新的档案,所以会占用掉 inode 与 block 喔!
6、由上面的说明来看,似乎 hard link 比较安全,因为即使某一个目录下的关连数据被杀掉了, 也没有关系,只要有任何一个目录下存在着关连数据,那么该档案就不会不见!举上面的例子来说,我的 /etc/crontab 与 /root/crontab 指向同一个档案,如果我删除了 /etc/crontab 这个档案,该删除的动作其实只是将 /etc 目录下关于 crontab 的关连数据拿掉而已, crontab 所在的 inode 与 block 其实都没有被变动喔!
7、不过,不幸的是,由于 Hard Link 的限制太多了,包括无法做『目录』的 link , 所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方面较广喔!好了, 说的天花乱坠,看您也差不多快要昏倒了!没关系,实作一下就知道怎么回事了!要制作连结档就必须要使用 ln 这个指令呢!
[root@linux ~]# ln [-sf] 来源文件 目标文件
范例二:将 /tmp/passwd 制作 hard link 成为 passwd-hd 档案
范例三:将 /tmp/passwd 建立一个符号链接
范例四:删除源文件 passwd ,其他两个档案是否能够开启? 8、要注意啰!使用 ln 如果不加任何参数的话,那么就是 Hard Link 啰!如同上面的情况,增加了 hard link 之后,可以发现使用 ls -l 时,显示的 link 那一栏属性增加了!而如果这个时候砍掉 passwd 会发生什么事情呢?呵呵! passwd-hd 的内容还是会跟原来 passwd 相同,但是 passwd-so 就会找不到该档案啦!就是这样!了解了吗?!
9、而如果 ln 使用 -s 的参数时,就做成差不多是 Windows 底下的『快捷方式』的意思( Symbolic Link,较常用! )。当你修改 Linux 下的 link 档案时,则更动的其实是『原始档』,呵呵, 所以不论你的这个原始档被连结到哪里去,只要你修改了连结档,呵呵!原始档就跟着变啰! 以上面为例,由于你使用 -s 的参数建立一个名为 passwd-so 的档案,则你修改 passwd-so 时,其内容与 passwd 完全相同,并且,当你按下储存之后,被改变的将是 passwd 这个档案!
10、此外,如果你做了底下这样的连结: ln -s /bin /root/bin 那么如果你进入 /root/bin 这个目录下,『请注意呦!该目录其实是 /bin 这个目录,因为你做了连结档了!』所以,如果你进入 /root/bin 这个刚刚建立的链接目录, 并且将其中的数据杀掉时,嗯! /bin 里面的数据就通通不见了!这点请千万注意!并不是 /root 底下的资料都是 root 的!还需要注意一下该属性才行!(其实可以透过 pwd -P 去观察!)
11、基本上, Symbolic link 的用途比较广,所以您要特别留意 symbolic link 的用法呢!未来一定还会常常用到的啦! 12、关于目录的 link 数量: 或许您已经发现了,那就是,当我们以 hard link 进行『档案的连结』时,可以发现,在 ls -l 所显示的第二字段会增加一才对,那么请教,如果建立目录时,他默认的 link 数量会是多少? 让我们来想一想,一个『空目录』里面至少会存在些什么?呵呵!就是存在 . 与 .. 这两个目录啊! 那么,当我们建立一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是: 13、而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们建立一个新的目录时, 『新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1 』 不信的话,我们来作个测试看看:
[root@linux ~]# ls -ld /tmp 瞧!原本的所谓上层目录 /tmp 的 link 数量由 5 增加为 6 ,至于新目录 /tmp/testing 则为 2 ,这样可以理解目录的 link 数量的意义了吗?! ^_^
九、磁盘的分割、格式化、检验与挂载:1、对于一个系统管理者 ( root ) 而言,磁盘的的管理是相当重要的一环,尤其近来硬盘已经渐渐的被当成是消耗品了 ..... 好了,如果我们想要在系统里面新增一颗硬盘时,应该有哪些动作需要做的呢?有几个动作啰:(1)、对磁盘进行分割,以建立可用的 partition ; (2)、对该 partition 进行格式化( format ),以建立系统可用的 filesystem; (3)、若想要仔细一点,则可对刚刚建立好的 filesystem 进行检验; (4)、在 Linux 系统上,需要建立挂载点 ( 亦即是目录 ),并将他挂载上来; 当然啰,在上述的过程当中,还有很多需要考虑的,例如磁盘分区槽 (partition) 需要定多大? 是否需要加入 journal 的功能?inode 与 block 的数量应该如何规划等等的问题。但是这些问题的决定, 都需要与您的主机用途来加以考虑的~所以,在这个小节里面,鸟哥仅会介绍几个动作而已, 更详细的设定值,则需要以您未来的经验来参考啰!
2、磁盘分区: fdisk
[root@linux ~]# fdisk [-l] 装置名称
Command (m for help): m <== 输入 m 后,就会看到底下这些指令介绍 Command (m for help): p <== 这里可以输出目前磁盘的状态
Disk /dev/hda: 20.5 GB, 20520493056 bytes <== 硬盘的信息在这底下三行
Device Boot Start End Blocks Id System
Command (m for help): q
范例:查阅目前系统内的所有 partition 有哪些?
Device Boot Start End Blocks Id System
Disk /dev/hdb: 30.7 GB, 30735581184 bytes
Device Boot Start End Blocks Id System
3、还记得我们刚刚在 认识 EXT2 文件系统 里面提到的 partition 部分内容吗?其实 fdisk 最主要的工作就是在修改『 partition table 』 而已,并没有实际的将硬盘切切割割的啦!他会定义出某一个 partition 是由 n1 磁柱到 n2 磁柱之间这样的信息!因此,如果硬盘分割错误时,只要在 format 之前将 partition tables 复原,那么就可以将硬盘原来的数据救回来啰!所以,一个好的管理员,有时候也会将自己的 partition table 记录下来,以备不时之需呀!
4、这个 fdisk 只有 root 才能执行,此外,请注意, 使用的『装置名称』请不要加上数字,因为 partition 是针对『整个硬盘装置』而不是某个 partition 呢!所以执行 fdisk /dev/hdb1 就会发生错误啦!要使用 fdisk /dev/hdb 才对!那么我们知道可以利用 fdisk 来查阅硬盘的 partition 信息外,底下再来说一说进入 fdisk 之后的几个常做的工作!
5、删除磁盘分区槽 刚刚的 fdisk 结果当中,我知道我的 /dev/hdb 仅有 /dev/hdb1 而已, 那么假设我要将这个 /dev/hdb1 删除的话,可以怎么做? [root@linux ~]# fdisk /dev/hdb
(1)、 先看看整个结果是如何~
Disk /dev/hdb: 30.7 GB, 30735581184 bytes
Device Boot Start End Blocks Id System
(2)、按下 d 给他删除吧! Command (m for help): p
Disk /dev/hdb: 30.7 GB, 30735581184 bytes
Device Boot Start End Blocks Id System
Command (m for help): q
6、新增磁盘分区槽 那么如何新增 partition 呢?以鸟哥刚刚的 /dev/hdb 为例, 我的 /dev/hdb 有一个 /dev/hdb1 ,而且还有剩余空间,那我如何利用? (1)、fdisk /dev/hdb :先进入 fdisk 画面中; (2)、n:新增一个扇区,这个时候系统会问你, 如果您已经具有 extended 扇区时,那么系统会问您,您要新增的是 Primary 还是 Logical ,而如果您还没有 extended ,那么系统仅会问你要新增 Primary 还是 Extended。除此之外,如果您已经用完了四个 P + E 的话,那么就仅有 Logical 可以选择啦!请再回到刚刚说明硬盘的地方再次的复习一下吧!如果是选择 primary 的话,请按 p ,否则请按 e (extended) 或 l (logical)。 (3)、p :由于选 择为 primary 所以就会按下 p 啰! (4)、1-4 :primary 只允许四个, 所以这里请按尚未被使用的那一个扇区啰! (5)、w :同样的储存离开啰! 好了,假设鸟哥想要将我刚刚的 /dev/hdb 剩余空间分为两个分割槽, 一个是 primary ,另一个则是 logical ,且 primary 只要 100MBytes 就够了! 其他的都分给 logical ,那可以这么做!
[root@linux ~]# fdisk /dev/hdb Command (m for help): p
Disk /dev/hdb: 30.7 GB, 30735581184 bytes
Device Boot Start End Blocks Id System
Command (m for help): n Command (m for help): p
Disk /dev/hdb: 30.7 GB, 30735581184 bytes
Device Boot Start End Blocks Id System
Command (m for help): n Command (m for help): p
Disk /dev/hdb: 30.7 GB, 30735581184 bytes
Device Boot Start End Blocks Id System Command (m for help): w
The kernel still uses the old table. 透过上面的例子,您可以清楚的看到,呵呵!第一个 logical 是在 5 号呦!OK!在 fdisk 完成之后,请记得使用 mke2fs 格式化啰!另外,请注意,如果过程中进行错误时, 那么赶紧按下 q 离开即可! 以 root 的身份进行硬盘的 partition 时,最好是在单人维护模式底下比较安全一些, 此外,在进行 fdisk 的时候,如果该硬盘某个 partition 还在使用当中, 那么很有可能系统核心会无法重载硬盘的 partition table ,解决的方法就是将该使用中的 partition 给他卸除,然后再重新进入 fdisk 一遍,重新写入 partition table ,那么就可以成功啰! 另外,请注意一下,虽然一颗硬盘最大的逻辑扇区可以到达 63 号( 总数,包含 1~4 的 primary partition ),但是并非所有的 Linux distribution 都会将所有的逻辑扇区对应的磁盘代号都写入系统当中,以 Red Hat 为例,他仅列出 1~16 个代码,其他的您就得自己动手做啦!至于 Fedora 的话,他则是使用自己侦测的,当您以 fdisk 设定好了 partition table 之后,磁盘对应的磁盘代号就会自动的在您的 /dev/ 里头设定完成啰!不过,有的时候您还是得自己设定一下磁盘代码啦!如何设定呢?就使用mknod 这个指令吧!
7、磁盘格式化:
[root@linux ~]# mke2fs [-bicLj] 装置名称
Writing inode tables: done
This filesystem will be automatically checked every 27 mounts or
范例二:承上题,如果将 block 改为 2048 ,且 inode 改为 4096? 这是用来将磁盘格式化成 Linux 系统文件的指令。基本上,只要写入对的装置档案就可以了。 例如我们要格式化软盘的话,或是新的硬盘 /dev/hda5 等等! 这个指令通常是在新的硬盘上面切割完之后,再加以格式化的!另外,如果要将旧的扇区格式化成 ext2 格式的话,就使用这个指令吧!进行当中显示的讯息有点像上面的最后几行, 系统会显示目前的格式化的默认值!
而如果要设定不同的 Block ,就可以使用 -b 这个参数!请注意啰,预设的情况下, Block 是 4096!此外,您也可以自定义 inode table 呢!而,当没有指定的时候, mke2fs 使用 ext2 为格式化文件格式,若加入 –j 时,则格式化为 ext3 这个 Journaling 的 filesystem 呦!
上面提到的是关于将磁盘给他格式化成为 ext2/ext3 文件系统的指令, 那么如果想要格式化成为其他的文件系统呢?可以直接使用 mkfs 这个指令喔! 这个指令其实是将几个指令整合的一个功能而已!实际上,你可以参考:『 ls -l /sbin/mkfs* 』来看看系统有的、可以支持的文件格式呢!利用 man mkfs 就能够查阅啰!
接下来,如果我想要制作一个可以开机进入 Linux 的软盘片呢? 可以有底下这个作法喔! [root@linux ~]# mkbootdisk --device /dev/fd0 `uname -r` 这是制作启动盘的指令,其中,『 `uname -r` 』是目前 Linux 系统所使用的核心版本, 如果你有多个核心版本的话,你可以直接输入核心版本。例如在鸟哥的系统中, 旧的核心还是有保留的,所以我都会至少有两个核心,在我管理的某部主机中,核心为 2.6.11-1.1369_FC4 及 2.6.12-1.1398_FC4 ,那么如果我要直接以 2.6.11-1.1369_FC4 来开机的话,就可以使用: mkbootdisk --device /dev/fd0 2.6.11-1.1369_FC4 这个时候, mkbootdisk 就会以 /lib/modules 目录下的数据,配合 /boot 底下的 kernel 档案,来建立可开机的磁盘啰~建立软盘开机片一直是个好主意! 他可以在你求助无门的时候给你莫大的帮助喔!所以,建立一个新的软盘开机片是一个好主意啦! [root@linux ~]# fdformat /dev/fd0H1440 这是用来『低阶格式化』软盘的指令。( 注意:软盘的装置文件为 /dev/fd0 )!在上面的装置档案为 /dev/fd0H1440 , 其中加在 /fd0 之后的 H1440 为表示 1.44MB 的软盘容量! 在低阶格式化之后,还要将软盘的文件格式化为 Linux 的 ext2 之型态,则需要使用mke2fs 指令!
8、磁盘检验: fsck, badblocks 现在也建立好了新的 partition 了,也 format 好了,那么有没有其他的关于硬盘的工作需要来进行呢? 有的,就是需要怎样来检查硬盘有没有坏轨呢?那个就是 fsck 这个工具的用途啦!此外,您会发现到,在 / 这个目录底下 ( 其实只要有挂载硬盘的那个目录底下都有这个目录 ) 会有一个特殊的目录,就是『 lost+found 』这个目录啦!对的!就是当你处理完 fsck 之后,如果程序有发现到任何的错误的档案,就会将该档案的数据给他丢到这个目录当中,嘿嘿! 所以当你发现你的 Linux 目录当中有这个档案时,不要担心,那个是正常的啦!而且 只有挂载 partition 的目录 (就是挂载点) 才会有这个默认的目录啰!
还有,由于在 Linux 系统当中,为了增加系统效能,通常系统默认就是一些数据会写在内存当中, 并不会直接将数据写入硬盘里面,这是因为内存的速度要比硬盘快上若干倍呀! 但是有个问题就发生了,万一系统由于『跳电』或者是其他的莫名原因,造成系统的 shutdown 时,唉呀!怎么办?!系统就完蛋啦!所以啰,我们需要在某些特定的时候让数据直接回存到硬盘之中呀! 瞭乎!这里提供几个惯用的指令,其中,那个 fsck 是相当重要的,请参考其用法啰!
[root@linux ~]# fsck [-AtCary] 装置名称 这是用来检查与修正硬盘错误的指令。注意:通常只有身为 root 且你的系统有问题的时候才使用这个指令,否则在正常状况下使用此一指令, 可能会造成对档案的危害!通常使用这个指令的场合都是在系统出现极大的问题,导致你在 Linux 开机的时候得进入单人单机模式下进行维护的行为时,才必须使用此一指令! 另外,如果你怀疑刚刚格式化成功的硬盘有问题的时后,也可以使用 fsck 来检查一下硬盘呦!其实就有点像是 Windows 的 scandisk 啦!此外,由于 fsck 在扫瞄硬盘的时候,可能会造成部分 filesystem 的损坏,所以『执行 fsck 时, 被检查的 partition 务必不可挂载到系统上!亦即是需要在卸除的状态喔!』
常常我们会发现,在比较老旧的机器上 ( 例如鸟哥的 p-166 ),如果主机不正常的关机 (例如跳电啰!),那么硬盘很可能会出现错误的状况!这个时候 Linux 就无法正常的开机!这个时候就需要输入 root 的密码,以登入单人维护模式 (run level 1),然后下达 fsck -y /dev/hdxxx 来检查你的硬盘!等到确认成功之后,就使用 reboot 来重新启动吧!
[root@linux ~]# badblocks -[svw] 装置名称 这是用来检查硬盘或软盘扇区有没有坏轨的指令!跟 Windows 的 scandisk 相同功能啦!不过由于 fsck 的功能比较强,所以目前大多已经不使用这个指令了!
9、磁盘挂载与卸除 (1)、要将上面我们所建立起来的磁盘文件系统或软盘正式的在 Linux 上面启用时,一定需要将他挂载上文件系统! 而所谓的『挂载点』则是该 partition 所在的目录,且在该目录下的所有目录都归在该 partition 所有!假设一个情况好了,我们的 / 为 /dev/hda1 而 /home 为 /dev/hda2 ,那么在 /home/test 底下的咚咚就也都归 /dev/hda2 这个 partition 所有啰!而需要特别留意的是,由于挂载文件系统需要挂载点, 所以挂载的时候得先建立起挂载的目录才行!
(2)、除此之外,如果您要用来挂载的目录里面并不是空的,那么挂载了文件系统之后, 那么原目录下的东西就会暂时的消失。举个例子来说,假设您的 /home 原本是属于根目录 / 底下的 partition 所有,底下原本就有 /home/test 与 /home/vbird 两个目录。然后你想要加入新的硬盘,并且直接挂载 /home 底下,那么当您挂载上新的 partition 时,则 /home 目录显示的是该 partition 的内容,至于原先的 test 与 vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉, 而是暂时的隐藏了起来,等到 partition 被 umount 之后, 则该目录的内容就会再次的跑出来啦!
(3)、而要将文件系统挂载到我们的 Linux 系统上,就要使用 mount 这个指令啦! 不过,这个指令真的是博大精深~粉难啦!我们学简单一点啊~ ^_^
[root@linux ~]# mount -a
范例二:挂载光盘!
范例四:将 / 重新挂载,并加入参数为 rw !
范例五:将 Label 名为 logical 的 partition 挂载到 /mnt/hdb5 中
范例六:将系统所有的以挂载的 partition 数据列出来 在默认的情况下, mount 这个指令只有 root 才能执行! 如果您想要将整个系统里面记录的 filesystem 与 mount point 对应的数据 (记录在 /etc/fstab 文件中!), 全部都挂载上来,那么请执行: mount -a (4)、就可以依照 /etc/fstab 的参数内容将所有的磁盘给他重新挂上去!此外,需要注意的是,由于 Linux 系统中,每一个路径都有可能是一个独立的扇区系统, 所以需要将每个扇区系统都挂上各自的挂载点!详细的内容请回去参考一下上一篇Linux 文件系统 的说明。另外, 由于各个扇区的文件系统可能并不相同,所以您必须先要了解该扇区的文件系统, 这样才可以进行 mount 的工作!如何知道该磁盘的文件格式呢?可以使用fdisk 来显示的功能即可!
(5)、另外,如果您没有加上 -t 的参数,那么系统会默认尝试以 /etc/filesystems 内的文件系统格式来测试一下是否可以将装置挂载上来呢!
(6)、请注意呦!由于 mount 之后的 partition 就已经被设定在使用了, 所以,您不可以使用 fsck 检查该 partition 呢!否则可能会造成 filesystem 的损毁~ 因此,你就必须要将该 partition 给卸除才行! 可以利用 umount 来卸除喔!
(7)、另外,我们也可以利用 mount 来将某个目录挂载到另外一个目录去喔! 这并不是挂载文件系统,而是额外挂载某个目录的方法! 其实可以利用 link file 来达到底下范例的功能啦! ^_^
范例一:将 /home 这个目录暂时挂载到 /tmp/home 底下:
范例二:将 /tmp/home 卸除: 看起来,其实两者连结到同一个 inode 嘛!! ^_^ 没错啦!透过这个 mount --bind 的功能, 您可以将某个目录挂载到其他目录去喔!而并不是整块 filesystem 的啦!
[root@linux ~]# umount 装置代号或挂载点 就是直接将 mount 上来的文件系统给他卸除即是!卸除之后,可以使用 df 看看是否还存在呢?! 此外,也可以利用 -f 参数将想要卸除的 partition 强制卸除!此外, 卸除的方式,可以下达装置 (如 /dev/hdb5) 或挂载点 (如 /mnt/hdb5),均可接受啦!
十、磁盘参数修订: 1、某些时刻,您可能会希望修改一下目前磁盘的一些相关信息,举例来说,磁盘的 Label , 或者是 journal 的参数,或者是其他硬盘运作时的相关参数 (例如 DMA 启动与否~)。 这个时候,就得需要底下这些相关的指令功能啰~
[root@linux ~]# mknod 装置名称 [bcp] [Major] [Minor] 还记得我们说过,在 Linux 底下所有的装置都以档案来代表吧!? 但是那个档案如何代表该装置呢?很简单!就是透过档案的 major 与 minor 数值来替代的~所以,那个 major 与 minor 数值是有特殊意义的, 不是随意设定的喔!举例来说,如果以硬盘装置来说明,那么 /dev/hda 到 /dev/hdd 的 major 与 minor 代码是:
此外, mknod 也可以用来制作 FIFO 类型的档案喔!更多与 Linux 核心有关的装置及装置代号可以参考:
[root@linux ~]# e2label 装置名称 新的Label名称 2、这个东西也挺有趣的,主要的功能是用来修改『磁盘的表头数据』,也就是 label 啦。 那是甚么东西呢?如果你使用过 Windows 的档案总管的话,那么应该会晓得, 每个驱动器号后面都有个名称吧,呵呵!那个就是 label 啰。这个东西除了有趣之外, 也会被使用到一些配置文件案当中,举例来说,当我们在挂载磁盘的时候,除了利用磁盘的代号之外 (/dev/hdxx) 也可以直接利用磁盘的 label 来作为挂载的磁盘挂载点喔!基本上, 就是那个 /etc/fstab 档案的设定啰!
3、因为某些 distribution 为了方便,他们是以 Label 来做为磁盘挂载的依据, 这样有好有坏啦! 所以,鸟哥通常还是比较喜欢直接利用磁盘代号来挂载啦! 不过,如果没有特殊需求的话,那么利用 Label 来挂载也成! 但是您就不可以随意修改 Label 的名称了!
[root@linux ~]# tune2fs [-jlL] 装置代号 这个指令的功能其实很广泛啦~上面鸟哥仅列出很简单的一些参数而已, 更多的用法请自行参考 man tune2fs 。比较有趣的是,如果您的某个 partition 原本是 ext2 的文件系统,如果想要将他更新成为 ext3 文件系统的话, 利用 tune2fs 就可以很简单的转换过来啰~ 如果您的硬盘是有 DMA 模式功能的,但是系统却没有启动他,那么您的硬盘存取效能可能会降低一半以上~ 所以,当然要启动 DMA 啦~那么如何启动?就用 hdparm 啊! 不过, hdparm 里头有很多很进阶的参数设定值,一般来说, 不很建议大家随意修订~很容易造成硬盘的挂点喔! 用这个指令时,最多是启动 DMA 模式,以及测试硬盘的存取效能就好了~ 真的不要随意更动其他参数喔!除非您真的知道自己在干嘛~
[root@linux ~]# hdparm [-icdmXTt] 装置名称
范例二:取得我主板上面关于 IDE 的速度限制
范例三:启动我的 UDMA 在 mode 4 喔~
范例四:测试这颗硬盘的读取效能 4、我们都知道目前的 IDE 硬盘主要的传输模式为 ATA 模式,最近 (2002年)已经出到了 ATA 133 了!不过,传统上, ATA 66 就已经很厉害了!新的 IDE 硬盘也没有办法完全利用 ATA 100 呢!但是,你知道吗?有没有开启 ATA 这个传输信道的 DMA 模式, 对于硬盘的存取效率差很大呦!
5、这个指令必须要 root 才能执行!此外,需要特别注意, -X 这个参数是很危险的参数设定, 除非您非常了解您的硬盘架构,否则不建议自行设定,因为 manual page 上面就有说明到这一点~~不过,无论如何,目前大于 2GB 以上的硬盘至少都已经支持了 DMA 33 了!因此,使用 -X66 应该都是可行的!而如果您的硬盘是很新的, 那么 -X69 应该是没有问题才是!不过,还是要 hdparm -i /dev/hd[a-d] 去检查看看!
十一、设定开机挂载: 1、在上一小节里面,我们提到了硬盘的分割与格式化,同时还提到了如何挂载的问题等等, 在这个小节当中,我们就持续的来讨论,那么 mount 还可以做哪些事情呢? 还有,如果想要一开机就让系统自动的帮我们将 partition 挂载起来,又该如何呢?
2、各式磁盘挂载与 中文编码挂载还有 USB 随身碟: 这里再次强调一个观念,在 Windows 底下,磁盘分区是以 A, B, C, D, .... 等等的方式来划分的,然而在 Linux 或 Unix 系统之下,却是以目录来代表,也就是说, 一个目录很可能就是一个扇区了! 举个例子来说,通常 Linux 默认的软盘挂载的地点在 /mnt/floppy 这里!呵呵!那么如果你需要软盘的数据时,就将 /dev/fd0 这一个装置(前面提过啰!这个是周边存取装置的一个设备文件类型)挂上 /mnt/floppy 就可以啦!然后你进入到 /mnt/floppy 就可以读取软盘的数据啰! 很多朋友常常会使用到软盘,尤其是在网络有问题的时候,那么如何使用 Linux 将软盘挂上来呢?!首先,您给先了解你的磁盘档案的格式,例如 Linux 的文件格式( ext2 )与 Windows 的文件格式( vfat )是不一样的!分别可以使用如下的方式挂上来:
[root@linux ~]# mount -t ext2 /dev/fd0 /media/floppy 所以啰!即使是 Windows 格式的档案,在 Linux 底下仍然是可以读取的到的呦!另外, 要注意的是,即使你使用软盘完毕之后,一定要将 /media/floppy 卸除之后才可以取出软盘片喔!不然系统会一直告诉你发生错误啰!而在卸除 /media/floppy 的时候,你一定不能在该目录底下,否则会发生错误讯息喔! 而如果加载的格式不符合,系统也不会将该软盘挂上来的呦!好了,那么怎么制作 ext2 的软盘呢?简单的很,就使用mke2fs /dev/fd0 就行啦! 如果万一你在安装系统的时候忘记将 Windows 的 VFAT 格式的扇区 mount 上你的 Linux 时,该怎么办?!这种现象最常发生在多系统共存的环境中!例如在原有的 Windows 98 或 Win2000 上面安装 Linux ,但是结果却忘记将该扇区挂载上来!嗯!这样需要重新安装吗?! 当然不需要了!又不是被入侵!那么该如何挂载上来呢?!
3、就如同前面说的,由于一个目录可能代表了一个扇区,因此你必须要先建立一个目录, 然后再将此扇区挂载上你的 Linux 目录,就可以啦!另外,由于需要将扇区挂在目录下, 所以你还得需要了解你的 Windows 扇区是在哪一个硬盘周边中喔!如何知道你的 Windows 扇区呢?就使用fdisk 吧!使用 fdisk -l 就能够知道啰~
那么假设我的 windows 的 VFAT filesystem 是在 /dev/hda1 ,而我想要将该 partition 挂载到 /mnt/win98 ,该如何做?
[root@linux ~]# mkdir /mnt/win98 如此一来就将 Windows 的系统挂到 Linux 里面啰!简单吧!请注意, 上面那个第三行所使用的参数可以让您的 Windows 98 的扇区当中的档案显示出正确的中文呦! 因为加入了中文编码啊! ^_^ 以现在的科技来说(2005年),软盘与光盘不再是最佳的携带工具了~ 最佳的携带储存设备应该是 USB 随身碟或者是随身硬盘~那么我们可以挂载 USB 随身碟吗?!呵呵!当然可以啊~不过.....要我们的 Linux 捉的到 USB 才行~ 不过,您不需要担心,因为,目前的 distribution 均会主动的加载 USB 的模块, 所以,您只要插入 USB 随身碟,嘿嘿!我们的 Linux 几乎没有问题,一定可以捉到的!
捉到 USB 随身碟之后,再利用 fdisk -l 列出所有的 partition ,您会发现, 系统中怎么会多出 /dev/sda[??] 的 SCSI 硬盘啊?!不会吧!系统这么好?? 呵呵!不是啦~其实 USB 硬盘的代号也是 /dev/sd[a-??] 的代号, 第一个 USB 代号为 /dev/sda ,而如果该 USB 硬盘还有 partition 的话, 那就会有一些号码出现了~如果是随身碟,通常只有 /dev/sda1 而已啦~ 好,那就假设您的随身碟是 /dev/sda1 好了,那么将他挂载到 /mnt/usb ,要怎么做?
[root@linux ~]# mkdir /mnt/usb 上头是假设您的 USB 随身碟使用的是 FAT 的 Windows 文件格式而设定的。 如果您的随身碟是 NTFS 的 Windows 2000 文件格式,那就比较麻烦, 因为 FC4 预设情况下,并不支持这个文件系统的~ 如果您执意要挂载 NTFS 的文件格式,那么..... 请参考底下这个计划的网站啰~
十二、开机挂载 /etc/fstab 及 /etc/mtab 1、刚刚上面说了许多,那么可不可以在开机的时候就将我要的扇区都挂好呢?!这样我就不需要每次进入 Linux 系统都还要在挂载一次呀!当然可以啰!那就直接到 /etc/fstab 里面去修修就行啰!不过,在开始说明前,这里要先跟大家说一说系统挂载的一些限制: 好了,那么我们进入 /etc/fstab 看一看吧:
[root@linux ~]# cat /etc/fstab
2、其实这个 /etc/fstab 就是将我们使用 mount 来挂载一个装置到系统的某个挂载点, 所需要下达的指令内容,将这些内容通通写到 /etc/fstab 里面去,而让系统一开机就主动挂载啰~ 那么 mount 下达指令时,需要哪些参数?不就是『装置代号、挂载点、文件系统类别、参数』等等, 而我们的 /etc/fstab 则加入了两项额外的功能,分别是备份指令 dump 的执行与否, 与是否开机进行fsck 扫瞄磁盘呢~
3、我这个人比较龟毛一点,因为某些 distributions 的 /etc/fstab 档案排列方式蛮丑的, 虽然每一栏之间只要以空格符分开即可,但就是觉得丑,所以通常鸟哥就会自己排列整齐, 并加上批注符号,就是 # 字号,来帮我记忆这些信息!由上面的说明,我们知道 /etc/fstab 内总共有六栏,分别来谈一谈每一栏的内容吧!
4、所以说,如果我想要将我们刚刚练习时,建立的 /dev/hdb5 这个 ext3 的 filesystem 挂载到 /mnt/hdb5 时, 并且在开机的时候就已经自动的挂载好,那么就可以将底下这一行写入到 /etc/fstab 当中了:
/dev/hdb5 /mnt/hdb5 ext3 defaults 2 2 5、很简单吧!所以啦,以后您自己建立的磁盘文件系统想在开机的时候挂载好时,就在 /etc/fstab 加入吧! 此外,这个 /etc/fstab 还有什么特殊功能呢?还记得使用mount -a 时,我们提到的该参数参考档案吧?!没错啊!就是这个 /etc/fstab 啊!而且,一般来说, 当我们编辑 /etc/fstab 后,为了避免可能的错误,通常就会以 mount -a 这个指令来测试看看呢!这是很重要的一个测试动作喔!
6、另外,您也必须要了解到,除了这些磁盘文件格式之外, 其实在系统里面还有一些特殊的格式可以挂载来帮助系统的运作的! 例如上表当中非特殊字体的那几行字!
7、而 /etc/fstab 是开机时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个档案当中的。每次我们在更动 filesystem 的挂载时,也会同时更动这两个档案喔!但是,万一发生您在 /etc/fstab 输入的数据错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的 / 可是 read only 的状态,当然您就无法修改 /etc/fstab ,也无法更新 /etc/mtab 啰~那怎么办? 没关系,可以利用底下这一招:
[root@linux ~]# mount -n -o remount,rw / 加上 -n 则不更新 /etc/mtab ,加上 -o 则提供额外的参数设定。 利用这一动作,嘿嘿!您的 / 就可以读写,那么自然就能够更新档案内容啰~
十三、特殊装置 loop 挂载 1、除了常见的软、硬盘挂载之外,我们还可以挂载特殊装置喔!举例来说,利用我们的硬盘内的档案仿真出来的装置! 也就是说,当我的硬盘内有一个 2GB 的档案时,我可以将这个档案『模拟』成为一个独立的装置, 然后用这个装置来挂载使用喔!当然啦,这个 2GB 的大档案要能够被挂载时, 他必须是一个『被格式化过的档案』才行!底下我们就来玩一玩这个咚咚。
建立大型档案: (1)、首先,我们得先有一个大的档案吧!怎么建立这个大档案呢?在 Linux 底下我们有一支很好用的程序dd 可以用来建立空的档案喔!详细的说明请先翻到后面一章压缩指令的运用 来查阅,这里鸟哥仅作一个简单的范例而已。 假设我要建立一个空的档案在 /tmp/loopdev ,那可以这样做:
[root@linux ~]# dd if=/dev/zero of=/tmp/loopdev bs=1024k count=2048 格式化 很简单就建立起一个 2GB 的档案了吶!!接下来当然是格式化啰!
[root@linux ~]# mke2fs -j /tmp/loopdev 挂载 (2)、那要如何挂载啊?利用 mount 的特殊参数,那个 -o loop 的参数来处理!
[root@linux ~]# mount -t ext3 -o loop /tmp/loopdev /media/cdrom/ 多了个独立的装置给您使用喔!其实就是那个 2GB 的档案内容啦! 这东西看起来似乎没有什么用途的样子,不过,如果您未来想要玩 Linux 上面的『虚拟主机』的话, 也就是以一部 Linux 主机再切割成为数个独立的主机系统时,类似 VMware 这类的软件, 在 Linux 上使用 xen 这个软件,他就可以配合这种 loop device 的文件类型来进行根目录的挂载, 真的非常有用的喔!
(责任编辑:IT) |