(一)存储结构与磁盘划分
文件系统层次化标准(FHS,Filesystem Hierarchy Standard)是根据以往无数Linux系统用户和开发者的经验而总结出来的,是用户在Linux系统中存储文件时需要遵守的规则,用于指导我们应该把文件保存到什么位置,以及告诉用户应该在何处找到所需的文件。
1、一切从“/”开始
Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件。另外,Linux系统中的文件和目录名称是严格区分大小写的,且文件名称中不得包含斜杠(/)。
Linux系统中的文件存储结构如下图所示。
在Linux系统中,最常见的目录以及所对应的存放内容如下表所示。
目录名称 |
放置文件的内容 |
/boot |
开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev |
★以文件形式存放任何设备与接口 |
/etc |
★服务配置文件 |
/home |
★用户主目录,也可以安装第三方软件。 |
/bin |
存放单用户模式下还可以操作的命令,普通用户执行的命令,存放系统外部命令。 |
/lib |
开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数。不要动 |
/sbin |
开机过程中需要的命令,系统管理员执行的命令,存放系统内部命令。 |
/media、/mnt |
用于挂载设备文件的目录 |
/opt |
安装第三方的软件 |
/root |
★系统管理员的家目录 |
/srv |
一些网络服务的数据文件目录,默认为空。 |
/tmp |
任何人均可使用的“共享”临时目录。有SBIT保护位。 |
/proc |
虚拟文件系统,例如系统内核、进程、外部设备及网络状态等。不要动 |
/usr/local |
用户自行安装的(第三方)软件 |
/usr/sbin |
Linux系统开机时不会使用到的软件/命令/脚本 |
/usr/share |
帮助与说明文件,也可放置共享文件 |
/var |
★主要存放经常变化的文件,如系统日志。 |
/lost+found |
当文件系统发生错误时,将一些丢失的文件片段存放在这里。ext3和ext4文件系统具有该目录。 |
绝对路径(absolute path):从“根(/)”目录开始到当前目录的完整路径为绝地路径。
相对路径(relative path):从当前目录开始到指定目录的路径为绝对路径。
2、物理设备的命名规则
磁道:上图中硬盘被一圈圈分成18等分的同心圆,这些同心圆就是磁道,但打开硬盘,用户不能看到这些,它实际上是被磁头磁化的同心圆.这些磁道是有间隔的,因为磁化单元太近会产生干扰。
扇区:每个磁道中被分成若干等份的区域,扇区是硬盘数据存储的最小单位。
柱面:假如一个硬盘只有上图中的3个磁盘片,每一片中的磁道数是相等的,从外圈开始,这些磁道被分成了0磁道、1磁道、2磁道...具有相同磁道编号的同心圆组成面就称作柱面,为了便于理解,柱面可以看作没有底的铁桶,从上图可以看出,柱面数就是磁盘上的磁道数,柱面是硬盘分区的最小单位,因此,一个硬盘的容量=柱面*磁道*扇区*512。
簇:扇区是硬盘数据存储的最小单位,但操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理,每个簇可以包括2、4、8、16、32、64个扇区。
linux系统内核中的udev设备管理器会自动把硬件名称规范起来,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。
Linux系统中常见的硬件设备文件名称如下表所示。
硬件设备 |
文件名称 |
IDE设备 |
/dev/hd[a-d] |
SCSI/SATA/U盘 |
/dev/sd[a-p] |
软驱 |
/dev/fd[0-1] |
打印机 |
/dev/lp[0-15] |
光驱 |
/dev/cdrom是/dev/sr0的软链接“cdrom -> sr0” |
鼠标 |
/dev/mouse |
磁带机 |
/dev/st0或/dev/ht0 |
系统采用a~z来代表不同的硬盘(默认从a开始分配,超过26个后从aa、ab…az),如28块硬盘标记如下:
[root@linuxprobe ~]# ls /dev/sd[a-z][0-9] && ls /dev/sd[a-z][a-z][0-9]
/dev/sda1 /dev/sdc1 /dev/sdg1 /dev/sdk1 /dev/sdo1 /dev/sds1 /dev/sdw1 /dev/sdaa1
/dev/sda2 /dev/sdd1 /dev/sdh1 /dev/sdl1 /dev/sdp1 /dev/sdt1 /dev/sdx1 /dev/sdab1
/dev/sdb1 /dev/sde1 /dev/sdi1 /dev/sdm1 /dev/sdq1 /dev/sdu1 /dev/sdy1
/dev/sdb2 /dev/sdf1 /dev/sdj1 /dev/sdn1 /dev/sdr1 /dev/sdv1 /dev/sdz1
硬盘分区编号原则:
举例1:
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
/dev/sdb2 10487808 14682111 2097152 83 Linux
/dev/sdb3 16779264 18876415 1048576 5 Extended
/dev/sdb5 16781312 16986111 102400 83 Linux
/dev/sdb6 16988160 17008639 10240 83 Linux
如:/dev/sda5设备文件名称包含如下信息。
/dev/目录中保存的是硬件设备文件;其次sd表示是存储设备;然后a表示系统中同类接口中第一个被识别到的设备,最后5表示这个设备是一个逻辑分区。即“/dev/sda5”表示“这是系统中第一块被识别到的“SCSI/SATA/U盘”硬件设备中分区编号为5的逻辑分区的设备文件”。
硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。第一个512字节的扇区保存着主引导记录MBR与分区表信息。主引导记录占用446字节,分区表占用64字节(4个主分区*16字节/个),结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区或扩展分区。
第一个扇区中的数据信息如下图所示。
为了解决分区个数不够的问题,可将第一个扇区的4个分区表中拿出来一个16字节(原本要写入主分区信息)的空间指向另外一个分区即扩展分区(包含除主分区外的其它全部磁盘空间),扩展分区其实并不是一个真正的分区,而是一个包含多个逻辑分区的集合。这样一来,用户一般会选择使用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出多个逻辑分区,从而满足多分区(大于4个)的需求。
如上图所示,主分区创建完创建扩展分区时需要把剩余空间均配置为扩展分区,然后在扩展分区上再创建多个逻辑分区,如下图。
注:扩展分区无法挂载使用,如下图。
3、文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统最常见的文件系统如下所示。
Ext2(RHEL4):
Ext3(RHEL5):是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。缺点:当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。原理:把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
Ext4(RHEL6):Ext3的改进版本,作为RHEL6系统中的默认文件管理系统,存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。
XFS(RHEL7):是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可快速地恢复可能被破坏的文件,且强大的日志功能只用花费极低的计算和存储性能。它最大可支持的存储容量为18EB,这几乎满足了所有需求。
Linux系统中有一个名为super block的“硬盘地图”,在里面记录着整个文件系统的信息。
[root@linuxprobe ~]# blkid //查看使用的文件系统类型
/dev/sdb1 on /haha type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
或
[root@linuxprobe ~]# df -T //查看使用的文件系统类型
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sdb1 ext4 5029504 20472 4730504 1% /haha
/dev/sr0 iso9660 3654720 3654720 0 100% /mnt/cdrom
/dev/sda1 xfs 508588 121216 387372 24% /boot
或
[root@linuxprobe ~]# lsblk -f /dev/sdb //查看使用的文件系统类型
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb
├─sdb1 ext4 d4056cf4-b61f-480e-8b3c-286af91c77b3 /haha
├─sdb2 swap b33176d6-df62-4a2d-a630-3c05d0af7fbe [SWAP]
└─sdb4 xfs d933dfe2-ec48-4dc6-87f5-976d3e14c773 /hehe
[root@linuxprobe ~]# xfs_info /dev/sda1 //查看xfs文件系统信息
meta-data=/dev/sda1 isize=256 agcount=4, agsize=32000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=128000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@linuxprobe ~]# tune2fs -l /dev/sdb1 //查看ext4文件系统信息
tune2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: d4056cf4-b61f-480e-8b3c-286af91c77b3
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 327680
Block count: 1310720
Reserved block count: 65536
Free blocks: 1252258
Free inodes: 327669
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 639
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Sat Feb 29 20:29:11 2020
Last mount time: Sun Mar 1 09:48:26 2020
Last write time: Sun Mar 1 09:48:26 2020
Mount count: 6
Maximum mount count: -1
Last checked: Sat Feb 29 20:29:11 2020
Check interval: 0 (<none>)
Lifetime writes: 213 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: bba4f0e2-9fb5-4433-b4c2-584d8409129e
Journal backup: inode blocks
Linux把每个文件的权限与属性记录在inode表格(占用一个block块)中,每个文件占用一个独立的inode表格,一个inode表格默认大小仅为128B(Ext3),记录一个block信息占用4B,而文件的实际内容则保存在block块中(大小可以是1KB、2KB或4KB);每个文件的inode表格被写满后,Linux系统会自动分配出一个block块,专门用于像inode那样记录其他block块的信息,这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了。
inode表格里面记录着如下信息:
对于存储文件内容的block块,有下面两种常见情况(以4KB的block大小为例进行说明)。
情况1:文件很小(1KB),但依然会占用一个block,因此会潜在地浪费3KB。
情况2:文件很大(5KB),那么会占用两个block(5KB-4KB后剩下的1KB也要占用一个block)。
Linux系统支持数十种文件系统,每种文件系统底层操作肯定有很多区别,但是为了让用户在读取和写入文件是不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS接口(Virtual File System),这个接口封装了底层文件系统的特性和细节,这样用户实际上在操作文件时就是统一对这个VFS进行操作,从而不必关心每种文件系统的不同。
VFS架构示意图如下:
4、硬盘分区、格式化操作
拿到一块新的硬盘存储设备后,需要先分区、格式化文件系统,然后才能挂载并正常使用。
4.1)fdisk命令
fdisk命令用于管理磁盘分区,提供集添加、删除、转换分区等功能于一身的“一站式分区服务”。
命令格式:fdisk [磁盘名称]
同步分区信息命令:partprobe
格式化分区:mkfs.xfs 设备文件 或 mkfs.ext4 设备文件
fdisk命令中交互式的参数及作用:
参数 |
作用 |
m |
查看全部可用的参数 |
n |
添加新的分区 |
d |
删除某个分区 |
l |
列出所有可用的分区类型 |
t |
改变某个分区的类型 |
p |
查看分区表信息 |
w |
保存并退出 |
q |
不保存直接退出 |
举例1:
[root@linuxprobe ~]# fdisk /dev/sdb //执行分区操作
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p //查看分区表信息
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xe332ce96
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
/dev/sdb2 10487808 14682111 2097152 83 Linux
/dev/sdb4 14682112 16779263 1048576 5 Extended
/dev/sdb5 14684160 14888959 102400 83 Linux
Command (m for help): d //删除一个分区
Partition number (1,2,4,5, default 5): 5
Partition 5 is deleted
Command (m for help): n //新一个分区
Partition type:
p primary (2 primary, 1 extended, 1 free)
l logical (numbered from 5)
Select (default p): p
Selected partition 3
First sector (16779264-41943039, default 16779264):
Using default value 16779264
Last sector, +sectors or +size{K,M,G} (16779264-41943039, default 41943039):
Using default value 41943039
Partition 3 of type Linux and of size 12 GiB is set
Command (m for help): w //保存并退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@linuxprobe ~]#mkfs.xfs /dev/sdb1 //执行普通应用分区的格式化
[root@linuxprobe ~]#mkswap /dev/sdb2 //执行作为专用交换分区的格式化
分区格式化完成后需要挂载方能使用,具体操作详见“6、挂载设备文件”小节。
4.2)du命令
du命令用于查看文件数据占用空间大小,即查看一个或多个文件占用了多大的硬盘空间。
命令格式:du -sh [文件或目录]
举例1:
[root@linuxprobe ~]# du -sh /home/* //查看home目录下所有一级目录分别占用的空间大小。
128M /home/EPEL
123M /home/EPEL-linuxprobe.com.tar.bz2
24K /home/linuxprobe
17M /home/LinuxProbe.pdf
[root@linuxprobe ~]# du -sh /home //查看home目录占用总的空间大小。
267M /home
5、添加交换分区
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以腾出物理内存空间让更活跃的程序服务来使用的技术。其设计目的是为了解决真实物理内存不足的问题,只有当真实的物理内存耗尽后才会调用交换分区的资源。在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍。
首先通过fdisk命令进行分区操作,分区完成后通过SWAP分区专用的格式化命令mkswap对新建的主分区或逻辑分区进行格式化操作(扩展分区不行):
命令格式:mkswap 设备文件名
使用swapon命令把准备好的SWAP分区设备正式挂载到系统中。
命令格式:swapon 设备文件名
举例1:
为了能够让新的交换分区设备在重启后依然生效,需要按下面的格式将相关信息写入到/etc/fstab配置文件中并保存(交换分区一个挂载点可以挂载多个设备文件)。
6、挂载设备文件
分区格式化完成后需要将格式化后的设备文件与一个已存在的目录文件进行关联即挂载。挂载和撤销挂载主要用到两个命令:mount、umount。
6.1)mount命令
mount命令用于挂载文件系统。
命令格式:mount [参数] 设备文件 挂载目录。注:“设备文件”需要先格式化成文件系统。
参数:-a自动检查、挂载所有在/etc/fstab中定义的文件系统;-t指定文件系统的类型,一般不需要使用-t参数来指定文件系统的类型,Linux系统会自动进行判断。
举例1:
[root@linuxprobe ~]# mount /dev/sdb1 /haha/
[root@linuxprobe ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 xfs 497M 119M 379M 24% /boot
/dev/sdb1 ext4 4.8G 20M 4.6G 1% /haha
把挂载信息按照指定的填写格式:“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”写入到/etc/fstab文件中实现永久自动挂载。文件中各位置参数含义如下表。
字段 |
释意 |
设备文件 |
一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier,通过blkid命令查看UUID)
格式:“UUID=0026f461-b0a2-4d90-8304-7cb4d0575432”。 |
挂载目录 |
指定要挂载到的目录,需在挂载前创建好。一个挂载点只能挂载一个设备文件。 |
格式类型 |
指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等。 |
权限选项 |
若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async。 |
是否备份 |
使用dump备份工具,若为1则开机后使用dump进行磁盘备份,为0则不备份。 |
是否自检 |
使用fsck文件系统扫描检查工具,若为1则开机后自动进行磁盘自检,为0则不自检。
根文件系“/”统对应该字段的值应该为1,其他文件系统应该为2,若文件系统无需在启动时扫描检查则设置该字段为0。 |
举例1:
[root@linuxprobe ~]# cat /etc/fstab
# /etc/fstab
# Created by anaconda on Sun Feb 16 14:06:24 2020
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=0026f461-b0a2-4d90-8304-7cb4d0575432 /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
/dev/sdb1 /haha ext4 defaults 0 0
/dev/sdb2 swap swap defaults 0 0
6.2)umount命令
umount命令用于撤销已经挂载的设备文件。
命令格式:umount [设备文件 或 挂载目录]
举例1:
[root@linuxprobe ~]# umount /dev/sdb1
或
[root@linuxprobe ~]# umount /haha
来源:oschina
链接:https://my.oschina.net/u/3706537/blog/3182841