《Linux就该这么学》培训笔记_ch06_存储结构与磁盘划分

《Linux就该这么学》培训笔记_ch06_存储结构与磁盘划分

文章最后会post上书本的笔记照片。

文章主要内容

Linux系统的文件存储结构(FHS标准)

 在Linux系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件,即Linux系统中一切都是文件

Linux系统的文件存储结构和Windows操作系统不同。Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件,以及定义了常见目录的用途。

FHS定义的用户应该把什么类型的文件文件存放到什么位置的规则并不是死规则,用户不一定要遵守

Linux系统中常见的目录名称以及相应内容

目录名称 应放置文件的内容
/boot 开机所需文件—内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户主目录
/bin 存放单用户模式下还可以操作的命令
/lib 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方的软件
/root 系统管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的“共享”临时目录
/proc 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin Linux系统开机时不会使用到的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里

 路径:指的是如何定位到某个文件,分为绝对路径与相对路径。

  • 绝对路径:指的是从根目录(/)开始写起的文件或目录名称;
  • 相对路径:指的是相对于当前路径的写法;

物理设备命名规则(udev)

Linux系统内核中的udev设备管理器会自动把硬件名称规范起来,让用户通过设备的文件名称得知那是什么类型的设备。udev设备管理器的服务一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。

常见的硬件设备及其文件名称:

硬件设备 文件名称
IDE设备(目前很少见) /dev/hd[a-d]
SCSI/SATA/U盘 /dev/sd[a-p]
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0或/dev/ht0

一般的硬盘设备都以“/dev/sd”开头。而一台主机上可以有多块硬盘,因此系统采用a~p来代表16块不同的硬盘(默认从a开始分配,如果超过26个硬盘,那么前26个命名sd[a-z],第27-52个命名为sd[aa-az],第53-78个命名为sd[ba-bz],依此类推),而且硬盘的分区编号也很有讲究:

  • 主分区或扩展分区的编号从1开始,到4结束;
  • 逻辑分区从编号5开始。

两大误区:

  1. 存储设备的名称从a开始按序命名,是由系统内核的识别顺序决定的,与设备在第几个插槽无关;
  2. 分区编号并不代表分区个数,分区的数字编码不一定是强制顺延下来的,也有可能是手工指定的。

硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,里面保存着主引导记录与分区表信息

第一个扇区中,主引导记录需要占用446字节,分区表为64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,即最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区

若4个主分区不够,一般采用3个主分区+1个扩展分区,在扩展分区创建出数个逻辑分区的方法。扩展分区不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表,指向逻辑分区(逻辑分区才是实际意义的分区,且没有个数限制)。

文件系统与数据资料

常见文件系统:

  • Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
  • Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率
  • XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。

数据的保存(inode与block)

  • inode存放文件的权限与属性记录,每个文件占用一个独立的inode表格,默认大小128B。
  • block存放文件的实际内容(大小可以为1KB、2KB、4KB)。
  • 在inode中,记录一个block消耗4B,当文件inode写满,系统会自动分配出一个block专门用于像inode一样记录其他block信息,把各个block块内容串在一起才能读取文件的完整内容。
  • 对于存储文件内容的block块,有两种常见情况(以4KB的block大小为例进行说明)。
    1. 文件很小(1KB),但依然会占用一个block,因此会潜在地浪费3KB。
    2. 文件很大(5KB),那么会占用两个block(5KB-4KB后剩下的1KB也要占用一个block)。

VFS虚拟文件系统:各式各样的文件系统在VFS下隐藏各自的特性和细节,用户在操作文件时就是统一对VFS进行操作,用户无需关心底层的硬盘结构。

硬件设备的添加、分区、格式化及挂载

添加硬盘设备流程:添加设备(略)-->分区(非必要)-->格式化-->挂载

1.分区

fdisk命令:用于管理磁盘分区。格式:fdisk  [磁盘名称]。它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。这是一条交互式命令。

常用参数:

参数 作用
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区类型
t 改变某个分区的类型
p 查看分区表信息
w 保存并退出
q 不保存直接退出
1 fdisk /dev/sdb                                                                  #管理磁盘/dev/sdb分区
2 Command (m for help): n                                                         #添加新的分区
3 Select (default p): p                                                           #创建主分区(主分区p,扩展分区e,逻辑分区l4 Partition number (1-4, default 1): 1                                            #输入主分区编号
5 First sector (2048-41943039, default 2048):                                     #此处敲击回车,默认就从2048开始
6 Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G    #设置分区大小2G
7 Command (m for help): p                                                         #查看磁盘分区信息
8 Command (m for help): w                                                         #保存配置并退出

做好分区后,系统将把该磁盘主分区抽象成/dev/sdb1设备文件,可以使用file命令查看文件属性。

