二、文件系统的简单操作

1.磁盘与目录的容量:df,du

(1)df

df是列出文件系统的整体磁盘使用量。

[root@study ~]# df [-ahikHTm] [目录或文件名]

选项与参数:

-a:列出所有的文件系统,包括系统特有的/proc等文件系统;

-k:以KBytes的容量显示各文件系统;

-m:以MBytes的容量显示各文件系统;

-h:以人们较易阅读的GBytes,MBytes,KBytes等格式自行显示;

-H:以M=1000K取代M=1024K的进位方式;

-T:连同该partition的文件系统名称(例如xfs)也列出;

-i:不用磁盘容量,而以inode的数量来显示。

注意,/dev/shm/目录是利用内存虚拟出来的硬盘空间,通常是总物理内存的一半。由于我分配给虚拟机的内存为2G,所以大小为986MB。在这个目录下面新建的任何数据文件访问速度非常快,但是缺点是一旦关机,数据就会消失。

(2)du

du是评估文件系统的的磁盘使用量(常用在推测估计目录所占容量)。

[root@study~]#du [-ahskm] 文件或目录名称

选项与参数:

-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。

-h:以人们较易读的容量格式(G/M)显示;

-s:列出总量而已,而不列出每个各别的目录占用容量;

-S:不包括子目录下的总计,与-s有点差别。

-k:以KBytes列出容量显示;

-m:以MBytes列出容量显示。

2.硬连接与符号连接:ln

在Linux下连接文件有两种,一种是类似于Windows快捷方式的文件,可以快速的连接到目标文件(目录);另一种则是通过文件系统的inode连接来产生新文件名,而不是产生新文件。后者称为硬链接(hard link)。

(1)硬连接:在某个目录下新增一个文件名连接到某个inode号码的关联记录

图2.1 硬连接

两个文件名都连接到了1048716这个inode号码,这两个文件名的权限和属性完全一致。再注意一下,root前面的数字在第一行为1,第二行为2,其实意思是有多少个文件名连接到了这个inode号码。这个过程就如图2.2所示的这样一个结构。

图2.2 硬连接的文件读取示意图

可以看出,从1或2的目录的inode指定的block找到了两个不同的文件名,但是它们都指向了同一个inode(名为real的inode),然后inode再去读取最终数据。这样的好处是非常安全,即如果将任何一个文件名删除,inodeblock都还是存在的,依旧可以通过另一个文件名来读取到正确的文件数据;此外,不论用哪个文件名编辑,最终结果都会写入到相同的inodeblock

hard link有以下限制:

①Hard link不能跨文件系统;

②Hard link不能指向目录

(2)Symbolic Link(符号连接)

符号连接亦称软连接(Soft link),它是建立一个独立的文件,而这个文件会让数据的读取指向其连接的文件的文件名。当来源文件被删除之后,symbolic link就会打不开。其读取示意图如图2.3所示。

图2.3 符号连接的文件读取示意图

这里需要注意的是,Symbolic LinkWindows快捷方式可以划等号,由Symbolic link所建立的文件为一个独立的新文件,会占用掉inodeblock

下面介绍一下ln这个指令。

[root@study ~]# ln [-sf] 来源文件 目标文件

选项与参数:

-s:如果不加任何参数就进行连结,那就是hardlink,至于-s就是symboliclink

-f:如果目标文件存在时,就主动的将目标文件直接移除后再建立!

(3)关于目录的link数量

一个空目录里面至少会存在什么呢?存在.与..这两个目录,那么我们新建一个/tmp/testing的目录的时候,基本会有三个东西,分别是:

/tmp/testing

/temp/testing/.

/temp/testing/..

其中/tmp/testing和/tmp/testing/,是一样的,而/tmp/testing/..则代表/tmp目录。所以我们在新建一个目录的时候,新的目录的link数为2,而上层目录的link数则会增加1

 

三、磁盘的分区、格式化、检查与挂载

如果我们想要在系统里面新增一个磁盘时,应该有哪些动作需要做的呢?

①对磁盘进行分区,以建立可用的partition;

②对该partition进行格式化,以建立系统可用的文件系统;

③(可选)对刚刚建立好的文件系统进行校验;

④在linux系统上,需要建立挂载点,并将其挂在上来。

1.查看磁盘分区状态

(1)lsblk可以看做为“list block device”的缩写。使用方法如下:

[root@study ~]# lsblk [-dfimpt] [device]

选项与参数:

-d:仅列出磁盘本身,并不会列出该磁盘的分区数据

-f:同时列出该磁盘内的文件系统名称

-i:使用ASCII的线段输出,不要使用复杂的编码(再某些环境下很有用)

-m:同时输出该设备在/dev底下的权限数据(rwx的数据)

-p:列出该设备的完整文件名!而不是仅列出最后的名字而已。

-t:列出该磁盘设备的详细数据,包括磁盘队列机制、预读写的数据量大小等

如图所示3.1所示是输入lsblk命令后我的硬盘的情况的一部分。图中的各列解释如下:

①NAME:设备名称。会省略/dev等前导目录。

