linux中,什么是linux 连结档档,链接,链接目录

博客分类:
磁盘的物理组成:
首先看看硬盘的物理组成,就硬盘的物理元件来说,硬碟其实是由许许多多的圆形硬碟盘所组成的, 依据硬碟盘能够容纳的资料量,而有所谓的单碟 (一块硬碟里面只有一个硬碟盘) 或者是多碟 (一块硬碟里面含有多个硬碟盘)的硬碟。在这里我们以单一个硬碟盘来说明。
首先,硬碟里面一定会有所谓的磁头 ( Head ) 在进行该硬碟盘上面的读写动作,而磁头是固定在机械手臂上面的,机械手臂上有多个磁头可以进行读取的动作。 而当磁头固定不动 (假设机械手臂不动) ,硬碟盘转一圈所画出来的圆就是所谓的磁轨( Track );而如同我们前面刚刚提到的,一块硬碟里面可能具有多个硬碟盘, 所有硬碟盘上面相同半径的那一个磁轨就组成了所谓的磁柱( Cylinder )。
两个硬碟盘上面的同一个磁轨就是一个磁柱啦! 这个磁柱也是磁碟分割( partition )时的最小单位了;
另外,由圆心向外划直线,则可将磁轨再细分为一个一个的磁区( Sector ),这个磁区就是硬碟盘上面的
最小储存物理量了! 通常一个 sector 的大小约为 512 Bytes 。以上就是整个硬碟的基本元件。
在计算整个硬碟的储存量时,简单的计算公式就是∶Cylinder x Head x Sector x 512 Bytes。另外,硬碟在读取时,主要是『硬碟盘会转动, 利用机械手臂将磁头移动到正确的资料位置(单方向的前后移动),然后将资料依序读出。』
磁盘分割
接著下来介绍的就是硬碟的分割( Partition )棉! 为什么要进行硬碟分割啊?!因为我们必须要告诉作业系统∶『 我这块硬碟可以存取的区域是由 A 磁柱到 B 磁柱』,如此一来, 作业系统才能够控制硬碟磁头去 A-B 范围内的磁柱存取资料;如果没有告诉作业系统这个资讯, 那么作业系统就无法利用我们的硬碟来进行资料的存取了, 因为作业系统将无法知道他要去哪里读取资料啊!这就是磁碟分割( Partition )的重点了∶ 也就是记录每一个分割区( Partition )的起始与结束磁柱!
这个分割区的起始与结束磁柱的资料放在哪里呢?!那就是我们在 Linux 安装与多重开机技巧 那个章节提到的 主要开机磁区( Master Boot Recorder, MBR )棉!事实上, MBR 就是在一块硬碟的第零轨上面,
这也是电脑开机之后要去利用该硬碟时, 必须要读取的第一个区域!
文件系统
在告知系统我的 partition 所在的起始与结束磁柱之后,再来则是需要将 partition 格式化为『我的作业系统认识的文件系统( Filesystem )』棉!因为每个作业系统认识的 filesystem 并不相同!例如
Windows 作业系统在预设状态下就无法认识 Linux 的文件系统。
不论是哪一种 filesystem ,资料总是需要储存的吧!既然硬碟是用来储存资料的,想当然尔, 资料就必须写入硬碟啦!刚刚我们提到硬碟的最小储存单位是 sector ,不过资料所储存的最小单位并不是 sector 喔,因为用 sector 来储存太没有效率了。怎么说呢?因为一个 sector 只有 512 Bytes ,而磁头是一个一个 sector 的读取,也就是说,如果我的文件有 10 MBytes ,那么为了读这个文件, 我的磁头必须要进行读取 (I/O) 20480 次!
为了克服这个效率上的困扰,所以就有逻辑区块( Block )的产生了! 逻辑区块是在 partition 进行 filesystem 的格式化时, 所指定的『最小储存单位』,这个最小储存单位当然是架构在 sector 的大小上面( 因为 sector 为硬碟的最小物理储存单位啊! ),所以啦, Block 的大小为 sector 的 2 的次方倍数。此时,磁头一次可以读取一个 block ,如果假设我们在格式化的时候,指定 Block 为 4 KBytes (
亦即由连续的八个 sector 所构成一个 block ),那么同样一个 10 MBytes 的文件, 磁头要读取的次数则大幅降为 2560 次,这个时候可就大大的增加文件的读取效能啦!
Superblock∶如同前面说的,当我们在进行磁碟分割( partition )时,每个磁碟分割槽( partition )就是一个文件系统( filesystem ), 而每个文件系统开始的位置的那个 block 就称为 superblock ,superblock 的作用是储存像是文件系统的大小、空的和填满的区块,以及他各自的总数和其他诸如此类的资讯等等, 这也就是说,当您要使用这一个磁碟分割槽( 或者说是文件系统 )来进行资料存取的时候,第一个要经过的就是 superblock 这个区块了,所以棉, superblock 坏了,您的这个磁碟槽大概也就回天
乏术了!
Linux的EXT2文件系统:
文件有很多属性,如创建时间,所属群组,创建者等,还有文件内容。
ext2 规划出 inode 与 Block 来分别储存文件的属性( 放在 inode 当中 )与文件的内容( 放置在 Block area 当中 )。当我们要将一个 partition 格式化( format )为 ext2 时,就必须要指定 inode 与 Block 的大小才行,也就是说,当 partition 被格式化为 ext2 的文件系统时,他一定会有 inode table 与 block area 这两个区域。
Block 是记录『文件内容资料』的区域,至于 inode 则是记录『该文件的相关属性,以及文件内容放置在哪一个 Block 之内』的资讯。 简单的说, inode 除了记录文件的属性外,同时还必须要具有指向( pointer )的功能,亦即指向文件内容放置的区块之中,好让作业系统可以正确的去取得文件的内容啊!
inode记录中保存的信息:
该文件的拥有者与群组(owner/group);
该文件的存取模式(read/write/excute);
该文件的类型(type);
该文件建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改的时间(mtime);
该文件的容量;
定义文件特性的旗标(flag),如 SetUID...;
该文件真正内容的指向 (pointer);
目录∶
当我们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 与至少一块 Block 给该
目录。其中,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目
录下的相关连的文件(或目录)的关连性!
文件∶
当我们在 Linux 下的 ext2 建立一个一般文件时, ext2 会分配至少一个 inode 与相对于该文件大小的 Block 数量给该文件。例如∶假设我的一个 Block 为 4 Kbytes ,而我要建立一个 100 KBytes 的文件,那么 linux 将分配一个 inode 与 25 个 Block 来储存该文件!
inode 本身并不纪录档名,而是记录文件的相关属性,至于档名则是记录在目录所属的 block 区域! 那么文件与目录的关系又是如何呢?就如同上面的目录提到的,文件的相关连结会记录在目录的 block 资料
区域, 所以当我们要读取一个文件的内容时,我们的 Linux 会先由根目录 / 取得该文件的上层目录所在 inode , 再由该目录所记录的文件关连性 (在该目录所属的 block 区域) 取得该文件的 inode , 最后在经由 inode 内提供的 block 指向,而取得最终的文件内容。例如:
ls -lia /
2 drwxr-xr-x
22 root root
-11 03:30 .
2 drwxr-xr-x
22 root root
-11 03:30 ..
392449 drwxr-xr-x
2 root root
-11 03:31 bin
654081 drwxr-xr-x
3 root root
-11 03:36 boot
10700 drwxr-xr-x
2 root root
-11 03:08 cdrom
4 drwxr-xr-x
17 root root
-26 18:45 dev
130817 drwxr-xr-x 131 root root -06-26 18:47 etc
# 注意看一下,在上面的 . 与 .. 都是连结到 inode 号码为 2 的那个 inode ,
# 也就是说, / 与其上层目录 .. 都是指向同一个 inode number 啊!两者是相同的。
# 而在根目录所记载的档案关连性 (在 block 内) 得到 /etc 的 inode number
# 为 130817 那个 inode number 喔!
要想知道linux支持哪些文件系统,可使用ls -l /lib/modules/`uname -r`/kernel/fs
进行查看。
查看系统当前已启用的文件系统使用cat /proc/filesystems。
磁盘与目录容量
有什么方法可以查看目前的磁碟最大容许容量、已经使用掉的容量、 目前所在目录的已使用容量?还有还有,怎么知道目前目录底下使用掉的硬碟容量呢? 以及如何查询目前的 inodes 数目?
df [-ahikHTm] [目录或档名]
参数∶
-a& ∶列出所有的档案系统,包括系统特有的 /proc 等档案系统;
-k& ∶以 KBytes 的容量显示各档案系统;
-m& ∶以 MBytes 的容量显示各档案系统;
-h& ∶以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H& ∶以 M=1000K 取代 M=1024K 的进位方式;
-T& ∶连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i& ∶不用硬碟容量,而以 inode 的数量来显示
范例一∶将系统内所有的 partition 列出来!用df命令
执行结果:
Filesystem&&&&&&&&&& 1K-blocks&&&&& Used Available Use% Mounted on
/dev/sda1&&&&&&&&&&&& && % /
none&&&&&&&&&&&&&&&&&&& 248640&&&&&& 204&&& 248436&& 1% /dev
none&&&&&&&&&&&&&&&&&&& 254244&&&&&& 188&&& 254056&& 1% /dev/shm
none&&&&&&&&&&&&&&&&&&& 254244&&&&&& 100&&& 254144&& 1% /var/run
none&&&&&&&&&&&&&&&&&&& 254244&&&&&&&& 0&&& 254244&& 0% /var/lock
df -h
Filesystem&&&&&&&&&&& Size& Used Avail Use% Mounted on
/dev/sda1&&&&&&&&&&&&& 15G& 2.6G&& 11G& 20% /
none&&&&&&&&&&&&&&&&& 243M& 204K& 243M&& 1% /dev
none&&&&&&&&&&&&&&&&& 249M& 188K& 249M&& 1% /dev/shm
none&&&&&&&&&&&&&&&&& 249M& 100K& 249M&& 1% /var/run
none&&&&&&&&&&&&&&&&& 249M&&&& 0& 249M&& 0% /var/lock
du [-ahskm] 档案或目录名称
参数∶
-a& ∶列出所有的档案与目录容量,因为预设仅统计目录底下的档案量而已。
-h& ∶以人们较易读的容量格式 (G/M) 显示;
-s& ∶列出总量而已,而不列出每个各别的目录占用容量;
-k& ∶以 KBytes 列出容量显示;
-m& ∶以 MBytes 列出容量显示;
链接文件。
什么是连结档呢?其实连结档有点类似 Windows 底下的『捷径』!也就是很多的连结档案( link file )其实都指向同一个来源档案( source file )!。链接文件分为软连接和硬链接。Hard Link 只是在某个目录下新增一个该档案的关连资料而已!
举个例子来说,假设我的 /root/crontab 为一个 hard link 的档案,他连结到 /etc/crontab 这个档案,也就是说,其实 /root/crontab 与 /etc/crontab 是同一个档案,只是有两个目录( /etc 与 /root )记录了 crontab 这个档案的关连资料罢了!也就是说,我由 /etc 这个目录所记录的关连资料可知道crontab 的 inode 放置在 A 处,而由 /root 这个目录下的关连资料, crontab 同样也指到 A 处的
inode !所以棉, crontab 这个档案的 inode 与 block 都没有改变, 有的只是有两个目录记录了关连资料。
那这样有什么好处呢?最大的好处就是『安全!』如同上面提到的 /root/crontab 与 /etc/crontab 中,
不管哪一个档案被删除了,其实仅是移除一笔目录底下的档案关连性资料,并没有更动到原本档案的 inode 与 block 资料呢!而且,不论由那个目录连结到正确的 crontab 的 inode 与 block , 都可以正确无误的进行资料的修改喔!由于 hard link 是在同一个 partition 上面进行资料关连的建立,所以 hard link 是有限制的∶ 不能跨 Filesystem; 不能 link 目录。
一般来说,使用 hard link 设定连结档时,磁碟的空间与 inode 的数目都不会改变! 由上面的说明来看,我们可以知道, hard link 只是在某个目录下的 block 多写入一个关连资料,所以当然不会用掉 inode 与磁碟空间棉!
Symbolic link 就是在建立一个独立的档案, 而这个档案会让资料的读取指向他 link 的那个档案内容!由于只是利用档案来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的档案会『开不了』。由 Symbolic link 所建立的档案为一个独立的新的档案,所以会占用掉 inode 与 block 喔!
[root@linux ~]# ln [-sf] 来源档 目标档
参数∶
-s& ∶如果 ln 不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
-f& ∶如果 目标档 存在时,就主动的将目标档直接移除后再建立!
范例∶
范例一∶将 /etc/passwd 复制到 /tmp 底下,并且观察 inode 与 block
[root@linux ~]# cd /tmp
[root@linux tmp]# cp -a /etc/passwd .
[root@linux tmp]# du - df -i .
26948&& . &== 先注意一下,这里的容量是多少!
Filesystem&&&&&&&&&&& Inodes&& IUsed&& IFree IUse% Mounted on
/dev/hda1&&&&&&&&&&& && 10% /
# 利用 du 与 df 来检查一下目前的参数~那个 du -sb
# 是计算整个 /tmp 底下有多少 bytes 的容量啦!
范例二∶将 /tmp/passwd 制作 hard link 成为 passwd-hd 档案
[root@linux tmp]# ln passwd passwd-hd
[root@linux tmp]# du - df -i .
26948&& .
Filesystem&&&&&&&&&&& Inodes&& IUsed&& IFree IUse% Mounted on
/dev/hda1&&&&&&&&&&& && 10% /
# 仔细看,即使多了一个档案在 /tmp 底下,整个 inode 与 block 的容量并没有改变!
[root@linux tmp]# ls -il passwd*
1242760 -rw-r--r--& 2 root root 1746 Jun 29 01:03 passwd
1242760 -rw-r--r--& 2 root root 1746 Jun 29 01:03 passwd-hd
# 原来是指向同一个 inode 啊!这是个重点啊!另外,那个第二栏的连结数也会增加!
范例三∶将 /tmp/passwd 建立一个符号连结
[root@linux tmp]# ln -s passwd passwd-so
[root@linux tmp]# ls -li passwd*
1242760 -rw-r--r--& 2 root root 1746 Jun 29 01:03 passwd
1242760 -rw-r--r--& 2 root root 1746 Jun 29 01:03 passwd-hd
1242806 lrwxrwxrwx& 1 root root&&& 6 Jul 23 20:02 passwd-so -& passwd
# 仔细看喔,这个 passwd-so 指向的 inode number 不同了!这是一个新的档案~
# 这个档案的内容是指向 passwd 的,你可以看到这个档案的大小,是 6bytes ,
# 怎么来的?因为 passwd 共有六个字元啊!哈哈!没错~这个连结档的内容只是填写
# 连结的目标档案档名而已!所以,你的连结档档名 (有时候含路径) 有多长,档案就多大!
[root@linux tmp]# du - df -i .
26954&& .
Filesystem&&&&&&&&&&& Inodes&& IUsed&& IFree IUse% Mounted on
/dev/hda1&&&&&&&&&&& && 10% /
# 呼呼!整个容量与 inode 使用数都改变棉~确实如此啊!
范例四∶删除原始档案 passwd ,其他两个档案是否能够开启?
[root@linux tmp]# rm passwd
[root@linux tmp]# cat passwd-hd
......正常显示完毕!
[root@linux tmp]# cat passwd-so
cat: passwd-so: No such file or directory
# 怕了吧?!竟然无法正常的开启这个档案呢~
hnzhoujunmei
浏览: 325403 次
来自: 北京
博主可以分享一下源码吗?
很好的demo!
大写的牛逼
怎么访问NetEcho.html页面呀???
java多线程实例demo源代码下载:http://www.z ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Linux磁盘与文件系统管理
磁盘与文件系统管理这部分内容太多,看了两遍,东西是弄明白了,但东西太多写的时候无从下手,网上查了半天也找不到好的文章参考,看到的还是鸟哥的东西,为了和前面后面文章衔接,所以只能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 记录的信息(当然不止这些):
该档案的拥有者与群组(owner/group);该档案的存取模式(read/write/excute);该档案的类型(type);该档案建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改的时间(mtime);该档案的容量;定义档案特性的旗标(flag),如 SetUID...;该档案真正内容的指向 (pointer);
&&&&&& 4、inode的数量不大小也是在格式化时就已经固定了,除此之外 inode 还有些什么特性?
&每个 inode 大小均固定为 128 bytes;
&每个档案都仅会占用一个 inode 而已;
&承上,因此文件系统能够建立的档案数量与 inode 的数量有关;
&系统读取档案时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能
够开始实际读取 block&& 的内容。
&&&&&&&&&&&& 一般的一个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 系统到底是如何读取一个档案的内容呢?底下我们分别针对目录与档案来说明:
当我们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 与至少一块 Block 给该目录。其中,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目录下的相关连的档案(或目录)的关连性!档案:
当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配至少一个 inode 与相对于该档案大小的 Block 数量给该档案。例如:假设我的一个 Block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode 与 25 个 Block 来储存该档案!
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)、 察看一下根目录所记载的所有档案关连性数据
[root@linux ~]# ls -lia /
&&&&& 2 drwxr-xr-x& 24 root root& 4096 Jul 16 23:45 .
&&&&& 2 drwxr-xr-x& 24 root root& 4096 Jul 16 23:45 ..
&719489 drwxr-xr-x& 83 root root 12288 Jul 21 04:02 etc
&523265 drwxr-xr-x& 24 root root& 4096 Jun 25 20:16 var
# 注意看一下,在上面的 . 与 .. 都是链接到 inode 号码为 2 的那个 inode ,
# 也就是说, / 与其上层目录 .. 都是指向同一个 inode number 啊!两者是相同的。
# 而在根目录所记载的档案关连性 (在 block 内) 得到 /etc 的 inode number&
# 为 719489 那个 inode number 喔!
(2)、察看一下 /etc/ 内的档案关连性的数据
[root@linux ~]# ls -liad /etc/crontab /etc/.
719489 drwxr-xr-x& 83 root root 12288 Jul 21 04:02 /etc/.
723496 -rw-r--r--&& 1 root root&& 663 Jul& 4 12:03 /etc/crontab
# 瞧!此时就能够将 /etc/crontab 找到关连性啰!
10、所以您知道,目录的最大功能就是在提供档案的关连性,在关连性里面, 当然最主要的就是『档名与 inode 的对应数据』啰!另外,关于 EXT2 文件系统,这里有几点小事情要提醒一下:
ext2 与 ext3 档案在建立时 (format) 就已经设定好固定的 inode 数与 block 数目了;格式化 Linux 的 ext2 文件系统,可以使用 mke2fs 这个程序来执行!ext2 允许的 block size 为
及 4096 bytes;一个 partition (filesystem) 所能容许的最大档案数,与 inode 的数量有关, 因为一个档案至少要占用一个 inode 啊!在目录底下的档案数如果太多而导致一个 Block 无法容纳的下所有的关连性数据时,Linux 会给予该目录多一个 Block 来继续记录关连数据;通常 inode 数量的多寡设定为 (partition 的容量) 除以 (一个 inode 预计想要控制的容量)。 举例来说,若我的 block 规划为 4Kbytes,假设我的一个 inode 会控制两个 block ,亦即是假设我的一个档案大致的容量在 8Kbytes 左右时,假设我的这个 partition 容量为 1GBytes, 则 inode 数量共有:( 1G * 1024M/G * 1024K/M ) / ( 8K ) = 131072
个。而一个 inode 占用 128 bytes 的空间,因此格式化时就会有 ( 131072个 * 128bytes/个 ) =
byes = 16384 Kbytes 的 inode table 。也就是说,这一个 1GB 的 partition 在还没有储存任何数据前, 就已经少了 16MBytes 的容量啊!因为一个 inode 只能记录一个档案的属性,所以 inode 数量比 block 多是没有意义的! 举上面的例子来说,我的 Block 规划为 4 Kbytes ,所以 1GB 大概就有 262144 个 4Kbytes 的 block ,如果一个 block 对应一个 inode 的话,那么当我的 inode 数量大于 262144 时,多的 inode 将没有任何用处,徒然浪费硬盘的空间而已!另外一层想法,如果我的档案容量都很大, 那么一个档案占用一个
inode 以及数个 block ,当然 inode 数量就可以规划的少很多啦!当 block 大小越小,而 inode 数量越多,则可利用的空间越多,但是大档案写入的效率较差; 这种情况适合档案数量多,但是档案容量小的系统,例如 BBS 或者是新闻组( News )这方面服务的系统;当 Block 大小越大,而 inode 数量越少时,大档案写入的效率较佳,但是可能浪费的硬盘空间较多; 这种状况则比较适合档案容量较大的系统!
11、简单的归纳一下, ext2 有几个特色:
Blocks 与 inodes 在一开始格式化时 (format) 就已经固定了;一个 partition 能够容纳的档案数与 inode 有关;一般来说,每 4Kbytes 的硬盘空间分配一个 inode ;一个 inode 的大小为 128 bytes;Block 为固定大小,目前支持 96 bytes 等;Block 越大,则损耗的硬盘空间也越多。关于单一档案:
若 block size=1024,最大容量为 16GB,若 block size=4096,容量最大为 2TB;关于整个 partition :
若 block size=1024,则容量达 2TB,若 block size=4096,则容量达 32TB。文件名最长达 255 字符,完整文件名长达 4096 字符。
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 ,那么上面的各个部分分别代表什么呢?
SuperBlock:如前所述, Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有:
block 与 inode 的总量;未使用与已使用的 inode / block 数量;一个 block 与一个 inode 的大小;filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。
Group Description:纪录此 block 由由何处开始记录;Block bitmap:此处记录那个 block 有没有被使用;Inode bitmap:此处记录那个 inode 有没有被使用;Inode table:为每个 inode 数据存放区;Data Blocks:为每个 block 数据存放区。
3、如果想要知道某个 ext2/ext3 的文件系统内,关于上述提到的相关信息时,可以使用 dumpe2fs 这个指令来读取,举例来说,鸟哥将我自己的主机 /dev/hda1 读出 ext3 的讯息:
[root@linux ~]# dumpe2fs /dev/hda1
Filesystem volume name:&& /
Filesystem state:&&&&&&&& clean
Errors behavior:&&&&&&&&& Continue
Filesystem OS type:&&&&&& Linux
Inode count:&&&&&&&&&&&&& 1537088
Block count:&&&&&&&&&&&&& 1536207
Free blocks:&&&&&&&&&&&&& 735609
Free inodes:&&&&&&&&&&&&& 1393089
First block:&&&&&&&&&&&&& 0
Block size:&&&&&&&&&&&&&& 4096
Filesystem created:&&&&&& Sat Jun 25 16:21:13 2005
Last mount time:&&&&&&&&& Sat Jul 16 23:45:04 2005
Last write time:&&&&&&&&& Sat Jul 16 23:45:04 2005
Last checked:&&&&&&&&&&&& Sat Jun 25 16:21:13 2005
First inode:&&&&&&&&&&&&& 11
Inode size:&&&&&&&&&&&&&& 128
Journal inode:&&&&&&&&&&& 8
Group 0: (Blocks 0-32767)
& Primary superblock at 0, Group descriptors at 1-1
& Reserved GDT blocks at 2-376
& Block bitmap at 377 (+377), Inode bitmap at 378 (+378)
& Inode table at 379-1400 (+379)
& 0 free blocks, 32424 free inodes, 11 directories
& Free blocks:
& Free inodes: 281-32704
Group 1: (Blocks )
& Backup superblock at 32768, Group descriptors at
& Reserved GDT blocks at
& Block bitmap at 33145 (+377), Inode bitmap at 33146 (+378)
& Inode table at
(+379)
& 18 free blocks, 24394 free inodes, 349 directories
& Free blocks: ,
& Free inodes: , , 4-65408
# 因为数据很多,所以鸟哥略去了一些信息了~上面是比较精简的显示内容。
# 在 Group 0 之前的都是 Superblock 的内容,记录了 inode/block 的总数,
# 还有其他相关的讯息。至于由 Group 0 之后,则是说明各个 bitmap 及 inode table&
# 与 block area 等等。
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、& 举例来说,在鸟哥的&&范例当中,我们将硬盘分割为几大部分, 同时主要将 / 与 /home 设定为两个
partition 的挂载点。假设 / 是接在 /dev/hda1 , 而 /home 是接在 /dev/hda2 上面,那么,也就是说,在 /home 底下的所有次目录,使用的都是 /dev/hda2 那个分割槽的资料呢!而非 /home 的则都是使用 /dev/hda1 的数据!
3、那么来看看系统中如果主要分为 / 与 /home 时,他们对应的 inode 会有什么现象呢?
[root@linux ~]# ls -lid / /home
2 drwxr-xr-x& 26 root root 4096& 7月 21 09:08 /
2 drwxr-xr-x& 42 root root 4096& 7月 14 23:37 /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 所支持喔!常见的支持文件系统有:
传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;日志式文件系统: ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS网络文件系统: NFS / SMBFS
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] [目录或文件名]
-a& :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k& :以 KBytes 的容量显示各文件系统;
-m& :以 MBytes 的容量显示各文件系统;
-h& :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H& :以 M=1000K 取代 M=1024K 的进位方式;
-T& :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i& :不用硬盘容量,而以 inode 的数量来显示
范例一:将系统内所有的 partition 列出来!
[root@linux ~]# df
Filesystem&&&&&&&&&& 1K-blocks&&&&& Used Available Use% Mounted on
/dev/hda1&&&&&&&&&&&&& 5952252&& 3012332&& % /
/dev/shm&&&&&&&&&&&&&&& 192836&&&&&&&& 0&&& 192836&& 0% /dev/shm
/dev/hda5&&&&&&&&&&&&& 9492644&&& 221604&& 8781060&& 3% /home
# 特别注意,在 Linux (FC4) 底下,如果 df 没有加任何参数,
# 那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 Kbytes&
# 的容量来列出来!至于那个 /dev/shm 是与内存有关的挂载,先不要理他!
范例二:将容量结果以易读的容量格式显示出来
[root@linux ~]# df -h
Filesystem&&&&&&&&&&& Size& Used Avail Use% Mounted on
/dev/hda1&&&&&&&&&&&& 5.7G& 2.9G& 2.6G& 54% /
/dev/shm&&&&&&&&&&&&& 189M&&&& 0& 189M&& 0% /dev/shm
/dev/hda5&&&&&&&&&&&& 9.1G& 217M& 8.4G&& 3% /home
# 不同于范例一,这里会以 G/M 等容量格式显示出来,比较容易看啦!
范例三:将系统内的所有特殊文件格式及名称都列出来
[root@linux ~]# df -aT
Filesystem&&& Type&& 1K-blocks&&&&& Used Available Use% Mounted on
/dev/hda1&&&& ext3&&&& 5952252&& 3012332&& % /
/dev/proc&&&& proc&&&&&&&&&& 0&&&&&&&& 0&&&&&&&& 0&& -& /proc
/dev/sys&&&& sysfs&&&&&&&&&& 0&&&&&&&& 0&&&&&&&& 0&& -& /sys
/dev/devpts devpts&&&&&&&&&& 0&&&&&&&& 0&&&&&&&& 0&& -& /dev/pts
/dev/shm&&&& tmpfs&&&&& 192836&&&&&&&& 0&&& 192836&& 0% /dev/shm
/dev/hda5&&&& ext3&&&& 9492644&&& 221604&& 8781060&& 3% /home
none&& binfmt_misc&&&&&&&&&& 0&&&&&&&& 0&&&&&&&& 0&& -& /proc/sys/fs/binfmt_misc
# 看到了吧!系统里面其实还有很多的特殊文件系统在跑得!
# 不过,那些比较特殊的文件系统几乎都是在内存当中,例如 /proc 这个挂载点。
# 因此,这些特殊的文件系统都不会占据硬盘空间喔! ^_^
范例四:将 /etc 底下的可用的磁盘容量以易读的容量格式显示
[root@linux ~]# df -h /etc
Filesystem&&&&&&&&&&& Size& Used Avail Use% Mounted on
/dev/hda1&&&&&&&&&&&& 5.7G& 2.9G& 2.6G& 54% /
# 这个范例比较有趣一点啦,在 df 后面加上目录或者是档案时, df
# 会自动的分析该目录或档案所在的 partition ,并将该 partition 的容量显示出来,
# 所以,您就可以知道某个目录底下还有多少容量可以使用了! ^_^
范例五:将目前各个 partition 当中可用的 inode 数量列出
[root@linux ~]# df -ih&
Filesystem&&&&&&&&&&& Inodes&& IUsed&& IFree IUse% Mounted on
/dev/hda1&&&&&&&&&&&&&& 1.5M&&& 141K&&& 1.4M&& 10% /
/dev/shm&&&&&&&&&&&&&&&& 48K&&&&&& 1&&&& 48K&&& 1% /dev/shm
/dev/hda5&&&&&&&&&&&&&& 2.4M&&&&& 67&&& 2.4M&&& 1% /home
&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 还有可能更大呦!
那么来解释一下上面的数据吧!
Filesystem:代表该文件系统是在那个 partition 啊,所以列出装置名称;1k-blocks:说明底下的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量;Used:顾名思义,就是使用掉的硬盘空间啦!Available:也就是剩下的磁盘空间大小;Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔! (例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)
另外,需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个扇区,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是 Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』的, 所以当然没有占任何的硬盘空间啰!
[root@linux ~]# du [-ahskm] 档案或目录名称
-a& :列出所有的档案与目录容量,因为默认仅统计目录底下的档案量而已。
-h& :以人们较易读的容量格式 (G/M) 显示;
-s& :列出总量而已,而不列出每个各别的目录占用容量;
-k& :以 KBytes 列出容量显示;
-m& :以 MBytes 列出容量显示;
范例一:列出目前目录下的所有档案容量
[root@linux ~]# du
[root@vbird ~]# du
16&&&&& ./.gnome2
16&&&&& ./.ssh
.......中间省略........
# 直接输入 du 没有加任何参数时,则 du 会分析『目前所在目录』
# 的档案与目录所占用的硬盘空间。但是,实际显示时,仅会显示目录容量,
# 但我的 . 目录有很多档案没有被列出来,所以,全部的目录相加不会等于 . 的容量喔!
范例二:同范例一,但是将档案的容量也列出来
[root@linux ~]# du -a
12&&&&& ./install.log.syslog
16&&&&& ./.gnome2
16&&&&& ./.ssh
76&&&&& ./install.log
16&&&&& ./.bash_history
4&&&&&& ./.bashrc
.......中间省略........
# 加上这个 -a 参数后,就会将目录底下的档案也一起列示出来,
# 而不是仅列出档案信息而已!注意啰~ ^_^
范例三:检查根目录底下每个目录所占用的容量
[root@linux ~]# du -sm /*
7&&&&&& /bin
14&&&&& /boot
.......中间省略........
385&&&& /proc
.......中间省略........
1&&&&&& /tmp
2944&&& /usr
79&&&&& /var
# 这是个很常被使用的功能啰~利用通配符 * 来代表每个目录,
# 所以,如果想要检查某个目录下,那个次目录占用最大的容量,就可以用这个方法找出来
# 值得注意的是,如果您刚刚安装好 Linux 时,那么整个系统容量最大的应该是 /usr&
# 那个目录,而 /proc 虽然有列出容量,但是那个容量是在内存中,不占硬盘空间。
在 Windows 底下可以使用档案总管来管理你的磁盘,在 Linux 底下也可以轻易的以 du 来知道目前磁盘的档案容量耶!在默认的情况下,容量的输出是以 KB 来设计的, 如果你想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可啰!而, 如果你只想要知道该目录占了多少容量的话,呵呵,使用 -s 就可以啦!另外, 如同上面的范例三,可以利用通配符 * 来加快你的搜寻喔!
八、连结档的介绍: ln
1、什么是连结档呢?其实连结档有点类似 Windows 底下的『快捷方式』!也就是很多的连结档案( link file )其实都指向同一个来源档案( source file )!不过,在所有的文件类型当中, 连结档算是比较难理解的一部份了!因为连结档还分成 Hard link 与 symbolic link 两种,这两种连结档在架构上是完全不一样的咚咚,底下就来好好的谈一谈先!
Hard 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;不能 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 对于目录暂时还是不支持的啊!
Symbolic 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] 来源文件 目标文件
-s& :如果 ln 不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
-f& :如果 目标文件 存在时,就主动的将目标文件直接移除后再建立!
范例一:将 /etc/passwd 复制到 /tmp 底下,并且观察 inode 与 block
[root@linux ~]# cd /tmp
[root@linux tmp]# cp -a /etc/passwd .
[root@linux tmp]# du - df -i .
26948&& . &== 先注意一下,这里的容量是多少!
Filesystem&&&&&&&&&&& Inodes&& IUsed&& IFree IUse% Mounted on
/dev/hda1&&&&&&&&&&& && 10% /
# 利用 du 与 df 来检查一下目前的参数~那个 du -sb&
# 是计算整个 /tmp 底下有多少 bytes 的容量啦!
范例二:将 /tmp/passwd 制作 hard link 成为 passwd-hd 档案
[root@linux tmp]# ln passwd passwd-hd
[root@linux tmp]# du - df -i .
Filesystem&&&&&&&&&&& Inodes&& IUsed&& IFree IUse% Mounted on
/dev/hda1&&&&&&&&&&& && 10% /
# 仔细看,即使多了一个档案在 /tmp 底下,整个 inode 与 block 的容量并没有改变!
[root@linux tmp]# ls -il passwd*
1242760 -rw-r--r--& 2 root root 1746 Jun 29 01:03 passwd
1242760 -rw-r--r--& 2 root root 1746 Jun 29 01:03 passwd-hd
# 原来是指向同一个 inode 啊!这是个重点啊!另外,那个第二栏的连结数也会增加!
范例三:将 /tmp/passwd 建立一个符号链接
[root@linux tmp]# ln -s passwd passwd-so
[root@linux tmp]# ls -li passwd*
1242760 -rw-r--r--& 2 root root 1746 Jun 29 01:03 passwd
1242760 -rw-r--r--& 2 root root 1746 Jun 29 01:03 passwd-hd
1242806 lrwxrwxrwx& 1 root root&&& 6 Jul 23 20:02 passwd-so -& passwd
# 仔细看喔,这个 passwd-so 指向的 inode number 不同了!这是一个新的档案~
# 这个档案的内容是指向 passwd 的,你可以看到这个档案的大小,是 6bytes ,
# 怎么来的?因为 passwd 共有六个字符啊!哈哈!没错~这个连结档的内容只是填写
# 链接的目标档案文件名而已!所以,你的连结档档名 (有时候含路径) 有多长,档案就多大!
[root@linux tmp]# du - df -i .
Filesystem&&&&&&&&&&& Inodes&& IUsed&& IFree IUse% Mounted on
/dev/hda1&&&&&&&&&&& && 10% /
# 呼呼!整个容量与 inode 使用数都改变啰~确实如此啊!
范例四:删除源文件 passwd ,其他两个档案是否能够开启?
[root@linux tmp]# rm passwd
[root@linux tmp]# cat passwd-hd
......正常显示完毕!
[root@linux tmp]# cat passwd-so
cat: passwd-so: No such file or directory
# 怕了吧?!竟然无法正常的开启这个档案呢~
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 时,基本上会有三个东西,那就是:
/tmp/testing/tmp/testing/./tmp/testing/..
13、而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们建立一个新的目录时, 『新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1 』 不信的话,我们来作个测试看看:
[root@linux ~]# ls -ld /tmp
drwxrwxrwt& 5 root root 4096 Oct 11 05:15 /tmp
[root@linux ~]# mkdir /tmp/testing1
[root@linux ~]# ls -ld /tmp
drwxrwxrwt& 6 root root 4096 Oct 11 13:58 /tmp
[root@linux ~]# ls -ld /tmp/testing1
drwxr-xr-x& 2 root root 4096 Oct 11 13:58 /tmp/testing1
瞧!原本的所谓上层目录 /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] 装置名称
-l& :输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时,
&&&&& 则系统将会把整个系统内能够搜寻到的装置的 partition 均列出来。
范例:查阅您的第一颗硬盘内的相关信息
[root@linux ~]# fdisk /dev/hda& &== 仔细看,不要加上数字喔!
The number of cylinders for this disk is set to 2494.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
&& (e.g., DOS FDISK, OS/2 FDISK)
# 在你进入 fdisk 这支程序的工作画面后,如果您的硬盘太大的话,就会出现如上讯息。
# 这个讯息仅是在告知你,因为某些旧版的软件与操作系统并无法支持大于 1024
# 磁柱 (cylinter) 后的扇区使用,不过我们 Linux 是没问题啦!
Command (m for help): m&& &== 输入 m 后,就会看到底下这些指令介绍
Command action
&& a&& toggle a bootable flag
&& b&& edit bsd disklabel
&& c&& toggle the dos compatibility flag
&& d&& delete a partition
&& l&& list known partition types
&& m&& print this menu
&& n&& add a new partition
&& o&& create a new empty DOS partition table
&& p&& print the partition table
&& q&& quit without saving changes
&& s&& create a new empty Sun disklabel
&& t&& change a partition's system id
&& u&& change display/entry units
&& v&& verify the partition table
&& w&& write table to disk and exit
&& x&& extra functionality (experts only)
# 这里注意一下,使用 fdisk 这支程序是完全不需要背指令的,因为按下 m 之后,
# 立刻就会有一堆指令说明跑出来了!在上面的指令当中,比较重要的有:
# d 删除一个磁盘分区槽、 n 新增一个磁盘分区槽、 p 将目前的磁盘分区槽列出来、
# q 不储存离开!这个重要! w 写入磁盘分区表后离开!这个危险!
Command (m for help): p& &== 这里可以输出目前磁盘的状态
Disk /dev/hda: 20.5 GB,
bytes &== 硬盘的信息在这底下三行
255 heads, 63 sectors/track, 2494 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
/dev/hda1&& *&&&&&&&&&& 1&&&&&&&& 765&&&& 6144831&& 83& Linux
/dev/hda2&&&&&&&&&&&& 766&&&&&&& 1147&&&& 3068415&& 83& Linux
/dev/hda3&&&&&&&&&&& 1148&&&&&&& 1274&&&& ;& 82& Linux swap
/dev/hda4&&&&&&&&&&& 1275&&&&&&& 2494&&&& 9799650&&& 5& Extended
/dev/hda5&&&&&&&&&&& 1275&&&&&&& 2494&&&& ;& 83& Linux
# 由上面的信息,您可以知道,我的硬盘是 20GB 的,而 Head/Sector/Cylinder
# 的数量为 255/63/2494 ,另外,可以看到上头的 Boot 吗?那个地方代表有开机信息的
# partition !另外,那个 start 与 end 则是指每一个 partition 的开始与结束的
# Cylinder 号码!这样可以了解我们前面一直强调的, partition 最小单位为 cylinder
# 此外,上头显示的那个 Id 为主要文件格式的代号,你可以按下 l ( L 的小写 )
# 就可以知道我们 linux 的 fdisk 认识多少文件系统啰! ^_^
# 至于 Blocks 则以 KBytes 来显示该 partition 的容量的
Command (m for help): q
# 想要不储存离开吗?按下 q 就对了!不要随便按 w 啊!
范例:查阅目前系统内的所有 partition 有哪些?
[root@linux ~]# fdisk -l
Disk /dev/hda: 20.5 GB,
255 heads, 63 sectors/track, 2494 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
/dev/hda1&& *&&&&&&&&&& 1&&&&&&&& 765&&&& 6144831&& 83& Linux
/dev/hda2&&&&&&&&&&&& 766&&&&&&& 1147&&&& 3068415&& 83& Linux
/dev/hda3&&&&&&&&&&& 1148&&&&&&& 1274&&&& ;& 82& Linux swap
/dev/hda4&&&&&&&&&&& 1275&&&&&&& 2494&&&& 9799650&&& 5& Extended
/dev/hda5&&&&&&&&&&& 1275&&&&&&& 2494&&&& ;& 83& Linux
Disk /dev/hdb: 30.7 GB,
255 heads, 63 sectors/track, 3736 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
/dev/hdb1&& *&&&&&&&&&& 1&&&&&&& 3633&&& && 83& Linux
# 由于我的这个系统有两颗硬盘,下达 fdisk -l 的话,所有的 partition 都看到了!
# 另外,我可以确定我的 /dev/hdb 还有剩余空间喔!因为由上面的信息看来,
# 我的 /dev/hdb 的磁柱应该可以到 3736 ,但是目前只用到 3633 ,所以,
# 就肯定还有剩余空间拉!等一下我们就用这个来测试啰!
3、还记得我们刚刚在&&里面提到的 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 删除的话,可以怎么做?
fdisk /dev/hdb :先进入 fdisk 画面;p :先看一下扇区的信息,假设要杀掉 /dev/hdb1;d :这个时候会要你选择一个 partition ,就选 1 啰!w (or) q :按 w 可储存到磁盘数据表中,并离开 fdisk ;当然啰, 如果你反悔了,呵呵,直接按下 q 就可以取消刚刚的删除动作了!
[root@linux ~]# fdisk /dev/hdb
(1)、 先看看整个结果是如何~
Command (m for help): p
Disk /dev/hdb: 30.7 GB,
255 heads, 63 sectors/track, 3736 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
/dev/hdb1&& *&&&&&&&&&& 1&&&&&&& 3633&&& && 83& Linux
(2)、按下 d 给他删除吧!
Command (m for help): d
Selected partition 1
# 因为我们这个磁盘仅有 1 个 partition ,所以系统会自动帮我们~
Command (m for help): p
Disk /dev/hdb: 30.7 GB,
255 heads, 63 sectors/track, 3736 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
# 『看』不见了! partition 就这样不见了!
Command (m for help): q
# 鸟哥这里仅是做一个练习而已,所以,按下 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): n
Command action
&& e&& extended
&& p&& primary partition (1-4)
p&& &==就是这里!可以自行决定是 p 还是 e 喔!
Partition number (1-4): 4& &==编号可以随意!
First cylinder (, default 3634):& &==这里按下 Enter 就会使用默认值
Using default value 3634
Last cylinder or +size or +sizeM or +sizeK (, default 3736): +100M
# 这个地方有趣了!我们知道 partition 是由 n1 到 n2 的磁柱 (cylinder),
# 但是我们对于磁柱的大小不容易掌握!这个时候可以填入 +100M 来让系统自动帮我们找出
# 『最接近 100M 的那个 cylinder 号码』!因为不可能刚好等于 100MBytes 啦!
Command (m for help): p
Disk /dev/hdb: 30.7 GB,
255 heads, 63 sectors/track, 3736 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
/dev/hdb1&& *&&&&&&&&&& 1&&&&&&& 3633&&& && 83& Linux
/dev/hdb4&&&&&&&&&&& 3634&&&&&&& 3646&&&&& ;& 83& Linux
# 这个就是刚刚建立起来的 primary partition 啰!再继续吧!
Command (m for help): n
Command action
&& e&& extended
&& p&& primary partition (1-4)
Partition number (1-4): 2
First cylinder (, default 3647): &==这里按下 Enter 就会使用默认值
Using default value 3647
Last cylinder or +size or +sizeM or +sizeK (, default 3736): &==Enter
Using default value 3736
Command (m for help): p
Disk /dev/hdb: 30.7 GB,
255 heads, 63 sectors/track, 3736 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
/dev/hdb1&& *&&&&&&&&&& 1&&&&&&& 3633&&& && 83& Linux
/dev/hdb2&&&&&&&&&&& 3647&&&&&&& 3736&&&&& 722925&&& 5& Extended
/dev/hdb4&&&&&&&&&&& 3634&&&&&&& 3646&&&&& ;& 83& Linux
# 仔细看,我们说过, 1-4 号是磁盘保留的号码,所以这个号码可以随意设定,
# 不一定要由 1 开始呢!但是,等一下做的 logical 就一定是由 5 开始累加了!
Command (m for help): n
Command action
&& l&& logical (5 or over)
&& p&& primary partition (1-4)
l& &== 使用的是 logical 的 partition 喔!
First cylinder (, default 3647):&==Enter
Using default value 3647
Last cylinder or +size or +sizeM or +sizeK (, default 3736):&==Enter
Using default value 3736
Command (m for help): p
Disk /dev/hdb: 30.7 GB,
255 heads, 63 sectors/track, 3736 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
/dev/hdb1&& *&&&&&&&&&& 1&&&&&&& 3633&&& && 83& Linux
/dev/hdb2&&&&&&&&&&& 3647&&&&&&& 3736&&&&& 722925&&& 5& Extended
/dev/hdb4&&&&&&&&&&& 3634&&&&&&& 3646&&&&& ;& 83& Linux
/dev/hdb5&&&&&&&&&&& 3647&&&&&&& 3736&&&&& ;& 83& Linux
# 这可就 OK 啰~虽然新作出三个 partition ,不过仅有 /dev/hdb4 与&
# /dev/hdb5 可以用啊!
Command (m for help): w
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
# 有的时候,磁盘分区表变动之后,得要重新启动,有的则不需要~
# 上面的讯息告诉我们,需要重新启动呢!那就 reboot 吧!
透过上面的例子,您可以清楚的看到,呵呵!第一个 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/ 里头设定完成啰!不过,有的时候您还是得自己设定一下磁盘代码啦!如何设定呢?就使用&这个指令吧!
7、磁盘格式化:
[root@linux ~]# mke2fs [-bicLj] 装置名称
-b& :可以设定每个 block 的大小,目前支持 , 4096 bytes 三种;
-i& :多少容量给予一个 inode 呢?
-c& :检查磁盘错误,仅下达一次 -c 时,会进行快速读取测试;
&&&&& 如果下达两次 -c -c 的话,会测试读写(read-write),会很慢~
-L& :后面可以接表头名称 (Label),这个 label 是有用的喔!后面会讲~
-j& :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3。
范例一:将刚刚建立的 /dev/hdb5 格式化成为 ext3 吧!且名称为 logical
[root@linux ~]# mke2fs -j -L &logical& /dev/hdb5
mke2fs 1.37 (21-Mar-2005)
Filesystem label=logical
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
90432 inodes, 180723 blocks
9036 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=
6 block groups
32768 blocks per group, 32768 fragments per group
15072 inodes per group
Superblock backups stored on blocks:
&&&&&&& 3, 163840
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first.& Use tune2fs -c or -i to override.
# 这样子就能够将我们的系统给他建立起来啰~
范例二:承上题,如果将 block 改为 2048 ,且 inode 改为 4096?
[root@linux ~]# mke2fs -j -L &logical& -b 2048 -i 4096 /dev/hdb5
# 呈现出来的结果大致与范例一相似~不过就是 block 大小与 inode 数量会改变!
这是用来将磁盘格式化成 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 的软盘片呢? 可以有底下这个作法喔!
mkbootdisk (制作软盘开机片)
[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 档案,来建立可开机的磁盘啰~建立软盘开机片一直是个好主意! 他可以在你求助无门的时候给你莫大的帮助喔!所以,建立一个新的软盘开机片是一个好主意啦!
fdformat (进行软盘低阶格式化)
[root@linux ~]# fdformat /dev/fd0H1440
这是用来『低阶格式化』软盘的指令。( 注意:软盘的装置文件为 /dev/fd0 )!在上面的装置档案为 /dev/fd0H1440 , 其中加在 /fd0 之后的 H1440 为表示 1.44MB 的软盘容量! 在低阶格式化之后,还要将软盘的文件格式化为 Linux 的 ext2 之型态,则需要使用&指令!
8、磁盘检验: fsck, badblocks
现在也建立好了新的 partition 了,也 format 好了,那么有没有其他的关于硬盘的工作需要来进行呢? 有的,就是需要怎样来检查硬盘有没有坏轨呢?那个就是 fsck 这个工具的用途啦!此外,您会发现到,在 / 这个目录底下 ( 其实只要有挂载硬盘的那个目录底下都有这个目录 ) 会有一个特殊的目录,就是『 lost+found 』这个目录啦!对的!就是当你处理完 fsck 之后,如果程序有发现到任何的错误的档案,就会将该档案的数据给他丢到这个目录当中,嘿嘿!
所以当你发现你的 Linux 目录当中有这个档案时,不要担心,那个是正常的啦!而且 只有挂载 partition 的目录 (就是挂载点) 才会有这个默认的目录啰!
还有,由于在 Linux 系统当中,为了增加系统效能,通常系统默认就是一些数据会写在内存当中, 并不会直接将数据写入硬盘里面,这是因为内存的速度要比硬盘快上若干倍呀! 但是有个问题就发生了,万一系统由于『跳电』或者是其他的莫名原因,造成系统的 shutdown 时,唉呀!怎么办?!系统就完蛋啦!所以啰,我们需要在某些特定的时候让数据直接回存到硬盘之中呀! 瞭乎!这里提供几个惯用的指令,其中,那个 fsck 是相当重要的,请参考其用法啰!
[root@linux ~]# fsck [-AtCary] 装置名称
-t& :fsck 可以检查好几种不同的 filesystem ,而 fsck 只是一支综合程序而已。
&&&&& 个别的 filesystem 的检验程序都在 /sbin 底下,您可以使用 ls -l /sbin/fsck*
&&&&& 去检查看看,就知道有几种 filesystem 啰。预设的 FC4 情况下,至少有:
&&&&& ext2, ext3, vfat, msdos 等等 filesystem。
-A& :依据 /etc/fstab 的内容,将所有的装置都扫瞄一次 (通常开机过程中就会执行此一指令)
-a& :自动修复检查到的有问题的扇区,所以你不用一直按 y 啰!
-r& :一定要让使用者决定是否需要修复,这与上一个 -a 刚好相反!
-y& :与 -a 类似,但是某些 filesystem 仅支持 -y 这个参数,所以您也可以利用 -y 啦!
-C& :可以在检验的过程当中,使用一个直方图来显示目前的进度!
-f& :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入
&&&&& 细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!
范例一:将前面我们建立的 /dev/hdb5 这个装置给他检验一下!
[root@linux ~]# fsck -C -t ext3 /dev/hdb5&
fsck 1.37 (21-Mar-2005)
e2fsck 1.37 (21-Mar-2005)
logical: clean, 11/181056 files,
# 如果一切没有问题,就会出现上述的讯息~
这是用来检查与修正硬盘错误的指令。注意:通常只有身为 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] 装置名称
-s& :在屏幕上列出进度
-v& :可以在屏幕上看到进度
-w& :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有档}

我要回帖

更多关于 linux创建目录链接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信