partprobe命令:用于将分区信息同步到内核。当添加了新磁盘分区而系统并没有自动把分区信息同步给Linux内核时,可以通过该命令进行手动同步。

1 file /dev/sdb1    #查看设备文件/dev/sdb1属性
2 partprobe         #查不到,用partprobe命令手动将分区信息同步给Linux内核。推荐连续执行两次,效果更佳。
3 partprobe
4 file /dev/sdb1    #再查,有了

2.格式化

mkfs命令:用于格式化操作。该命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件该命令(通过tab键可以显示)。格式:mkfs.文件类型 磁盘设备文件。

1 mkfs.xfs /dev/sdb1    #把磁盘分区格式化为XFS格式

3.挂载

挂载与卸载的概念:

  • 挂载操作就是把硬件设备与目录进行关联的动作;
  • 卸载操作就是取消硬件设备与目录关联的动作,卸载文件系统就意味不再使用硬件的设备资源;

mount命令:用于挂载文件系统。格式:mount 文件系统 挂载目录。

常用参数:

  • -a:挂载所有在/etc/fstab中定义的文件系统
  • -t:指定文件系统的类型

仅仅用mount命令挂载,系统重启后就会失效。要在/etc/fstab文件追加挂载信息才能永久挂载在/etc/fstab文件中,挂载信息格式:“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”。

挂载信息格式各字段含义:

字段 意义
设备文件 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)
挂载目录 指定要挂载到的目录,需在挂载前创建好
格式类型 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
权限选项 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
是否备份 若为1则开机后使用dump进行磁盘备份,为0则不备份
是否自检 若为1则开机后自动进行磁盘自检,为0则不自检
1 mkdir /newFS                         #创建挂载目录
2 mount /dev/sdb1 /newFS               #把设备/dev/sdb1挂载到/newFS目录
3 vim /etc/fstab                       #往/etc/fstab文件追加挂载信息,实现永久挂载
4 ...
5 /dev/sdb1 /newFS xfs defaults 0 0    #按照“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”的格式编辑挂载信息
6 ...
7 mount -a                             #挂载所有在/etc/fstab中定义的文件系统

df命令:用于查看挂载状态和硬盘使用量信息。常用参数为-h。格式:df -h。

du命令:用于查看文件数据占用量。格式 :du [选项] [文件]。