②MAJ:MIN:主要:次要设备代码。

③RM:是否为可移除设备。如U盘等。

④SIZE:容量。

⑤RO:是否为只读设备。

⑥TYPE:是磁盘(disk)、分区(partition,part)、只读存储器(rom)、loop设备(loop)。

⑦MOUNTPOINT:挂载点。

图3.1 lsblk情况

(2)blkid:列出设备的UUID参数。UUID是全局单一标识符(universally unique identifier)的意思。

(3)parted:列出磁盘的分区表类型和分区信息。格式如下:

[root@study ~]# parted device_name print

2.磁盘分区:gdisk/fdisk

MBR分区使用fdisk,GPT分区使用gdisk。partprobe可以用来更新Linux核心的分区表信息。

3.磁盘格式化

格式化,又被称为“制作文件系统(make 文件系统)”,所以这个综合指令名为mkfs。对于xfs来说为mkfs.xfs,对于ext4来说为mkfs.ext4。

(1)XFS文件系统:mkfs.xfs

 

[root@study ~]# mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \

[-r parms] 设备名称

选项与参数:

关于单位:底下只要谈到数值时,没有加单位则为bytes值,可以用k,m,g,t,p(小写)等来解释。比较特殊的是s这个单位,它指的是sector的个数。

-b:后面接的是block容量,可由512到64k,不过最大容量限制为Linux的4k。

-d:后面接的是重要的data section的相关参数值,主要的值有:

agcount=数值:设定需要几个储存群组的意思(AG),通常与CPU有关;

agsize=数值:每个AG设定为多少容量的意思,通常agcount/agsize只选一个设定即可;

file:指的是『格式化的设备是个文件而不是个设备』的意思!(例如虚拟磁盘);

size=数值:data section的容量,亦即你可以不将全部的设备容量用完的意思;

su=数值:当有RAID时,那个stripe数值的意思,与底下的sw搭配使用;

sw=数值:当有RAID时,用于储存数据的磁盘数量(须扣除备份盘与备用盘);

sunit=数值:与su相当,不过单位使用的是『几个sector(512bytes大小)』的意思;

swidth=数值:就是su*sw的数值,但是以『几个sector(512bytes大小)』来设定。

-f:如果设备内已经有文件系统,则需要使用这个-f来强制格式化才行。

-i:与inode有较相关的设定,主要的设定值有:

size=数值:最小是256bytes最大是2k,一般保留256就足够使用了;

internal=[0|1]:log设备是否为内建?默认为1内建,如果要用外部设备,使用底下设定;

logdev=device:log设备为后面接的那个设备上头的意思,需设定internal=0才可;

size=数值:指定这块登录区的容量,通常最小得要有512个block,大约2M以上才行。

-L:后面接这个文件系统的标头名称Labelname的意思。

-r:指定realtimesection的相关设定值,常见的有:

extsize=数值:就是那个重要的extent数值,一般无需设定,但有RAID时,最好设定与swidth的数值相同较佳!最小为4K最大为1G。

(2)EXT4文件系统mkfs.ext4

[root@study ~]# mkfs.ext4 [-b size] [-L label] 设备名称

选项与参数:

-b:设定block的大小,有1K、2K、4K的容量。

-L:后面接这个装置的标头名称。

4.文件系统检查

(1)xfs_repair:当有xfs文件系统错乱的时候用这个指令。

[root@study ~]# xfs_repair [-fnd] 设备名称

选项与参数:

-f  :后面的设备其实是个文件而不是硬件。

-n  :单纯检查并不修改文件系统的任何数据 (检查而已)

-d  :通常用在单人维护模式底下,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用。

xfs_repair可以检查/修复文件系统,不过,因为修复文件系统是个很庞大的任务!因此,修复时该文件系统不能被挂载。Linux系统有个装置无法被卸除,这就是根目录啊。如果你的根目录有问题怎办?这时得要进入单人维护或救援模式,然后通过-d这个选项来处理。加入-d这个选项后,系统会强制检验该装置,检验完毕后就会自动重新启动。

(2)fsck.ext4:fsck是一个综合指令,针对ext4的话,使用fsck.ext4检测比较好。

[root@study ~]# fsck.ext4 [-pf] [-b superblock] 设备名称

选项与参数:

-p:当文件系统在修复时,若有需要回复y的动作时,自动回复y来继续进行修复动作。

-f:强制检查。一般来说,如果fsck没有发现任何unclean的标志,不会主动进入检查的,如果您想要强制fsck进入检查,就得加上-f标志。

-D:针对文件系统下的目录进行优化配置。

-b:后面接superblock的位置!一般来说这个选项用不到。但是如果你的superblock因故损坏时,通过这个参数即可利用文件系统内备份的superblock来尝试救援。一般来说,superblock备份在:1Kblock放在8193,2Kblock放在16384,4Kblock放在32768。

无论是xfs_repair或fsck.ext4,这都是用来检查与修正文件系统错误的指令。注意:只有身为root且你的文件系统有问题的时候才使用这个指令,否则在正常状况下使用此指令可能会造成对系统的危害。

