linux 文件系统的管理 (硬盘) 工作原理
一、系统在初始化时如何识别硬盘
1、系统初始时根据MBR的信息来识别硬盘,其中包括了一些执行文件就来载入系统,这些执行文件就是MBR里前面446bytes里的boot loader 程式,而后面的16X4的空间就是存储分区表信息的位置;如下图
2、在分区表中,主要储存了以下信息:
(1)分区号,常见的分区号有以下几种:其它编号可以使用fdisk指令,再执行 l (小写L) 查看
0x5 (or 0xf) | 扩展分区 |
0x82 | Linux swap |
0x83 | Linux |
0x8e | Linux LVM |
0xfd | Linux RAID auto |
(2)分区的起始磁柱;
(3)磁柱的总数;
所以在系统初始化时,就根据分区表中的这三项信息来识别硬盘。
二、介绍硬盘分区的相关事项
1、当主分区都用完时,可以使用扩展分区来增加额外的分区,这已在前面介绍过了,但是在Linux的kernel里:
·IDE的硬盘最多可以支持到16个分区;
·SCSI硬盘最多支持15个分区;
2、硬盘做多分区的好处:如下:
(1)从控制方面的考虑
将硬盘分成多个分区,就可以把应用程序、使用者的资料、或是一些需要有安全性的资料,分别放入不同分区中方便管理;
(2)从效率方面的考虑
因为硬盘在使用一段时间后,都分有区块不连续的情况,如果一块大容量的硬盘没有划分成多个小分区,那么硬盘在搜索信息时,因为搜索的范围非常大,所以会比较久,如果将大容量的硬盘划分多个小分区,在搜索的时候相对就会快一些;
(3)为为使用磁盘配额的功能
因为配额只能对分区做设定,所以我们可以将/home目录单独做一个分区,然后可以对这个分区做配额;
(4)从资料备份和恢复考虑
例如,/home这个目录是专门用于存放用户信息的目录,将这个目录单独设定一个分区,就可以定期就是个分区作备份工作,恢复的时候也比较方便。
三、介绍分区的管理
1、可以使用下面的指令来建立分区及查看分区
fdisk /dev/hda 建立分区
参数:-l 查看分区
执行 fdisk 指令后,如下图:
例1:在新建分区 ,输入n,系统会要求输入起始的磁柱编号,默认系统会指定一个最近的未使用的磁柱号,回车后,再输入结束的磁柱号,不过根据磁柱号来算一个分区的容量不太方便,可以用“+数值K或+数值M (例:+1000M)” 这样直接以容量的表示方式来设定,这样直观一些;再执行p,就可以看到新增加的分区了;
例2:删除分区 ,输入d,要求输入要删除的分区号,在DEVICE字段列可以看到每个分区对应的编号,输入想要删除的分区号回车即可
以前所有操作认为没有问题,输入 w ,保存退出即可。
这时主机屏幕上会提示:
The kernel still uses old table 表示目前系统还是在使用旧的分区表;
The new table will be used at the next reboot. 表示只有在下次重新开机后才会使用新的分区表;
2、使用下面的指令重新载入分区表到kernel中,这样可以不用重新开机就可以启用新的分区表。
partprobe
四、建立文件系统(对硬盘分区进行格式化)
1、格式化指令及指令语法:
mke2fs [参数] 要格式化的分区
例如上面的例子中,格式化hda6这个分区 mke2fs /dev/hda6
2、格式化后,会出现一些分区的相关信息,为了理解这些信息,先了解一下分区的格式:
我们使用fdisk建立的分区,不能直接用来存放资料,必须先对这个分区做格式化的工作,格式化就是将分区划分成一格一格的block及多少个Inode可以使用,而每个block就是文件系统存取资料的最小单位,所以才可以将资料存放在这些block中,而且每多个 block 会组成一个 group;如下图所示:除了boot sector 之外,第一个block 称为 super block 用来记录这个分区共有多少个block和inode 已经使用;多少block和inode等信息;
如下图所示:
13 block groups :表示这个分区被划分出了13个block group;
8192 blocks per group:表示每个group中有8192个block;
2008 inodes per group:表示每个group中有8192个inodes;
如果super block 损坏,这个分区将无法访问,所以每隔一段block 就会备份一次这个super block,如下图:
superblock backups stored on block:下面的数值就是备份super block 所在的block的位置。
3、dumpe2fs 指令查看分区的详细信息
dumpe2fs /dev/hda6 | more 查看指定分区的信息(前一页半是super block的内容,后面是每个Group的详细信息),因为所显示的内容很多所以加上了 | more 用于分页显示;
显示信息的部分说明:
Inode count: Inode的总数量;
Block count: Block的总数量;
Free blocks: 剩余的block数量;
Fre inodes: 剩余的Inode数量;
Filesystem features: has_journal表是为ext3文件系统
4、mke2fs格式化指令格式及参数
格式:mke2fs [参数] 要格式化的分区文件名(例:/dev/hda6)
mke2fs -j /dev/hda6
参数:
·b:设定每个block的大小,预设为1024bytes(1K),最大4096bytes(4K),如果设定太大将使用4096bytes;
·c:格式化前检查分区中是否有损坏的block;
·i :设定每个Inode的大小,例:mke2fs –i 4096 /dev/hda6
·N:直接设定Inode 的总数量;所设置的值只是接近而矣;
·m:设定在分区上,保留多少空间给root,预设保留5%;mke2fs –m 10 /dev/hda6
·L:设定分区卷标,预设不设定,通常习惯将卷标名称设为同挂载点目录名称相同方便记忆;mke2fs –L data /dev/hda6
·j:建立成为ext3文件系统,也就是加入日志功能;
五、介绍将ext2格式的分区转成ext3
1、ext2与ext3的区别如下:
(1)ext2和ext3的格式完全相同,只是在ext3硬盘最后面有一部分空间用来存放Journal(日志)的记录;
(2)在ext2中,写资料到硬盘中时,先将资料写入缓存中,当缓存写满时才会写入硬盘中;
(3)在ext3中,写资料到硬盘中时,先将资料写入缓存中,鼗缓存写满时系统先通知Journal,再将资料写入硬盘,完成后再通知Journal,资料已完成写入工作;
(4)是否有Journal的差别:
在ext2中,系统开机时会去检查有效位(Valid bit),如果值为1,表示系统上次有正常关机;如果为0,表示上次关机未正常关机,那系统就会从头检查硬盘中的资料,这样时间会很长;
在ext3中,也就是有Journal机制里,系统开机时检查Journal的资料,来查看是否有错误产生,这样就快了很多;
(5)tune2fs –j /dev/hda6 将ext2转换成ext3
2、在ext3里有三个Journal的模式:
(1)ordered:预设模式,只记录Inode-table里的信息;
(2)Journaled:记录资料本身的信息,需要大量空间来做记录;
(3)writeback:不记录信息,可提供较好的效能;
六、介绍在分区里设定相应的卷标
1、前面分区的表示法一直在使用 hda1 或 sda1类似这样的表示法,其实也可以用卷标的表示法,这样更好便记忆。
2、设定及查看卷标的指令格式及说明如下:
e2label 指令:
例:e2label /dev/hda6 查看hda6分区的卷标名称;如为空白表示未设定卷标;
e2label /dev/hda6 data 设定这个分区的卷标为 data;
注:在这里先不要修改hda1~hda5的卷标,可能会造成无法开机,以后再做说明。
七、介绍mount指令挂载分区
1、挂载的概念:当要使用某个设备时,例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才可以读取这些设备,而这些对应的动作就是“挂载”。
mount的详细说明将在下一小节介绍
示例如下图:
下面以卷标的方式进行挂载,注意:使用卷标挂载进必须加上 –L 的参数表示使用卷标挂载
八、介绍mount指令及参数
1、mount 指令格式:
mount [-t 文件系统类型] [-o 参数] 设备名或卷标 挂载点目录名
注:如果使用卷标方式挂载,必须使用 –L 参数。
(1)-t 后面设定所要挂载的文件系统的类型,例如:vfat、ext2、ext3、iso9660(光盘),通常这部分不需要加kernel可以自己判断
(2)-o 后面加一些设定参数:
· suid:允许挂载后的文件系统可以使用suid、sgid的特殊权限;
· dev:允许挂载的文件系统建立设备文件,例如:/dev/hda6 下的 hda6 就是设备文件;
· exec:允许挂载文件系统后,可以执行里面的执行文件;
· noexec:不允许执行文件;
· auto:在电脑开机后自动挂载这个文件系统;
· nouser:指只允许super user (也就是root)挂载这个文件系统;
· async:设为不同步,就是电脑写入资料时先写入缓存再写到硬盘中;
· loop:用来挂载loopback设备,例如光盘机就是loopback设备;
· ro:挂载文件系统后设定为只读;
· rw:挂载文件系统后设定为可读可写;
· remount :重新挂载文件系统;
如果在挂载ext2或ext3时,预设会使用下面的参数设定:
rw,suid,dev,exec,nouser,async
九、介绍卸载文件系统
1、使用mount指令查看已挂载了哪些文件系统;
卸载指令及格式如下:
umount 设备文件名或挂载点
例如:上图中已挂载到/data目录的上设备,可以使用 umount /dev/hda6 或 umount /data 进行卸载
2、如果文件系统正在使用中,就无法正常卸载,可以使用下面的指令查看并停止所有对这个文件系统的操作,然后再进行卸载操作;
fuser -v 设备文件名或挂载点 查看有哪个服务或使用者正在对这个文件系统做操作;
fuser –km 设备文件名或挂载点 强制停止所有对这个文件系统的所有操作;
3、可以使用 remount 这个参数来改变文件系统的状态;
例如:mount –o remount,ro /data 重新挂载文件系统为只读,这样就不用先卸载再挂载了。
十、介绍一些挂载的范例
1、挂载一个不允许执行的文件系统
mount –o noexec /dev/hda6 /data noexec表示为不允许执行;
2、挂载一个文件系统的镜像文件
mount –t iso9660 -o ro,loop boot.iso /iso 加loop参数是因为光盘是loopback设备,boot.iso为镜像文件名 ,/iso 为挂载点;
十一、介绍挂载网络上的共享资源
1、在Unix 和Linux的网络资源主要分为两种 NFS (Network File System)和SMB
·NFS:Linux/Unix和Unix/Linux之间用来共享资源的;
·SMB:Linux/Unix和Microsoft(windows)之间用来共享资源的;
2、共享NFS网络资源的主机称为:NFS Server;
共享SMB网络资源折主机称为:Samba Server;
3、这些网络资源的连接方式:
(1)NFS部分的连接方式:
showmount –e IP地址 #查看共享资源
mount ip地址:/共享目录 /挂载点 #挂载网络资源
(2)SMB部分的连接方式:
smbclient –L ip地址 -N #查看指定Samba Server 上有哪些共享目录;
mount //IP地址/共享目录 /挂载点 -o username=用户名%密码 #挂载windows网络共享资源;
十二、介绍/etc/fstab 文件的功能
1、fstab文件的功能就是根据fstab文件中设定的内容自动挂载设备到指定的挂载点上;
2、下面就介绍fstab这个文件内容的详细说明:
如下图:fstab文件内容共分为6个栏位
下面对上图中6个栏位分别说明:
(1)设备名 :可以用“LABEL=”卷标表示法,也可以使用设备名称表示法“/dev/hda6”;
(2)挂载点 :挂载点目录必须是已存在的目录;
(3)文件系统类型 :例如ext3,ext2等;
(4)挂载参数 :就是前面mount指令中 –o 后面的参数,defaults代表使用预设参数设定;例如如/dev/hdc(光盘)和/dev/fd0(软盘)的这两行设定,exec可以执行文件,noauto 不会自动挂载,
(5)备份 :设定备份次数,0表示不备份,1表示每天做一次备份,2表示每两天做一次备份;
(6)检查顺序 :设定文件系统的检查顺序,0表示不检查,1表示第一个检查,2表示第二个检查,以此类推检查顺序最多到9,如果值相同,按从上到下的顺序检查,通常根目录的检查顺序排在第一位;
所以如果要在电脑开机后自动挂载文件系统就可以修改fstab这个文件的设定。
例如:可以将前面挂载的hda6写入这个文件中,当开机后自动挂载,设定方法如下,使用VI编辑fstab文件将下面的一行设定加入到最后一行即可:
/dev/hda6 /data ext3 defaults 0 0
2、在挂载光盘或软盘时,只需要执行 mount /media/cdrom 或 mount /media/floppy 就可以了,而不用指定要挂载的设备,这是因为在fstab文件中有所设定,因为在挂载目录和设备时,如果未指定要挂载的设备,电脑会先到fstab文件中查看,有没有相对应的设备及目录挂载,如果没有还会到mtab文件(其实mtab文件就是目前系统的挂载设定,所以在卸载时也查看这个mtab文件,卸载时也就只需要指定挂载点或设备就可以了)中查看。
十三、介绍auto-mounter自动挂载程序在使用网络共享时自动挂载网络共享资源
1、automounter是一个daemon程式,automounters可以监控某个目录,例如:监控/mnt/nfs目录,当我们需要存取这个目录时,使用cd /mnt/nfs 进入这个目录时,这时automounter程式发现使用者要存取这个目录时,就会按照设定自动将网络共享资源自动进行挂载,如果过一段时间(预设60秒)不使用也会自动卸载这个目录,这样可以减少对网络产生的负荷,使用网络的利用率更高。
2、automounter的设定,以实例说明,仅供参考:
(1)vi /etc/auto.master 编辑automount主要的设定文件
(2)复制有--timeout=60那一行到下面,修改如下图:
(3)建立auto.nfs设定文件,预设/etc目录下没有这个文件,需要自己建立;
可以由 auto.misc 做为模板复制得来,并重命名为auto.nfs,编辑auto.nfs修改如下:
(4)service autofs start 启动automount服务,如果已经启动可执行service autofs restart 或 service autofs reload重新启动或重新加载配置文件;
(5)使用cd /mnt/nfs 目录,再执行ls 指令没有未何文件,
使用 cd server1 却可以进入,这时已经进行自动挂载了,这时就可以查看NFS服务器上的共享文件了。
使用mount可以查看到刚刚挂载上来的NFS网络共享目录。
注:我这里还未建立NFS文件服务器,所以这里只能做客户端的设定,现在还无法试测;
十四、介绍在ext2和ext3文件系统里有哪些属性可以设定
1、在ext2和ext3的文件系统里,都支持一些特殊的属性来控制文件的特性:
·lsattr 指令:显示文件的属性设定;
·chattr 指令:设定文件的属性;
格式:
chattr +|-|=属性[属性…] 文件名[文件名…]
+ :增加属性
- :去除属性
=:设定属性
可以设定一个或多个属性
常见属性说明如下:
·A:当文件被修改时,atime(存取时间)记录不会被修改;
·a:让文件只可以附加内容,不允许原来的内容被覆盖掉;
·d:让系统在使用dump指令做备份时,可以不用备份这个文件;
·i:让文件永远不改变,不能删除或更改文件名;
·j:让系统将文件本身的信息记录在ext3的日志里,就算ext3的文件系统是挂载成ordered(有序)或writeback模式,都会将文件本身的信息记录在ext3的日志里。
·S:当文件被修改时,就做同步的动作,立刻将资料写入硬盘中;
例:
chattr +a test 添加只允许附加内容的属性
chattr = test 去除掉所有的属性
十五、介绍如何使用划分好的分区或文件来当作虚拟内存(swap)
1、在Linux系统中虚拟内存称为:SWAP;
2、SWAP分为两种类型:
·用划分好的分区作为SWAP;
·用文件当作SWAP;
3、要建立SWAP的虚拟内存主要有以下几个基本设定:
(1)建立SWAP的分区或是文件,并且在建立SWAP的分区时分区的编号要设定为82;
(2)使用mkswap指令对swap分区或是swap文件写入一个特定的SWAP识别标志;
(3)必须要在/etc/fstab文件中加入适当的记录,这样才能让系统在开机后能够自动挂载SWAP;
(4)如果是SWAP的分区,要使用 swapon –a 指令启用SWAP,其实 swapon –a 指令会去读取 fstab 文件,并根据 fstab 里的记录,来启用所有的 swap 分区;
(5)如果是使用SWAP文件,则使用 swapon 指令再指定要启用哪个SWAP文件;
(6)可以使用 swapon –s 来检查SWAP的使用情况;
范例1如下:
(1)使用分区作为SWAP
·fdisk /dev/hda
·输入n;新建一个分区,如果一直以前面的例子做下来,硬盘应该还有剩余空间的,这里创建一个100M的分区;
·输入t;再输入7(我这里新建的分区是hda7,可以输入p查看到);再输入 82 (82表示设定为swap分区类型);
·再输入p;可以查看到 hda7 的system(系统)已经变为Linux swap
·wq:保存退出;
·执行“partprobe ”指令,让kernel重新读取分区表;
(2)mkswap /dev/hda7 对SWAP分区或是SWAP文件写入特定的标志;类似于格式化成虚拟内存的格式;
(3)编辑/etc/fstab文件添加记录,这样一会的swapon指令才可以在fstab文件中找到相应的分区,在下次开机时也可以找到新的SWAP分区的位置;复制原来的SWAP那行记录,将原来的卷标表示法修改为/dev/hda7的设备表示法,其它保持不变;
(4)swapon –a 指令,根据fstab文件启动所有SWAP分区;为了验证可以先使用 swapon –s 指令查看当前SWAP的状态;
范例2如下:使用文件当虚拟内存这和windows下的虚拟内存使用方式非常相似
(1)建立SWAP文件,这里建立的是100M的SWAP文件
指令:dd if=/dev/zero of=/swapfile bs=1M count=100
说明:dd:转换并复制文件;
if:是inputfile的缩写,if=/dev/zero 代表要把zero文件当作输入的文件,zero文件可以是当作都是零的文件;
of:是outputfile的缩写,of=/swapfile 代表要输入到/swapfile文件上;
bs:是block size的缩写,表示强制设定swapfile的block的大小;
count:代表要建立多少个block;
(2)mkswap /swaplife 为swapfile文件写入一个swap的标志,相当于格式化成虚似内存的格式;设定成功将会出现提信息;
(3)修改 /etc/fstab文件,方式同上一范例相同,只是把 /dev/hda7改写成 /swapfile ,其它不变;
(4)swapon –a 启用swap文件
在启用前也可以用 swapon –s 查看,等启用后再次查看SWAP是否加载进来了。
十六、介绍一些维护文件系统的工具及一些重要的相关事项
1、如果文件系统的文件有丢失或毁损,可以使用fsck指令来维护文件系统的一致性:
检查某个分区前,分区必须处于未挂载状态,如正在使用中,必须先进行卸载,再执行检查工作;
格式: fsck -Y /dev/hda6 -Y参说表示中途提示问题都回答Yes;
2、系统在开机时就会检查文件有没有丢失或损坏的,系统是根据/etc/fstab文件中最后一栏的设定来决定检查的先后顺序的,这个栏位前面已做过介绍;
3、如果检查出有问题文件,就会先放到 lost+found 目录中当作备分;所以当一个分区挂载成功后都会发现有这个目录存在;
4、电脑在开机时,发生严重错误,系统会用sulogin的方式启动,下图例中我将fstab文件中根目录的卷标随意的修改了一下,重新启动后将会出现严重错误,就停在了下图图的位置:
5、将ext2文件系统转成ext3文件系统,指令下如:
tune2fs -j /dev/hda6 将hda6分区转成ext3文件系统,转换成功后将有提示信息;这样原有分区内的资料将不会丢失;
6、查看文件系统目前的状态信息
dumpe2fs -h /dev/hda6 显示hda6的分区信息,这个指令前面已介绍过;
-h 可以显示superblock的信息
十七、如何加入一块新硬盘
1、第一步当然是要将硬盘接在电脑上啦;
2、进入系统后,使用fdisk对硬盘进行分区,并设定好分区类型编号;例如:linux 为 83
3、建立好分区后,执行 patrprobe 重新载入分区,使用最新分区表;
4、建立完分区后,格式化分区,如果建立的是SWAP分区,需要为这个SWAP分区写入一个SWAP标志;
5、如果要使用卷标表示法,需要为分区创建卷标名称;
6、建立新的挂载点,并将分区挂载上;
7、在/etc/fstab文件中加入新分区的记录,让电脑以后可以自动挂载这个新建的分区;