1 du -sh /*        #查看在Linux系统根目录下所有一级目录分别占用的空间大小
2 du -sh /newFS    #查看/newFS下的内容占了多少容量

umount命令:用于撤销已经挂载的设备文件。格式:umount [挂载点/设备文件]。

umount /dev/sdb1    #卸载/dev/sdb1设备文件

添加交换分区(RHCSA)

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。

交换分区的创建、格式化和挂载与上面普通分区类似。一般来说,交换分区大小为真实物理内存的1.5-2倍就行了

1.分区。创建逻辑分区为例。

 1 fdisk /dev/sdb
 2 Command (m for help): n                                                            #添加分区
 3 Select (default p): e                                                              #先创建扩展分区,才能创建逻辑分区
 4 Partition number (2-4, default 2):                                                 #直接回车
 5 First sector (4196352-20971519, default 4196352):                                  #回车
 6 Last sector, +sectors or +size{K,M,G} (4196352-20971519, default 20971519): +6G    #为扩展分区分配6G空间
 7 Command (m for help): n                                                            #添加分区
 8 Select (default p): l                                                              #创建逻辑分区
 9 First sector (4198400-16779263, default 4198400):                                  #回车
10 Last sector, +sectors or +size{K,M,G} (4198400-16779263, default 16779263): +5G    #为逻辑分区分配5G空间,空间最多不能超过扩展分区的大小
11 Command (m for help): w                                                            #保存并退出

分区完成后就有一个/dev/sdb5的逻辑分区的设备文件了。如果没有,同理,执行两次partprobe命令手动同步分区信息到内核。

2.格式化

mkswap命令:swap分区的专用格式化命令。格式:mkswap [设备文件]。

1 mkswap /dev/sdb5    #格式化分区/dev/sdb5为swap格式

3.挂载

swapon命令:因为swap分区没有挂载点,所以需要用挂载swap分区的专用命令来对swap分区进行挂在操作。格式:swapon [设备文件]。

swapoff命令:卸载swap分区设备。格式:swapoff [设备文件]。

1 swapon /dev/sdb5                   #挂载SWAP分区设备
2 free -m                            #查看SWAP分区大小
3 vim /etc/fstab                     #编辑/etc/fstab文件,实现永久挂载
4 ...
5 /dev/sdb5 swap swap defaults 0 0    
6 ...
7 mount -a       

磁盘容量配额

磁盘容量配额服务:限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。

quota命令:用于进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。

quota命令的软限制和硬限制:

  • 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
  • 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。

RHEL 7系统中已经安装了quota磁盘容量配额服务程序包,但存储设备默认没有开启对quota的支持。需要编辑/etc/fstab配置文件,让指定的目录能够支持quota磁盘配额技术。

1.编辑/etc/fstab文件,添加参数让存储设备支持磁盘配额技术。以/dev/sdb1为例。注意,早期文件系统添加的参数为usrquota参数,而xfs文件系统使用的是uquota或usrquota也行

1 vim /etc/fstab
2 ... 3 UUID=9d5e3b22-75ac-4f47-9e2b-dd33a06b0f81 /boot xfs defaults,uquota 1 2 #添加uquota参数(XFS文件系统,usrquota也行) 4 /dev/sdb1 /newFS ext4 defaults,usrquota 0 0 #添加usrquota参数(早期文件系统专用参数) 5 ...

2.重启系统,使用mount命令查看目录是否已经支持quota磁盘配额技术。

1 reboot
2 mount | grep /boot     #从mount命令的输出结果中,查找出含有/boot字样的行
3 mount | grep /newFS    #如果输出结果有usrquota的字眼,说明该目录已经支持quota磁盘配额技术

3.设置quota磁盘配额。

xfs_quota命令:专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令,格式:xfs_quota [参数] 配额 文件系统。

常用参数:

  • -c参数:用于以参数的形式设置要执行的命令;
  • -x参数:专家模式,让运维人员能够对quota服务进行更多复杂的配置。

edquota命令:用于编辑用户或用户组的quota配额限制。格式:edquota [参数] [用户]。对于早期文件系统,在进行磁盘配额配置之前需要用quotacheck命令生成磁盘内配额数据库。

通过edquota命令进行磁盘配额配置的参数格式:要进行磁盘配额的分区(必须是在/etc/fstab文件中添加过usrquota参数的才有效) 已使用的块空间 磁盘容量软限制 磁盘容量硬限制 已有文件个数 文件数量软限制 文件数量硬限制

quotacheck命令:用于生成磁盘内配额数据库。格式:quotacheck [参数] [目录]。

常用参数:

  • -v 显示指令执行过程
  • -u 扫描磁盘空间时,计算每个用户识别码所占用的目录和文件数目
  • -g 扫描磁盘空间时,计算每个群组识别码所占用的目录和文件数目

实例:

1 chmod -Rf o+w /boot
2 chmod -Rf o+w /newFS
3 xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 linuxprobe' /boot    #为用户linuxprobe在目录/boot中设置软硬限制分别为3m和6m的磁盘容量,软硬限制分别为3个和6个的文件数量
4 quotacheck -vug /newFS                                                        #对于早期的文件系统,要先生成磁盘内配额数据库(aquota.user),才能进行磁盘配额设置
5 edquota -u linuxprobe                                                         #对用户linuxprobe进行磁盘配额
6 /dev/sdb1 0 2048 4096 0 2 4                                                   #编辑磁盘配额参数

配置完毕后,可以用dd命令进行一系列的验证。当用户在磁盘配额的目录里的文件数量/文件的总容量超过isoft/bsoft设定的值,会有提示,而当超过ihard/bhard的值时,则会报错。

软硬方式链接

在Linux系统中存在硬链接和软连接两种文件。

  • 硬链接(hard link):可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,不能跨分区对目录文件进行硬链接
  • 软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。当原始文件被删除后,链接文件将失效。可以理解为Windows系统的快捷方式。

硬链接与单纯的文件复制的区别:

  • 一个文件A,复制一份为文件B。文件A和文件B是完全独立的,修改A不会影响B;
  • 硬链接文件和原始文件实际上是同一个文件,无论是修改硬链接文件还是原始文件,实际上都是再对同一个文件进行修改。

ln命令:用于创建链接文件,格式:ln [选项] 目标。

参数 作用
-s 创建“符号链接”(如果不带-s参数,则默认创建硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程
1 echo "cao ni ma" > test.txt     #创建原始测试文件test.txt
2 ln -s test.txt soft_link.txt    #创建文件test.txt的软链接文件soft_link.txt
3 ln test.txt hard_link.txt       #创建文件test.txt的硬链接文件hard_link.txt
4 rm -rf test.txt                 #删除源文件test.txt
5 cat soft_link.txt               #软连接文件打不开
6 cat hard_link.txt               #硬链接文件能正常打开

书本笔记

-----/*看过许多光怪陆离的风景,才知俗世中最可畏是人心*/-----
原文地址:https://www.cnblogs.com/kaminwu/p/10904392.html