另外,如果你怀疑刚刚格式化成功的磁盘有问题的时后,也可以使用xfs_repair/fsck.ext4来检查磁盘。此外,由于xfs_repair/fsck.ext4在扫瞄磁盘的时候,可能会造成部分文件系统的修订,所以『执行xfs_repair/fsck.ext4时,被检查的partition务必不能挂载到系统上,也就是说需要在卸除的状态。

5.文件系统的挂载与卸载

挂载前的注意事项:

①单一文件系统不应该被重复挂载在不同的挂载点(目录)中;

②单一目录不应该重复挂载多个文件系统;

③要作为挂载点的目录,理论上应该都是空目录才是。当然,若没有使用空目录,那么挂载后该目录中的文件会被暂时隐藏,当卸载的时候文件就会再次显示出来。

(1)挂载使用mount,下面简单做一些介绍。

[root@study ~]# mount -a

[root@study ~]# mount [-l]

[root@study ~]# mount [-t 文件系统] LABEL=''  挂载点

[root@study ~]# mount [-t 文件系统] UUID=''   挂载点(推荐)

[root@study ~]# mount [-t 文件系统] 设备文件名  挂载点

选项与参数:

-a:依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来。

-l:单纯的输入mount会显示目前挂载的信息。加上-l可增列Label名称。

-t:可以加上文件系统种类来指定欲挂载的类型。常见的Linux支持类型有:xfs,ext3,ext4,reiserfs,vfat,iso9660(光盘格式),nfs,cifs,smbfs(后三种为网络文件系统类型)。

-n:默认情况下,系统会将实际挂载情况实时写入/etc/mtab,助于其他程序运行。但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用-n选项。

-o:后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:

async,sync:此文件系统是否使用同步写入(sync)或异步(async)的内存机制,预设为async;

atime,noatime:是否修订文件的读取时间(atime)。为了效能,某些时刻可使用noatime

ro,rw:挂载文件系统成为只读(ro)或可擦写(rw);

auto,noauto:允许此文件系统被以mount-a自动挂载(auto);

dev,nodev:是否允许此文件系统上,可建立装置文件,dev为可允许;

suid,nosuid:是否允许此文件系统含有suid/sgid的文件格式;

exec,noexec:是否允许此文件系统上拥有可执行binary文件;

user,nouser:是否允许此文件系统让任何使用者执行mount?一般来说,mount仅有root可以进行,但下达user参数,则可让一般user也能够对此partition进行mount;

defaults:默认值为:rw,suid,dev,exec,auto,nouser,andasync。

remount:重新挂载,这在系统出错,或重新更新参数时,很有用。

Linux十分聪明,我们不需要加上-t选项,系统会自动分析最恰当的文件系统来尝试挂载你的设备。Linux是利用分析文件系统superblock搭配linux自己的驱动程序来测试挂载,如果成功了,就立刻自动使用该类型的文件系统挂载起来。系统是参考下面两个文件进行挂载:

①/etc/文件系统s:系统指定的测试挂载文件系统类型的优先级;

②/proc/文件系统s:Linux系统已经加载的文件系统类型。

注意:

①光驱挂载成功以后就无法退出光盘,除非将其卸载才可以退出。

②如果参数要改变或者根目录出现“只读”状态,根目录需要重新挂载,可以通过使用“mount -o remount, rw, auto”来进行。

(2)卸载挂载使用umount。

[root@study ~]# umount [-fn] 设备文件名称或挂载点

选项与参数:

-f:强制卸载。可用在类似网络文件系统(NFS)无法读取到的情况下。

-l:立刻卸载文件系统,比-f还强。

-n:不更新/etc/mtab情况下卸载。

对于有其它挂载的项目,一定要用挂载点来写出才可以。

6.磁盘/文件系统参数修订

Linux下所有设备都以文件来代表,通过文件的major于minor数值来代替,这两个数值是由特殊意义的。

磁盘文件名MajorMinor
/dev/sda80-15
/dev/sdb816-31
/dev/loop070
/dev/loop171

手动处理设备文件使用mknod。

[root@study ~]# mknod 设备文件名 [bcp] [Major] [Minor]

选项与参数:

装置种类:

b:设定装置名称成为一个外部存储设备文件,例如磁盘等。

c:设定装置名称成为一个外部输入设备文件,例如鼠标/键盘等。

p:设定装置名称成为一个FIFO文件。

Major:主要装置代码。

Minor:次要装置代码。

xfs_admin可以修改XFS文件系统的UUID和Label name。

[root@study ~]# xfs_admin [-lu] [-L label] [-U uuid] 设备文件名

选项与参数:

-l:列出这个设备的labelname;

-u:列出这个设备的UUID;

-L:设定这个设备的Labelname;

-U:设定这个设备的UUID。

tune2fs可以修改ext4的label name和UUID。

[root@study ~]# tune2fs [-l] [-L Label] [-U uuid] 设备文件名

选项与参数:

-l:类似dumpe2fs-h的功能,将superblock内的数据读出来;

-L:修改LABEL name;

-U:修改UUID。