1、Linux 磁盘与文件系统管理Linux 磁盘与文件系统管理磁盘分割 ( Partition ):在了解了硬盘的物理组件之后,再接着下来介绍的就是硬盘的分割( Partition )! 为什么要进行硬盘分割?因为我们必须要告诉操作系统: 我这块硬盘可以存取的区域是由 A 磁柱到 B 磁柱,如此一来, 操作系统才能够控制硬盘磁头去 A-B 范围内的磁柱存取数据;这就是磁盘分割( Partition )的重点了: 也就是记录每一个分割区( Partition )的起始与结束磁柱!文件系统:在告知系统我的 partition 所在的起始与结束磁柱之后,再来则是需要将 partition 格式化为我的
2、操作系统认识的文件系统( Filesystem )! 不论是哪一种文件系统 ,数据总是需要储存的!既然硬盘是用来储存数据的,想当然数据就必须写入硬盘!刚刚我们提到硬盘的最小储存单位是 扇区 ,不过数据所储存的最小单位并不是扇区,因为用 扇区 来储存太没有效率了。怎么说呢?因为一个 扇区 只有 512 Bytes ,而磁头是一个一个 扇区 的读取,也就是说,如果我的文件有 10 MBytes ,那么为了读这个文件, 我的磁头必须要进行读取 (I/O) 20480 次! 为了克服这个效率上的困扰,所以就有逻辑区块( Block )的产生了! 逻辑区块是在硬盘分割进行 硬盘的分割的格式化时, 所指定
3、的最小储存单位,这个最小储存单位当然是架构在 扇区 的大小上面( 因为 扇区 为硬盘的最小物理储存单位啊! ),所以, 逻辑区块Block 的大小为 扇区 的 2 的次方倍数。此时,磁头一次可以读取一个 block ,如果假设我们在格式化的时候,指定 一个逻辑区块(Block) 为 4 KBytes ( 亦即由连续的八个 扇区 所构成一个 block ),那么同样一个 10 MBytes 的文件, 磁头要读取的次数则大幅降为 2560 次,这个时候可就大大的增加文件的读取效能! 不过,逻辑区块(Block) 单位的规划并不是越大越好!怎么说呢?因为一个 Block 最多仅能容纳一个文件 (这里
4、指 Linux 的 ext2 文件系统)!这有什么问题呢?举例来说好了,假如您的 Block 规划为 4 KBytes ,而您有一个文件大小为 0.1 KBytes ,这个小文件将占用掉一个 Block 的空间,也就是说,该 Block 虽然可以容纳 4 Kbytes 的容量,然而由于文件只占用了 0.1 Kbytes ,所以,实际上剩下的 3.9 KBytes 是不能再被使用了,所以,在考虑 Block 的规划时,需要同时考虑到: 文件读取的效能 文件大小可能造成的硬盘空间浪费Linux 的 EXT2 文件系统( inode ):inode译成中文就是索引节点,它用来存放档案及目录的基本信息
5、,包含时间、档名、使用者及群组等 在 Linux 系统当中,每个文件不止有文件的内容数据,还包括文件的种种属性,例如:所属群组、 所属使用者、能否执行、文件建立时间、文件特殊属性等等。由于 Linux 操作系统是一个多人多任务的环境,为了要保护每个使用者所拥有数据的隐密性, 所以具有多样化的文件属性是在所难免的!在标准的 ext2 文件系统当中,我们将每个文件的内容分为两个部分来储存,一个是文件的属性,另一个则是文件的内容。为了应付这两个不同的,所以 ext2 规划出 inode 与 Block 来分别储存文件的属性( 放在 节点inode 当中 )与文件的内容( 放置在 Block area
6、 当中 )。当我们要将一个 partition 格式化( format )为 ext2 时,就必须要指定 inode 与 Block 的大小才行,也就是说,当 partition 被格式化为 ext2 的文件系统时,他一定会有 inode table 与 block area 这两个区域。 底下我们分别针对目录与文件来说明: 目录:当我们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 与至少一块 Block 给该目录。其中,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目录下的相关连的文件(或目录)
7、的关连性! 文件:当我们在 Linux 下的 ext2 建立一个一般文件时, ext2 会分配至少一个 inode 与相对于该文件大小的 Block 数量给该文件。例如:假设我的一个 Block 为 4 Kbytes ,而我要建立一个 100 KBytes 的文件,那么 linux 将分配一个 inode 与 25 个 Block 来储存该文件!要注意的是, 节点inode 本身并不纪录文件名,而是记录文件的相关属性,至于文件名则是记录在目录所属的 block 区域! 那么文件与目录的关系又是如何呢?就如同上面的目录提到的,文件的相关连结会记录在目录的 block 数据区域, 所以当我们要读取
8、一个文件的内容时,我们的 Linux 会先由根目录 / 取得该文件的上层目录所在 inode , 再由该目录所记录的文件关连性 (在该目录所属的 block 区域) 取得该文件的 inode , 最后在经由 inode 内提供的 block 指向,而取得最终的文件内容。 挂载点的意义 (mount point):我们上面提到的都是关于文件系统 (filesystem),但是要能够让我们的 Linux 使用的话, 非得挂载 (mount)上我们的 Linux 系统才行,举例来说,我们将硬盘分割为几大部分, 同时主要将 / 与 /home 设定为两个 partition 的挂载点。假设 / 是接在
9、 /dev/hda1 , 而 /home 是接在 /dev/hda2 上面,那么,也就是说,在 /home 底下的所有次目录,使用的都是 /dev/hda2 那个 partition 的资料!而非 /home 的则都是使用 /dev/hda1 的数据! 请注意, 挂载点一定是目录而不是文件! 也就是说,这个挂载点就是进入该 filesystem 的入口!磁盘与目录的容量: 在文字接口底下有什么方法可以查看目前的磁盘最大容量、已经使用掉的容量、 目前所在目录的已使用容量?还有还有,怎么知道目前目录底下使用掉的硬盘容量呢? 以及如何查询目前的 inodes 数目?底下我们就来谈一谈主要的两个指令:
10、 df rootlinux # df -ahikHTm 目录或文件名参数:-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;-k :以 KBytes 的容量显示各文件系统;-m :以 MBytes 的容量显示各文件系统;-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;-H :以 M=1000K 取代 M=1024K 的进位方式;-T :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;-i :不用硬盘容量,而以 inode 的数量来显示范例:范例一:将系统内所有的 partition 列出来!roo
11、tlinux # dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/hda1 5952252 3012332 2632680 54% /dev/shm 192836 0 192836 0% /dev/shm/dev/hda5 9492644 221604 8781060 3% /home# 特别注意,在 Linux (FC4) 底下,如果 df 没有加任何参数,那么预设会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 Kbytes 的容量来列出来!至于那个 /dev/shm 是与内存有关的挂载,先不要理他!范例二
12、:将容量结果以易读的容量格式显示出来rootlinux # df -hFilesystem 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 等容量格式显示出来,比较容易看!范例三:将 /etc 底下的可用的磁盘容量以易读的容量格式显示rootlinux # df -h /etcFilesystem Size Used Avail Use% Mounted on
13、/dev/hda1 5.7G 2.9G 2.6G 54% /# 这个范例比较有趣一点,在 df 后面加上目录或者是文件时, df会自动的分析该目录或文件所在的 partition ,并将该 partition 的容量显示出来, 所以,您就可以知道某个目录底下还有多少容量可以使用了! _范例五:将目前各个 partition 当中可用的 inode 数量列出rootlinux # df -ih Filesystem Inodes IUsed IFree IUse% Mounted on/dev/hda1 1.5M 141K 1.4M 10% /dev/shm 48K 1 48K 1% /dev/
14、shm/dev/hda5 2.4M 67 2.4M 1% /home du rootlinux # du -ahskm 文件或目录名称参数:-a :列出所有的文件与目录容量,因为预设仅统计目录底下的文件量而已。-h :以人们较易读的容量格式 (G/M) 显示;-s :列出总量而已,而不列出每个各别的目录占用容量;-k :以 KBytes 列出容量显示;-m :以 MBytes 列出容量显示;范例:范例一:列出目前目录下的所有文件容量rootlinux # durootvbird # du16 ./.gnome216 ./.ssh.中间省略.292 . # 直接输入 du 没有加任何参数时,则
15、du 会分析目前所在目录 的文件与目录所占用的硬盘空间。但是,实际显示时,仅会显示目录容量,但我的 . 目录有很多文件没有被列出来,所以,全部的目录相加不会等于 . 的容量!范例二:同范例一,但是将文件的容量也列出来rootlinux # du -a12 ./install.log.syslog16 ./.gnome216 ./.ssh76 ./install.log16 ./.bash_history4 ./.bashrc.中间省略.292 .# 加上这个 -a 参数后,就会将目录底下的文件也一起列示出来,# 而不是仅列出文件信息而已!注意 _磁盘分割: fdiskrootlinux # f
16、disk -l 装置名称参数:-l :输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的 partition 均列出来。范例:范例:查阅您的第一颗硬盘内的相关信息rootlinux # 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
17、 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 he
18、lp): 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 s
19、aving changes s create a new empty Sun disklabel t change a partitions 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 新增
20、一个磁盘分割槽、 p 将目前的磁盘分割槽列出来、q 不储存离开!这个重要! w 写入磁盘分割表后离开!这个危险!Command (m for help): p = 这里可以输出目前磁盘的状态Disk /dev/hda: 20.5 GB, 20520493056 bytes = 硬盘的信息在这底下三行255 heads(磁面), 63 扇区s/track, 2494 cylinders(磁柱)Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/hda1 * 1 76
21、5 6144831 83 Linux/dev/hda2 766 1147 3068415 83 Linux/dev/hda3 1148 1274 1020127+ 82 Linux swap/dev/hda4 1275 2494 9799650 5 Extended/dev/hda5 1275 2494 9799618+ 83 Linux# 由上面的信息,您可以知道,我的硬盘是 20GB 的,而 Head/扇区/Cylinder# 的数量为 255/63/2494 ,另外,可以看到上头的 Boot 吗?那个地方代表有开机信息的partition !另外,那个 start 与 end 则是指每一
22、个 partition 的开始与结束的Cylinder (磁柱)号码! # 此外,上头显示的那个 Id 为主要文件格式的代号,你可以按下 l ( L 的小写 ) 就可以知道我们 linux 的 fdisk 认识多少文件系统!至于 Blocks 则以 KBytes 来显示该 partition 的容量的Command (m for help): q# 想要不储存离开吗?按下 q 就对了!不要随便按 w 啊!范例:查阅目前系统内的所有 partition 有哪些?rootlinux # fdisk -lDisk /dev/hda: 20.5 GB, 20520493056 bytes255 hea
23、ds, 63 扇区s/track, 2494 cylindersUnits = 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 1020127+ 82 Linux swap/dev/hda4 1275 2494 9799650 5 Extended/dev/hda5 1275 2494 9799618+ 83
24、LinuxDisk /dev/hdb: 30.7 GB, 30735581184 bytes255 heads, 63 扇区s/track, 3736 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/hdb1 * 1 3633 29182041 83 Linux# 由于我的这个系统有两颗硬盘,下达 fdisk -l 的话,所有的 partition 都看到了!另外,我可以确定我的 /dev/hdb 还有剩余空间!因为由上面的信息看来,# 我的
25、 /dev/hdb 的磁柱应该可以到 3736 ,但是目前只用到 3633 ,所以,# 就肯定还有剩余空间拉!等一下我们就用这个来测试!这个 fdisk 只有 root 才能执行,我们知道可以利用 fdisk 来查阅硬盘的 partition 信息外,底下再来说一说进入 fdisk 之后的几个常做的工作!Tips:你可以使用 fdisk 在您的硬盘上面胡搞瞎搞的进行实际操作,都不打紧, 但是请万记住,不要按下 w 即可!离开的时候按下 q 就万事无妨! 删除磁盘分割槽 刚刚的 fdisk 结果当中,我知道我的 /dev/hdb 仅有 /dev/hdb1 而已, 那么假设我要将这个 /dev/h
26、db1 删除的话,可以怎么做? 1. fdisk /dev/hdb :先进入 fdisk 画面; 2. p :先看一下扇区的信息,假设要杀掉 /dev/hdb1; 3. d :这个时候会要你选择一个 partition ,就选 1 ! 4. w (or) q :按 w 可储存到磁盘数据表中,并离开 fdisk ;当然, 如果你反悔了,呵呵,直接按下 q 就可以取消刚刚的删除动作了!rootlinux # fdisk /dev/hdb1. 先看看整个结果是如何Command (m for help): pDisk /dev/hdb: 30.7 GB, 30735581184 bytes255 h
27、eads, 63 扇区s/track, 3736 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/hdb1 * 1 3633 29182041 83 Linux2. 按下 d 给他删除吧!Command (m for help): dSelected partition 1# 因为我们这个磁盘仅有 1 个 partition ,所以系统会自动帮我们Command (m for help): pDisk /dev/hdb: 30.7 GB, 3
28、0735581184 bytes255 heads, 63 扇区s/track, 3736 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System# 看不见了! partition 就这样不见了!Command (m for help): q# 这里仅是做一个练习而已,所以,按下 q 就能够离开 新增磁盘分割槽 那么如何新增 partition 呢?以刚刚的 /dev/hdb 为例, 我的 /dev/hdb 有一个 /dev/hdb1 ,而且还有剩余空间,那
29、我如何利用? 1. fdisk /dev/hdb :先进入 fdisk 画面中; 2. n:新增一个扇区,这个时候系统会问你, 如果您已经具有 extended (扩展分区)扇区时,那么系统会问您,您要新增的是 Primary (主分区)还是 Logical(逻辑分区) ,而如果您还没有 extended ,那么系统仅会问你要新增 (主分区)Primary 还是 (扩展分区)Extended。除此之外,如果您已经用完了四个 P主 + E扩 的话,那么就仅有(逻辑分区) Logical 可以选择!如果是选择 primary 的话,请按 p ,否则请按 e (extended) 或 l (logi
30、cal)。 3. p :由于选 择为 primary 所以就会按下 p ! 4. 1-4 :primary 只允许四个, 所以这里请按尚未被使用的那一个扇区! 5. w :同样的储存离开!好了,假设想要将我刚刚的 /dev/hdb 剩余空间分为两个分割槽, 一个是 primary ,另一个则是 logical ,且 primary 只要 100MBytes 就够了! 其它的都分给 logical ,那可以这么做!rootlinux # fdisk /dev/hdbCommand (m for help): nCommand action e extended p primary partiti
31、on (1-4)p =就是这里!可以自行决定是 p 还是 e !Partition number (1-4): 4 =编号可以随意!First cylinder (3634-3736, default 3634): =这里按下 Enter 就会使用默认值Using default value 3634Last cylinder or +size or +sizeM or +sizeK (3634-3736, default 3736): +100M# 这个地方有趣了!我们知道 partition 是由 n1 到 n2 的磁柱 (cylinder),# 但是我们对于磁柱的大小不容易掌握!这个时候可以填入 +100M 来让系统自动帮我们找出# 最接近 100M 的那个 (磁柱)cylinder 号码!因为不可能刚好等于 100MBytes !Comman
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1