linux磁盘与文件管理系统
1.认识linux系统
1.1 磁盘组成与分区的复习
首先了解磁盘的物理组成,主要有:
圆形的碟片(主要记录数据的部分)。
机械手臂,与在机械手臂上的磁头(可擦写碟片上的内容)。
主轴马达,可以转动碟片,让机械手臂的磁头在碟片上读写数据。
数据存储与读取的重点在于碟片,而碟片上的物理组成为:
扇区切最小的物理存储单位,且根据磁盘设计的不同,目前有512B和4KB两种格式。
将扇区组成一个圆,就是柱面。
早期分区主要以柱面作为最小的分区单位,现在的分区通常使用扇形作为最小分区单位(每个扇区都有其号码,就好像座位一样)。
磁盘分区主要有两种格式,一种是限制较多的MBR分区表,一种是较新且限制较少的GPT分区表;
MBR分区表中,第一个扇区最为重要,里面有:主引导记录,及分区表,其中MBR占有446B,而分区表则占有64B。
GPT分区表除了分区数量扩充较多之外,支持的磁盘空间也可以超过2TB。
基本上所有物理磁盘的文件都被模拟成/dev/sd[a-p]的格式,第一块磁盘名为/dev/sda,分区的文件名以第一块磁盘为例,为/dev/sda[1-28],除物理磁盘下,虚拟机的磁盘通常为/dev/vd[a-p]的格式。如果有使用到软件磁盘阵列的话,还有/dev/md[0-128]的磁盘文件名。使用LVM时,文件名则为/dev/VGANE/LVNAME。我们这里主要学习物理磁盘和虚拟磁盘。
/dev/sd[a-p][1-128]:为物理磁盘的文件名。
/dev/vd[a-d][1-128]:为虚拟磁盘的文件名。
1.2 文件系统特性
在磁盘分区完毕后,还需要进行格式化,之后操作系统才能使用这个文件系统。
这是因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需数据,因此就需要将分区进行格式化,已成为操作系统能够利用的文件系统格式。
通常我们称一个可被挂载的数据为一个文件系统而不是一个分区。
在操作系统的文件中,除了实际内容外,还有很多属性,如Linux操作系统的文件权限(rwx)与文件属性(拥有者,用户组,时间参数等)。文件系统通常会将这两部分的数据分别存放在不同的区块,权限与属性放置到inode中,至于实际数据则放置到数据区块中。此外,还有一个超级区块(superblock)会记录整个文件系统的整体信息,包括inode与数据区块的总量,使用量,剩余量等
每个inode与区块都有编号,至于这三个数据的意义简略说明如下:
超级区块 :记录此文件系统的整体信息,包括inode与数据区块的总量,使用量,剩余量,以及文件系统的格式与相关信息等。
inode :记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码。
数据区块 :实际记录文件的内容,如果文件太大,会占用多个区块。
每个inode与数据区块都有编号,每个文件都占用一个inode,inode内有文件数据放置的区块号码。因此找到了文件的inode,就找到了文件数据区块的号码,就能读出文件的实际数据。
这种数据存取方式称为索引式文件系统。
还有其他常用的文件系统,比如U盘使用的FAT格式的文件系统,
因为这种文件系统中没有inode存在,如果一个文件数据写入的区块太松散,需要读取磁盘好几次才能完整读取这个文件。
所谓碎片整理,就是因为文件写入的区块太过于离散,文件读取的性能会变的很差,需要通过碎片整理将同一个文件所属的区块都集合到一起,这样数据的读取会比较容易。
1.3 Linux的ext2文件系统(inode)
标准的ext2文件系统就是这种含有inode,数据区块,超级区块等,以inode为基础的Linux文件系统。
文件系统一开始就将inode和数据区块规划好了,除非重新格式化(或利用resize2fs等命令修改其大小),否则inode与数据区块固定后就不再变动了。
当文件系统有数百GB,再将所有inode和数据区块都放在一起就很不易管理了。
因此,ext2文件系统格式化时基本上是区分成多个区块群组(block group),每个区块都有独自的inode,数据区块,超级区块系统。
在ext2文件系统中,最前面有一个启动扇区,这个启动扇区可以安装启动引导程序。
每一个区块群组的六个内容如下:
数据区块(data block)
数据区块是用来放置文件数据的地方,在ext2文件系统中所支持的区块大小有1K,2K及4K三种。格式化是区块大小就被固定了,且每个区块都有编号。而区块大小也会产生差异:
| Block 大小 | 1 KB | 2 KB | 4 KB |
|---|---|---|---|
| 最大单一文件大小 | 16 GB | 256 GB | 2 TB |
| 最大文件系统总容量 | 2 TB | 8 TB | 16 TB |
ext2文件系统还有一些限制:
原则上,区块的大小和数量在格式化完成后就不能再修改(除非重新格式化)。
每个区块内最多只能放置一个文件的数据。
承上,如果文件大于区块的大小,则一个文件会占用多个区块数量。
承上,如果文件小于区块,则该区块的剩余容量就不能够再被使用了(磁盘空间被浪费了)。
由于这些限制,当小文件较多时,而区块较大,例如区块为4KB,而小文件仅为50B,那么每个区块都将浪费4046B的空间。
那么将区块设置为1KB呢?这样但文件会占用很多区块,而每个区块的inode都需要被记录,造成读写性能不佳。
inode table(inode表)
基本上,inode记录文件的属性及文件数据放置区块的编号,至少有下面的:
该文件的读写属性(read,write,excute)。
该文件的拥有者与用户组(owner,group)。
该文件的大小。
该文件建立或状态改变的时间(ctime)。
最近一次的读取时间(atime)。
最近修改的时间(mtime)。
定义文件特性的标识(flag),如SetUID。
该文件真正内容的指向(pointer)。
inode的数量与大小也是在格式化时就已经固定了,除此之外还有一些特点:
每个inode大小均固定为128B(新的ext4与xfs可设置到256B);
每个文件都仅会占用一个inode而已。
承上,因此文件系统能够建立的文件数量与inode的数量有关。
系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能读取区块的内容。
Superblock(超级区块)
超级区块时记录整个文件系统相关信息的地方,没有超级区块,就没有这个文件系统,它记录的信息有:
数据区块与inode的总量。
未使用与已使用的inode与数据区块数量。
数据区块与inode的大小(block为1,2,4K,inode为128B或256B)。
文件系统的挂载时间,最近一次写入数据的时间,最近一次检验磁盘的时间等文件系统的相关信息。
一个有效位数值,若该文件系统已被挂载,则有效位为0,若未被挂载,则有效位为1。
一个文件系统应该仅有一个超级区块,位于它的第一个区块群组,后续的区块1群组中也可能含有超级区块,不过都是对第一个超级区块的备份。
Filesystem Description(文件系统描述说明)
这个区段可以描述每个区块群组的开始与结束的区块,以及说明每个区块(超级区块,对照表,inode对照表,数据区块)分别介于哪个区块之间。
区块对照表(block bitmap)
从区块对照表中可以知道那些区块是空的,因此我们的系统就能够快速的找到可使用的空间来处理文件。
删除文件,对应区块空出来时,对照表中他们的状态就会变成未使用中。
inode对照表(inode bitmap)
与区块对照表功能类似,只是区块对照记录的是使用和未使用的区块号码,inode对照表则是记录使用和未使用的inode号码。
dumpe2fs: 查询ext系列超级区块信息的命令
每个区块与超级区块的信息都可以使用dumpe2fs去查询任何文件系统。
dumpe2fs [-bh] 设备文件名
-b :列出保留为坏道的部分(一般用不到)。
-h :仅列出superblock的数据,不会列出其他的区段内容。
利用dumpe2fs可以查到非常多的信息,不过依内容主要可以划分为上半部分的超级区块内容,下半部分则是每个区块群组的信息。
1.4 与目录树的信息
由前文可知,Linux中每个文件都会占用一个inode,且可以根据文件内容的大小来分配多个区块给该文件使用。
目录的内容在记录文件名,一般文件才是实际记录数据内容的地方。接下来讲解目录和文件在文件系统中是如何记录数据的。
目录
当在Linux下的文件系统建立一个目录树时,文件系统会分配一个inode与至少一块区块给该目录。其中inode记录该文件的相关权限与属性,并可记录分配到的那块区块号码,而区块则记录在这个目录下的文件名与该文件名占用的inode号码数据。如果目录下文件数过多导致一个区块无法记录的秀爱所有的文件名和inode对照表,linux会多分一个区块来继续记录相关数据。
文件
当在linux下的ext2建立一个一般文件时,ets2会分配一个inode与相对于该文件大小的区块数量给该文件。
目录树读取
Linux的目录结构就像树一样,当要读取一个文件时,是从根目录一层层往下读的,例如,我想要读取/etc/passwd文件:
/的inode
首先,系统从挂载的信息中找到根目录的inode,且inode规定的权限让我们可以读取该文件的内容(有r和x);
/的区块
通过得到的根目录的inode,在该区块中找到etc/目录的inode号码。
etc/的inode
读取etc/的inode,知道用户有r和x权限,因此就可以读取etc/的区块。
etc/的区块
通过取得的etc/的区块号码读取对应区块,找到passwd文件名,获得其inode。
passwd的inode
通过passwd的inode获取passwd的区块码。
passwd的区块
读取passwd的区块,此时真正读取到passwd的文件内容。
在实际过程中不会如此办法,系统会有各种方法简化这个过程。
文件系统大小与磁盘读取性能
当文件系统过大时,由于磁盘上数据一直在变动,所以这个系统上的数据通常无法被连续写在一起(即区块号码不会连续),当文件写入的区块针对很分散时,就会出现所谓的文件数据离散的问题。
1.5 ext2/ext3/ext4文件的存取与日志式文件系统的系统
当我们想要新增一个文件时,此时文件系统的操作:
1.先确定用户对于欲新增文件的目录是否具有w和x的权限,若有的话才能新增。
2.根据inode对照表找到没有使用的inode号码,并将新文件的权限/属性写入。
3.根据区块对照表找到没有使用中的区块号码,并将实际的数据写入块中,且更新inode的区块指向数据。
4.将刚刚写入的inode与区块数据同步更新inode对照表与区块对照表,并更新超级区块的内容。
一般来说,将inode对照表与数据区块称为数据存放区域,其他例如超级区块,区块对照表与inode对照表等区段就被称为元数据,因为超级区块,inode对照表及区块对照表的数据是经常变动的,每次新增,删除,编辑时都有可能影响到这三个部分的数据,因此被称为元数据。
数据的不一致状态
在一般正常情况下,以上操作可以顺利完成,当有意外事件发生,导致系统中断,把数据写入到inode对照表和数据区块,没有同步更新到元数据,此时就会发生元数据的内容与实际数据存放区不一致的情况。
日志式文件系统
为避免上面的问题,现在使用以下方式来解决:
1.预备:当系统要写入一个文件时,会先在日志记录区块中记录某个文件准备要写入的信息。
2.实际写入:开始写入文件的权限与数据;开始更新metadata的数据。
3.结束:完成数据与metadata的更新后,在日志记录区当中完成该文件的记录。
在这样的程序中,万一数据的记录过程中发生了问题,只需去检查日志记录区块,就知道哪个文件发生什么问题了。
1.6 Linux文件系统
在电脑中,所有的数据要加载到内存之后CPU才能处理如果要编辑一个大型文件,过程中又频繁的要系统写入到磁盘上,由于磁盘写入的速度要比内存慢的多,因此常常在等待磁盘的读写上浪费大量时间。为解决这个问题,Linux使用异步处理的方式,即:
当系统加载一个文件到内存中,如果该文件没有被修改过,则内存区段的文件数据会被设置为【干净】。
如果内存中的文件数据被修改过,该内存中的数据会被设置为【脏的】,此时所有的操作都还在内存中执行,并没有被写入到磁盘中。
1.7 挂载点的意义
每个文件系统都有独立的inode,区块,超级区块等信息,这个文件系统要能链接到目录树才能被我们使用。将文件系统与目录树进行结合的操作我们成为【挂载】。重点为挂载点一定是目录,该目录为进入该文件系统的入口。
1.8 其他Linux支持的文件系统与VFS
Linux的标准文件系统是ext2,且还有增加了日志功能的ext3和ext4,事实上,Linux还支持很多其他的文件系统格式,尤其是最近几年的SGI,Reiserfs,FAT等。常见的支持的文件系统有:
传统文件系统:ext2,minix,FAT(用vfat模块),iso9660(光盘)等。
日志式文件系统:ext3,ext4,ReiserFS,Windows’NTFS,IBM’s JFS,SGI’s XFS,ZFS。
网络文件系统:NFS,SMBFS。
可以在以下目录中查看:
ls -l /lib/modules/$(uname -r)/kernel/fs
查看系统目前已经加载到内存中支持的文件系统则是:
cat /proc/filesystems
Linux VFS
所有的linux系统都是通过一个名为VFS的内核功能去读取文件系统,也就是说,整个Linux识别的文件系统其实都是VFS在进行管理。
1.9 XFS文件系统简介
从CentOS7开始,默认的文件系统由原本的ext4变成了xfs文件系统。
ext系列系统的问题
在ext系列系统中,总是预先规划出所有的inode,区块,元数据等数据,以便未来系统可以直接使用,而在磁盘空间越来越大的如今,连TB级的容量都显得不够用,都已经上升到PB或者EB以上的容量了。当这样大型的文件系统进行格式化时,光是预先分配inode和区块都需要相当多的时间。
而xfs文件系统正是一个较适合高容量磁盘与巨型文件,且性能较佳的文件系统。
XFS文件系统的配置
基本上XFS就是一个日志式文件系统,最早之前,xfs就是被开发来用于高容量磁盘和高性能文件系统之用。此外,几乎所有ext4系统有的功能,xfs都可以具备。
xfs系统在数据分布上主要分为三个部分:数据区,文件系统活动登陆区,实时运行区。
数据区
与ext系列一样,包括inode,数据区块,超级区块等数据。
与ext系列的区块群组类似,也是分为多个存储区群组来分别放置文件系统所需要的数据。
每个存储区群组都包含
(1)整个文件系统的超级区块。
(2)剩余空间的管理机制。
(3)inode的分配与追踪。
inode与区块都是系统需要用到时才动态配置产生,格式化超级快。
文件系统活动登陆区
登陆区这个区主要被用来记录文件系统的变化。
文件的变化会在这里记录下来,直到该变化完整的写入到数据区后,该条记录才会结束。
如果文件系统因为某些原因意外终止导致损坏时,系统就会拿这个登陆区块来进行检验,看看系统挂掉之前,文件系统在运行什么操作,借以快速修复这个文件系统。
系统所有的操作都会在这个区块总记录,因此这个区块的磁盘活动相当频繁,而且在xfs中,可以指定外部磁盘作为xfs的登陆区,以使系统进行更加快速的工作。
实时工作区
当有文件被建立时,xfs会在这个区块中找到一个到数个extent区块,将文件放置到这个区块内,等到分配完毕后,再写入到数据区的inode和区块中。这个extent区块要在格式化的时候就先指定,最小值是4K最大可到1G。一般非磁盘阵列磁盘默认为64K容量,而具有类似于磁盘阵列的stripe情况下,则建议将extent设置的与tstripe一样大。
2.文件系统的简单操作
2.1 磁盘与目录的容量
磁盘的整体数据是在超级区块中,但每个文件的容量则在inode中被记载。
df:列出文件系统的整体磁盘使用量
df [-ahikHTm] (目录或文件名)
-a :列出所有的文件系统,包括系统特有的/porc等文件系统。
-k :以KBytes的容量显示各文件系统。
-m :以MBytes的容量显示各文件系统。
-n :以人们较易阅读的GBytes,Mbytes,KBytes等格式自行显示。
-H :以M=1000k替换M=1024K的进位方式。
-T :连同该硬盘分区的文件系统名也列出。
-i :不用磁盘容量,而以inode的数量来显示。
直接使用df会显示以下信息:
Filesystem:代表该文件系统是在哪个硬盘分区,所以列出设备名称。
1k-blocks:说明下面的数字单位是1KB,可以利用-h或-m来改变容量。
Used:顾名思义,就是使用掉的磁盘空间大小。
Available:也就是剩下的磁盘空间大小。
USE%:就是磁盘的使用率,如果使用率高达90%以上,最好注意一下,免得容量不足造成系统问题。
Mounted on:就是磁盘的挂载目录。
df读取的数据几乎都是针对一整个文件系统,因此读取范围主要是在超级区块内的信息,所以这个命令显示结果非常快。
当使用-a时,系统会出现/porc这个挂载点,但里面的东西都是0,以为这里面的数据都是Linux系统所需要加载的系统数据,而且时挂载到你存当中,不占任何的磁盘空间。
/dev/shm目录,其实是利用内存虚拟出来的磁盘空间,通常是总物理内存的一半。 因此它的大小不一,尽力的东西在下次启动时就会消失。
du:查看文件系统的磁盘使用量(常用在查看目录所占磁盘空间)
du [-ashskm] 文件或目录名称
-a :列出所有的文件与目录容量,因为默认仅统计目录下的文件量。
-h :以人们较易读的容量格式(G/M)显示。
-s :仅列出总量,而不列出每个各别的目录占用容量。
-S :不包括子目录下的总计,与-s有点差别。
-k :以KBytes列出容量显示。
-m :以MBytes列出容量显示。
du是会直接到文件系统中去查找所有的文件数据,所以执行时会花费一小段时间。
2.2 硬链接与符号链接:ln
在linux下面的链接文件有两种,一种是类似于Windows的快捷方式功能的文件,可以让你快速地链接到目标文件(或目录);另一种则是通过文件系统的inode链接来产生新文件名,而不是产生新文件,这种称为硬链接,这两种完全不同。
硬链接(硬式链接或实际链接)
之前的学习中,我们已经知道:
每个文件都会占用一个inode,文件内容由inode的记录来指向。
想要读取该文件,必须要经过目录记录的文件名来指向正确的inode号码才能读取。
总结一下:文件名只与目录有关,文件内容与inode有关。那么也可以让多个文件名对应同一个inode号码,这就是硬链接。
所以:硬链接只是在某个目录下新增一条文件名链接到某inode号码的关联记录而已。
也就是说:我们可以读取到完全不同的文件名,而他们可以指向同一个唯一的inode,而这个唯一的inode又指向唯一的一份文件内容。任何通过其中一个文件名,对这个文件的修改,最终都会写入到相同的inode和区块中,而删除任意一个文件名,都不会对这份inode和文件内容产生任何影响。
而硬链接文件是有限制的!仅能在单一文件系统上进行,不能跨文件系统。所以它有以下限制:
不能跨文件系统。
不能链接目录。
不能硬链接到目录,是因为:当建立一个目录对另外一个目录进行硬链接时,这个目录下的所有文件都会对另一个目录下的对应文件建立硬链接,会造成相当大的环境复杂度,因此暂时不支持对目录进行硬链接。
符号链接(即是快捷方式)
符号链接就是建立一个独立的文件,这个文件会让数据的读取指向它链接的那个文件的文件名。
仅仅是利用这个文件做一个指向的操作,当源文件被删除后,符号链接的文件就会打不开了。
这个符号链接与Windows的快捷方式相同,由符号链接所建立的文件为一个独立的新文件会占用inode和区块。
要制作链接文件必须使用ln命令
ln [-sf] 源文件 目标文件
-s :如果不加任何参数就进行链接,那就是硬链接,加了-s就是符号链接。
-f :如果目标文件存在时,就主动将目标文件删除并再建立。
使用ln不加任何参数,就是建立硬链接。
3.磁盘的分区,格式化,检验与挂载
当我们想要在系统中新增一块磁盘时,要做以下操作:
对磁盘进行划分,以建立可用的硬盘分区。
对该硬盘分区进行格式化,以建立系统可用的文件系统。
若想要仔细一点,则可对刚刚建立好的文件系统进行检验。
在Linux系统上,需要建立挂载点(即是目录),并将它挂载上来。
3.1 观察磁盘分区状态
由于目前磁盘分区主要有MBR以及GPT两种格式,这两种格式所使用的分区工具不太一样。
lsblk(列出系统上的所有磁盘列表)
lsblk [-dfimpt] [device]
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据。
-f :同时列出该磁盘内的文件系统名称。
-i :使用ASCII的字符输出,不要使用复杂的编码(某些环境有用)。
-m :同时输出该设备在/dev下面的权限信息(rwx的数据)。
-p :列出该设备的完整文件名,而不是仅列出最后的名字而已。
-t :列出该磁盘设备的详细数据,包括磁盘阵列机制,预读写的数据量大小等。
使用lsblk默认会输出以下信息:
NAME:就是设备的文件名,会省略/dev等前导目录。
MAJ:MIN:其实内核识别的设备都是通过这两个代码来实现的,分别是主要与次要设备代码。
RM:是否为可卸载设备,如光盘,USB磁盘等。
SIZE:当然就是容量。
RO:是否为只读设备的意思。
TYPE:是磁盘,分区,还是只读存储器等输出。
MOUNTPOINT:就是前一章谈到的挂载点。
blkid列出设备的UUID等参数
lsblk使用-f同样可以列出文件系统与设备的UUID参数。
UUID参数就是全局唯一标识符,Linux会将系统内所有的设备都给予一个独一无二的标识符,这个标识符就可以拿来作为挂载或是使用这个设备或文件系统。
当使用blkid,会列出一行行的信息。
每一行代表一个文件系统,主要列出设备名称,UUID名称以及文件系统的类型。
parted 列出磁盘分区表类型与分区信息
parted /dev/xxx print就可以显示出磁盘的分区类型。
3.2 磁盘分区:gdisk/fdisk
注意:MBR分区表请使用fdisk分区,GPT分区表请使用gdisk分区。
想要对磁盘进行操作时:
首先通过lsblk和blkid先找到磁盘
再使用parted /dev/xxx print来找出内部的分区表类型
之后才可以用gdisk或fdisk来操作系统
gdisk
gdisk 设备名称
输入?会显示所有的操作,因此完全不需要背命令。
其中【q】和【w】两个操作十分重要,无论进行什么操作,只要在离开gdisk时按下【q】,那么所有的操作都不会生效,相反,按下【w】就是写入,操作生效的意思。
使用【p】可以列出目前的这块磁盘分区表信息,这个信息的上半部分在显示整体磁盘的状态。
下半部分的分区表信息主要在列出每个分区的信息,每个项目的意义为
Number:分区编号,1号指的是/dev/vda1这样计算。
Start(sector):每一个分区的开始扇区号码位置。
End(sector):每一个分区的结束扇区号码位置,与start之间可以算出分区的总容量。
Size:就是分区的容量。
Code :在分区内的可能的文件的系统类型。
Name:文件系统的名称等。
在分区的设计中,新分区通常选用上一个分区的结束扇区号码加1作为起始扇区号码。
这个gdisk只有root才能执行,此外,使用到设备文件名请不要加上数字,因为磁盘分区是针对整个磁盘设备而是某个分区。
用gdisk新增分区
首先,我们使用【p】来查看磁盘的分区表信息。
之后可以用【?】来查询新增分区的命令。新增分区命令为n。
之后的选择让选择分区号,此处可以直接回车使用默认值。
这一步First sector,起始扇区号码,也可以直接回车。
这一步Lsat sector,结束扇区号码,不要使用直接回车,因为此处默认值会将所有的容量用光,它默认会选择最大的扇区号码。可以输入+数字单位,类似于+1G这样的形式选择分区容量。
这一步Current type is ...选择未来这个分区预计使用的文件系统,使用默认值即可,直接回车。默认使用的是Linux文件系统的8300。
每次新增完毕后,请立即【p】查看一下结果。
当你做完所有的分区工作,使用【w】来保存时,会先警告你可能的问题,我们确认自己是对的,就可以按下y。此时还会有报错,这是因为这块硬盘目前正在使用中,因此系统无法立即加载新的分区表,有两种方式可以处理:
进行重新启动 reboot。
通过partprobe这个命令来处理。
partprob更新Linux内核的分区表信息
partprobe更新Linux内核的分区表信息
partprobe [-s],不加-s,屏幕上不会显示信息,加上-s,屏幕上会显示相关信息。
用gdisk删除分区
首先还是用【p】查看磁盘分区;
再用【d】来进行删除;
接着输入对应分区号,就完成了删除;
输入【p】再次查看来确认操作完成;
输入【w】进行写入,执行操作;
此时使用lsblk任然显示删除的分区存在,此时使用partprobe即可。
fdisk
fdisk用来对MBR分区进行操作,而MBR分区表在未来应该会慢慢的被淘汰。
fdisk的使用与gdisk几乎一致,只是一个使用【?】作为显示命令提示信息,一个使用【m】而已。
3.3 磁盘格式化(创建文件系统)
分区完毕后自然就是要进行文件系统的格式化。即
makefilesystem,mkfs这个命令是一个综合命令,它会调用正确的文件系统格式化工具软件。
XFS文件系统 mkfs.xfs
所谓格式化其实应该被称为创建文件系统(make filesystem),所以使用的命令是mkfs,那我们要创建的其实是xfs文件系统,因此使用的是mkfs.xfs这个命令。
mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] [-r parms] 设备名称
-b :后面接区块容量,可由512到64k,不过最大容量限制为linux的4k。
-d :后面接的是重要的data section的相关参数值,主要值有:
agcount=数值 :设置需要几个存储群组的意思,通常与CPU有关。
agsize=数值 :每个AG设置为多少容量的意思,通常agcount/agsize只选一个设置即可。
file :指的是【格式化的设备是个文件而不是个设备】的意思。
size=数值 :data section的容量,亦即你可以不将全部的设备容量用完的意思。
su=数值 :当有RAID时,那个stripe数值的意思,与下面的sw搭配使用。
sw=数值 :当有RAID时,用于保存数据的磁盘容量(须扣除备份盘与备用盘)。
sunit=数值 :与su相当,不过单位使用的是【几个sector(512Bytes的大小)】的意思。
swidth=数值 :就是su*sw的数值,但是以【几个sector(512Rytes的大小)】来设置。
-f :如果设备内已经有文件系统,则需要使用这个-f来强制格式化。
-i :与inode有较相关的设置,主要的设置值有:
size=数值 :最小是256Bytes最大是2K,一般保留256就足够用了。
internal=[0|1] :log设备是否为内置?默认为1内置,如果用外部设备,使用下面设置
logdev=device :log设备为后面接的设备上面的意思,需设置internal=0才可。
size=数值 :指定这块登陆区的容量,通常最小得要有512个区块,大约2M以上才行。
-L :后面接这个文件系统的标头文件名称Label name的意思。
-r :指定reatime section的相关设置值,常见的有:
extsize=数值 :就是那个重要的extent数值,一般不需要设置但有RAID时,最好设置与switch的数值相同较佳。最小为4K最大为1G。
创建文件系统时使用默认参数即可,有其他额外需求时才会用到这一堆设置值。
ext4文件系统 mkfs.ext4
mkfs.ext4 [-b size] [-L label] 设备名称
-b :设置区块的大小,有1k,2k,4k的容量。
-L :后面接这个设备的标头名称。
3.5 文件系统挂载与卸载
挂载点其实就是目录,这个目录就是进入磁盘分区的入口。挂载前,最好先确认:
单一文件系统不应该被重复挂载在不同的挂载点中(目录)中。
单一目录不应该重复挂载多个文件系统。
要作为挂载点的目录,理论上因该都是空目录才对。
当你要用来挂载的目录中并不是空的,那么挂载了文件系统后,原目录下的东西会暂时消失。
在挂载文件系统时,需要用到mount这个命令
mount -a
monut [-l]
monut [-t 文件系统] LABEL=‘’ 挂载点
monut [-t 文件系统] UUID=‘’ 挂载点
monut [-t 文件系统] 设备文件名 挂载点
-a :依照配置文件/etc/fstab的数据将所有的未挂载的磁盘都挂载上来。
-l :单纯的输入monut会显示目前挂载的信息,加上-l可增列Label名称。
-t :可以加上文件系统种类来指定欲挂载的类型,常见的Linux支持类型有:xfs,ext3,ext4,reiserfs,vaft,iso9660(光盘格式),nfs,cifs,smbfs(后三种为网络文件系统类型)。
-n :在默认的情况下,系统会将实际挂载的情况及时写入/etc/mtab中,以利其他程序的运行,但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入,此时就使用-n选项。
-o :后面可以跟一些挂载时额外加上的参数,比如说账号,密码,读写权限等;
async,sync :此文件系统是否同步写入(sync)或者非同步(async)的内存机制,请参考文件系统运行方式,默认为async。
atime,noatime :是否修改文件系统的读取时间(atime),为了性能,某些时刻可以使用noatime。
ro,rw :挂载文件系统成为只读(ro)或可读写(rw)。
auto,noauto :允许此文件系统可以被以`monut -a`自动挂载(auto)。
dev,nodev :是否允许此文件系统可建立设备文件?dev为可允许。
suid,nosuid :是否允许此文件系统含有suid/sgid的文件格式。
exec,noesec :是否允许此文件系统上拥有可执行二进制文件。
user,nouser :是否允许此文件系统让任何使用者执行mount,一般来说,mount只有root可以使用,执行user参数后,可以让一般user也能够对此分区进行mount。
default :默认值为 :rw,suid ,dev,exec,auto,nouser,async。
remount :重新挂载,在系统出错,或重新更新参数时很有用。
umount(将设备文件卸载)
umount [-fn] 设备文件名或挂载点
-f :强制卸载,可用在类似网络文件系统无法读取到的情况。
-l :立刻卸载文件系统,比-l还强。
-n :不更新/etc/mtab情况下卸载。
就是将已经挂载的文件系统卸载,卸载后可以使用df或mount查看是否存在。
当你处于某文件系统时,你是无法卸载该文件系统的,此时需要离开还文件系统的挂载点,如使用cd /来回到根目录。
3.6 磁盘/文件系统参数自定义
当需要修改目前目录系统的一些相关信息时,就需要以下的命令功能:
mknod
在linux下,所有的设备都以文件来表示,就是通过文件的设备代码(major)和次要设备代码(minor)来代替。
mknod 设备文件名 [bcp] [Major] [Minor]
b :设置设备名称成为一个外接储存设备文件,例如此磁盘等。
c :设置设备名称成为一个外接输入设备文件,例如鼠标/键盘等。
p :设置设备名称成为一个FIFO文件。
Major :主要设备代码。
Minor :次要设备代码。
xfs_admin修改XFS文件系统的UID和Label name
当格式化时忘记加上标头名称,想要加入时可以使用。
xfs admin [-lu] [-L label] [-U uuid] 设备文件名
-l :列出这个设备的label name。
-u :列出这个设备的UUID。
-L :设置这个设备的label name。
-U :设置这个设备的UUID。
tune2fs修改ext4的label name与UUID
tune2fs [-l] [-L label] [-U uuid] 设备文件名
-l :类似dumpe2fs -h的功能,将superblock内的数据读出来。
-L :修改LABEL name。
-U :修改UUID。
4.设置启动挂载
4.1启动挂载/etc/fstab及/etc/mtab
在/etc/fatab中进行修改就可以在启动时就将需要的文件系统挂载好。
但在系统挂载时有一些限制:
根目录【/】是必须挂载的,而且一定要优先于其他挂载点被挂载进来。
其他挂载点必须为已建立的目录,可任意指定,但一定遵守必需的系统目录架构原则。
所有挂载点在同一时间内,只能挂载一次。
所有硬盘分区在同一时间内,只能挂载一次。
如若进行卸载,必须将工作目录移到挂载点(及其子目录之外)。
/etc/fateb文件就是在外面使用mount命令进行挂载时,将所有的选项和参数写入的文件。除此之外还加入了dump这个备份命令的支持。
这个文件的内容有六个字段,这六个字段非常重要,建议直接背下来,详细信息如下:
[设备/UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
第一栏:磁盘设备文件名/UUID/LABEL name
此字段数据有三个项目:
文件系统或磁盘的设备文件名,如/dev/vda2等。
文件系统的UUID名称,如UUID=xxx。
文件系统的LABEK名称,如LABEL=xxx。
第二栏:挂载点
挂载点必须是目录
第三栏:磁盘分区的文件系统
在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须手动写入文件系统,包括xfs,ext4,vfat,reiserfs,nfs。
第四栏:文件系统参数
| 参数 | 实际意义 |
|---|---|
| async / sync | 是否以异步(默认)或同步方式写入磁盘。异步性能更好,sync更安全。 |
| auto / noauto | 是否允许在执行 mount -a 时自动挂载该分区。默认是 auto。 |
| rw / ro | 是否以**可读写(rw)或只读(ro)**方式挂载。ro 禁止所有写入操作,即使文件权限允许。 |
| exec / noexec | 是否允许在此文件系统中执行二进制程序。noexec 可增强安全性(如 /tmp 可设为 noexec)。 |
| user / nouser | 是否允许普通用户使用 mount 命令挂载。默认 nouser,只允许 root。 |
| suid / nosuid | 是否允许 SUID/SGID 程序生效。设置为 nosuid 可防止权限提升,适合外部设备或临时挂载目录。 |
| defaults | 含有默认参数组合:rw,suid,dev,exec,auto,nouser,async。可省略单独配置。 |
第五栏:能否被dump备份命令作用
dump是一个用来做为备份的命令,不过现在有太多备份方案,不需理会,输入0即可。
第六栏:是否以fsck检验扇区
早期启动时会使用fsck检验本机文件系统是否完整,现在xfs不适用,填0即可。
4.2 特殊设备loop(回环设备)挂载(镜像文件不刻录就挂载使用)
loop设备就是Linux中的一种特殊块设备,就是把一个普通的文件( .iso或 .img)当做一个块设备(如硬盘分区)来挂载。
如果有光盘镜像文件,或者是使用文件作为磁盘的方式时,就要使用特殊方法挂载。
挂载CD/DVD镜像文件
当需要挂载镜像文件时,仅需
mount -o loop 文件路径 挂载点路径
-o loop的意思就是:告诉mount把这个普通文件当做一个块设备挂载。
当然,也可以在这个文件内动手脚去修改文件,所以很多镜像文件提供后,还要提供验证码给用户确认该镜像文件没有问题。
&建立大文件制作loop设备文件
利用loop,我们可以进行一个有趣的操作:
自建一个大文件,将这个文件格式化后挂载,将这个文件伪装成一个设备。
这样的伪装程度相当高,连内核都会当它是个真正的磁盘设备。
但它终究只是个文件,它和它的挂载点,最终都以来于底层真实的磁盘存储。
这是一种奇妙的能力,将一个文件变成一个磁盘。
你将不在受限与分区结构,物理磁盘数量,在任何地方,任何文件中,建立一个小小的世界。
(1)第一步,创建一个文件。
dd if=/dev/zero of=mydisk.img bs=1M count=512
if=/dev/zero:输入全是0的源。
of=mydisk.img:输出为你要创建的磁盘镜像。
bs=1M count=512:bs就是每个block块的大小,count就是块的多少,相乘就是磁盘的空间大小。
这样就创建出一个完美的空白磁盘。
(2)第二步,格式化这个磁盘
mkfs.xfs -f mydisk.img
(3)第三步,创建挂载点。
mkdir /mnt/myloop
此处自定义即可,可以自行选择创建或选择已有文件夹。
(4)第四步,挂载这个“伪装磁盘”
sudo mount -o loop mydisk.img /mnt/myloop
(5)第五步,进入“新世界”
cd /mnt/myloop
在这里,就是一个小小的新世界。
也可以为这个虚拟磁盘赋权,让它只属于个人。
还有加密,备份等,可以自行探索。
5.内存交换分区(swap)之创建
在曾经的年代,内存常常不足,因此那个可以将内存中的数据拿到硬盘暂时存放的内存交换分区(swap)就显得十分重要。
而在硬盘资源充足的情况下,swap就不怎么使用了。


















暂无评论内容