Linux 就该这么学 CH06 存储结构与磁盘划分

1、一切从"/"开始

linux系统中一切都是文件,而且一切文件的路径都是从根目录(/)开始的。系统中的根目录和文件名称都是严格区分大小写的,并且文件名中不能包含/符号。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 绝对路径: 从根目录开始。
  2. 相对路径:相对当前目录开始路径;相对路径不具备普适性。

2、物理设备的命名规则

udev设备管理器的服务会自动把硬件设备规范起来;udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。
在这里插入图片描述
一般的硬盘设备都是以“/dev/sd”开头的,编号从a-p,最多16个不同的硬盘。
硬盘的分区编号的规则如下:
3. 主分区或扩展分区的编号从1开始,到4结束。
4. 逻辑分区从编号5开始。
需要注意的点:

  1. /dev 目录中的ada设备后面的a不是由插槽决定的,而是由系统内核的识别顺序来决定的。
  2. 分区的数组编码不一定是强制顺延下来的,可能是手工指定的。
    在这里插入图片描述
    其中5表示这个设备是一个逻辑分区。
    /dev/sda5表示:这是系统中第一块被识别到的硬件设备中分区编码为5的逻辑分区的设备文件。
    硬盘有许多扇区组成,每个扇区大小为512字节,其中第一个扇区最重要,她保存着主引导记录和分区信息。主引导记录需要446个字节,分区表为64字节,结束符占用2字节,其中分区表中每记录一个分区信息就需要16字节,这样最多只有4个分区信息写到第一个扇区中,这4个分区就是主分区。
    在这里插入图片描述
    为了解决分区不够的问题,可以将第一个扇区中的分区表中的16个字节的空间拿出来指向另外一个分区。即:扩展分区其实并不是一个真正的分区,而更像是一个占有16字节分区表空间的指针–一个指向另外一个分区的指针。这样用户一般会选择3个主分区和1个扩展分区的方法,然后在扩展分区中再创建出几个逻辑分区,从而满足多分区的需求。
    在这里插入图片描述

3、文件系统与数据资料

用户在硬件存储设备中执行文件的建立、读取、修改、转存和控制操作都是依靠文件系统完成的。文件系统的作用是合理规划硬盘,以保证用户的正常使用需求。
linux系统中常见的文件系统有:
Ext3: Ext3是一种日志文件系统,当系统异常宕机是能够避免文件系统资料丢失,并能自动修复数据的不一致与错误,但当数据量大时会需要很长的时间。
Ext4:Ext3的改进版,是RHEL6的默认文件管理系统,支持存储容量高达1EB。Ext4文件系统能够批量分配block块,从而极大提高了读写效率。
XFS: 是一种高性能的日志文件系统,而且是RHEL7中的默认文件管理系统。优势是:发生以外宕机时可以快速回复可能被破坏的文件,强大的日志功能只用花费极低的计算和存储功能,最大支持18EB。
在使用新的硬盘存储时,需要先分区,再格式化文件系统,最后才能挂载并正常使用。硬盘可以不分区,但是必须格式化才能用。
linux把每个文件的权限与属性记录在inode中,而且每个文件占用一个独立的inode表格,该表格大小为128字节,里面记录如下的信息:
在这里插入图片描述
在这里插入图片描述
例子:
对于存储文件内容的block块,以4kB的block大小进行存储为例:

  • 情况1:文件很小(1KB),但依然会占用一个block,因此会浪费3KB。
  • 情况2: 文件很大(5KB),那么会占用两个block(1个4KB+1个1KB)。
    在这里插入图片描述
    查看某个分区的文件系统类型方法:
[root@RHEL Desktop]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2
# 第一种方法,使用file
[root@RHEL Desktop]# file -s  /dev/sda1
/dev/sda1: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)
#第二种方法,使用mount:
[root@RHEL Desktop]# mount | grep sda1
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
#第三种方法,使用df(Disk Free):
[root@RHEL Desktop]# df -hT |grep sda1
/dev/sda1   xfs       497M  119M  379M  24% /boot

4、挂载硬件设备

挂载就是将硬盘与某个目录做关联的动作。挂载的目的是:为了能够通过目录使用到相关的硬盘资料的效果。
一个文件夹只能挂载一个硬盘!

1) 、mount

mount命令用于挂载文件系统,格式为:mount 文件系统 挂载目录。参数如下:

  • -t:指定文件系统的类型。
  • -a:在执行之后自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,有则进行自动挂载操作。
    例程: 把设备/dev/sdb2挂载到/backup目录。
[root@linuxprobe ~]# mount /dev/sdb2 /backup

上面的挂载是临时的,重启系统则会丢失。如果要长期自动挂载则需要把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”写入到/etc/fstab文件中。
在这里插入图片描述
例程: 把设备/dev/sdb2永久的挂载到/backup目录。
在这里插入图片描述

2)、umount

umount命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”。
例如:卸载/dev/sdb2设备文件:

[root@linuxprobe ~]# umount /dev/sdb2

5、添加硬盘设备

添加硬盘的思路:先在虚拟机中添加一块新的硬盘存储设备,然后进行分区,格式化,挂载等操作,最后通过检查系统的挂载状态并真实的使用硬盘来验证硬盘设备是否已经成功添加。
注意:添加硬盘必须关机,因为热插拔的原因,容易出现问题。
添加新硬盘步骤省略。

1)fdisk

fdisk命令用于管理磁盘分区,格式为:fdisk [磁盘名称] 。它可以添加、删除、转换分区等功能。
在这里插入图片描述在这里插入图片描述

2)partprobe

partprobe 命令用于手动将分区信息同步到内核,格式为:partprobe。 一般推荐连续两次,效果很好。

3) mkfs

mkfs命令用于格式化分区系统。格式为: mkfs.XXX 磁盘分区。
其中mkfs.XXX 可以是:mkfs.ext3 mkfs.fat mkfs.xfs mkfs.ext4 mkfs.vfat 等。
例如将/dev/sdb1格式化为xfs系统。
mkfs.xfs /dev/sdb1

4) df 查看挂载状态

df用于查看挂载之后是否成功的状态,格式为 df -h 。

磁盘分区、格式化、挂载步骤:
1、fdisk /dev/sdb 来尝试管理磁盘sdb.
2、看到提示后输入p来查看硬盘设备内已经有的分区信息。
3、再看到提示后输入n来添加新的分区,输入p或e来选择创建主分区还是扩展分区。
4、输入分区号,在fist sector处直接敲击回车,因为不需要指定起始位置。
5、在last sector处,输入指定该分区的大小,如+2G或+512M。
6、最后可以再次输入p查看分区情况,然后再输入w来保存分区。
7、接着使用mkfs命令来格式化分区。

[root@RHEL Desktop]# fdisk /dev/sdb  ## 管理硬盘
Welcome to fdisk (util-linux 2.23.2).
...
Command (m for help): p   #查看分区情况
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
....
Command (m for help): n #新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p  #建立主分区
Partition number (1-4, default 1): 1  #指定分区号
First sector (2048-10485759, default 2048):   ##直接回车
Last sector, +sectors or +size{K,M,G} (4194304-10485759, default 10485759): +2G  ##输入分区大小
Partition 1 of type Linux and of size 2 GiB is set
Command (m for help): p  
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1         4194304     8388607     2097152   83  Linux
Command (m for help): n  #新建分区sdb2,主分区,1G
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p 
Partition number (2-4, default 2): 2
First sector (2048-10485759, default 2048):  
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-4194303, default 4194303): +1G
Partition 2 of type Linux and of size 1 GiB is set

Command (m for help): n  ##新建sdb4,扩展分区,512M。
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): e
Partition number (3,4, default 3): 4
First sector (2099200-10485759, default 2099200): 
Using default value 2099200
Last sector, +sectors or +size{K,M,G} (2099200-4194303, default 4194303): +512M
Partition 4 of type Extended and of size 512 MiB is set

Command (m for help): p ##查看分区情况
....
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1         4194304     8388607     2097152   83  Linux
/dev/sdb2            2048     2099199     1048576   83  Linux
/dev/sdb4         2099200     3147775      524288    5  Extended

Command (m for help): w  ##保存分区信息
The partition table has been altered!
...
[root@RHEL Desktop]# partprobe  #将分区信息手动同步到内核。推荐连续两次
[root@RHEL Desktop]# partprobe
[root@RHEL Desktop]# mkfs  
mkfs         mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs
mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat    
[root@RHEL Desktop]# mkfs.xfs /dev/sdb1  ##格式化分区
...
[root@RHEL Desktop]# mkfs.ext4 /dev/sdb2
...
Writing superblocks and filesystem accounting information: done

[root@RHEL Desktop]# mkfs.xfs /dev/sdb4
...
mkfs.xfs: Use the -f option to force overwrite.
[root@RHEL Desktop]# file -s /dev/sdb1   ##查看分区系统格式
/dev/sdb1: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)
[root@RHEL Desktop]# file -s /dev/sdb2
/dev/sdb2: Linux rev 1.0 ext4 filesystem data, UUID=5b7b0944-9981-4977-bd82-8af5639845e4 (extents) (64bit) (large files) (huge files)
[root@RHEL Desktop]# file -s /dev/sdb4
/dev/sdb4: x86 boot sector, code offset 0x0
##挂载信息
[root@RHEL Desktop]# mount /dev/sdb1 Share  
##查看挂载成功与否状态
[root@RHEL Desktop]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
...
##看到下面这个则表示成功
/dev/sdb1                   2.0G   33M  2.0G   2% /root/Desktop/Share

注:

  • 分区之后必须挂载,下次开机之后才会有效果。
  • 使用mount挂载的设备文件会在系统下一次重启的时候失效。如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件/etc/fstab中。

5) du

du命令用于查看文件数据占有量,即一个或多个文件占用了多大的磁盘空间,格式为: du [选项] [文件]。
du -sh /Share/ ##查看Share目录下所有文件的占用空间大小。

6、添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先规划一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。即SWAP是将一部分硬盘空间临时充当内存来使用,目的是降低物理内存的负载能力。
只有当真实的物理内存耗尽才会调用交换分区的资源。
在生产环境中,交换分区的大小一般是真实内存的1.5~2倍。

1)mkswap

mkswap命令用于在一个文件或设备上建立交换分区。格式为:mkswap 文件或目录。
在建立完之后要用sawpon命令开始使用这个交换分区。

2) sawpon

swapon命令用于激活Linux中的交换空间。

3) sawpoff

swapoff命令用于关闭指定的交换空间(包括交换文件和交换分区)。
例程:改变/dev/sdb2的文件格式,然后将其制作成swap。

[root@RHEL Desktop]# free -m
             total       used       free     shared    buffers     cached
Mem:          3939        848       3090         10          0        248
-/+ buffers/cache:        599       3339
Swap:         2047          0       2047    ##old swap size
[root@RHEL Desktop]# mkswap /dev/sdb2   
mkswap: /dev/sdb2: warning: wiping old ext4 signature.
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=931cec62-22a5-455c-aa8f-72ab61f08dab
[root@RHEL Desktop]# file -s /dev/sdb2
/dev/sdb2: Linux/i386 swap file (new style), version 1 (4K pages), size 262143 pages, no label, UUID=931cec62-22a5-455c-aa8f-72ab61f08dab
[root@RHEL Desktop]# swapon /dev/sdb2
[root@RHEL Desktop]# free -m
             total       used       free     shared    buffers     cached
Mem:          3939        859       3079         10          0        251
-/+ buffers/cache:        606       3332
Swap:         3071          0       3071   ##new swap size
[root@RHEL Desktop]# swapoff /dev/sdb2   ##off swap
[root@RHEL Desktop]# free -m
             total       used       free     shared    buffers     cached
Mem:          3939        861       3077         10          0        251
-/+ buffers/cache:        608       3330
Swap:         2047          0       2047

如果要让新的交换分区设备在重启之后依然有效,则需要按格式写到fstab中。

[root@RHEL Desktop]# vim /etc/fstab
/dev/sdb2   swap     swap  defaults 0 0  

7、磁盘容量配额

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

1)quota 命令

quota 命令用于显示用户或者工作组的磁盘配额信息。输出信息包含磁盘使用或配额限制。格式为:quota [参数] [用户名]。
参数:

  • -g:列出群组的磁盘空间限制;
  • -q:简明列表,只列出超过限制的部分;
  • -u:列出用户的磁盘空间限制;
  • -v:显示该用户或群组,在所有挂入系统的存储设备的空间限制;
    例程:
    查看当前用户(root)的磁盘限额情况。
    [root@RHEL Desktop]# quota -guvs

查看felix的磁盘限额情况
[root@RHEL Desktop]# quota -uvs felix
磁盘容量配额服务有软限制和硬限制的功能:

  • 软限制:当达到软限制之后会提示用户,但是仍然允许用户在限定的额度内继续使用。
  • 硬限制:当达到硬限制时会提示用户,且强制终止用户操作。
    要想让硬盘设备支持quota磁盘容量配额服务,修改/etc/fstab文件,在UUID行defaults参数后增加uquota参数. 在RHEL7中使用的是uquota参数。
[root@RHEL Desktop]# vim /etc/fsta
/dev/mapper/rhel_rhel-root /    xfs     defaults        1 1
UUID=7900b793-7a09-4f89-855a-906039562f51 /boot                   xfs     defaults,uquota        1 2
[root@RHEL Desktop]# reboot
## reboot finished,use mount commond to check ,and will find usrquota.
[root@RHEL Desktop]# mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)

2) xfs_quota

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

  • -c : 用于以参数的形式设置要执行的命令。
  • -x :专家模式,让运维人员能够对quota服务进行更多复杂的配置。
    例程: 用xfs_quota 命令来设置用户felix 对/boot目录的quota磁盘容量配额。具体配额为:硬盘使用量的软限制和硬限制分别为3MB和6MB,创建文件的个数为:软限制和硬限制分别为3个和6个。
#先更改root目录权限
[root@RHEL Desktop]# chmod -Rf o+w /boot
#按下面的格式来设置, 使用limit来限制,命令要用单引号(' ').
[root@RHEL Desktop]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 felix' /boot
#查看设置的结果
[root@RHEL Desktop]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root            95348          0          0     00 [--------]
felix               0       3072       6144     00 [--------]
#用户尝试创建
[root@RHEL Desktop]# su - felix
Last login: Sun Sep 15 20:56:38 EDT 2019 on pts/0
#大于限制,报错
[felix@RHEL ~]$ dd if=/dev/zero of=/boot/test.txt bs=8M count=1
dd: error writing ‘/boot/test.txt’: Disk quota exceeded
1+0 records in
0+0 records out
6291456 bytes (6.3 MB) copied, 0.00433282 s, 1.5 GB/s
#小于限制,正常。
[felix@RHEL ~]$ dd if=/dev/zero of=/boot/test.txt bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.00399135 s, 1.3 GB/s
[felix@RHEL ~]$ exit
logout

3) edquota

edquota命令用于编辑用户的quota配额限制,格式为 edquota [参数] [用户]。

  • -u表示对哪个用户设置。
  • -g表示对哪个用户组进行设置。
    例程:修改hard的限制。
#更改限制,将hard值改为8192
[root@RHEL Desktop]# edquota -u felix
sk quotas for user felix (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sda1                      8192       3072       8192          1        3        6
[root@RHEL Desktop]# su - felix
Last login: Thu Sep 19 20:55:14 EDT 2019 on pts/0
[felix@RHEL ~]$ dd if=/dev/zero of=/boot/test.txt bs=8M count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB) copied, 0.0187356 s, 448 MB/s

8、软硬方式链接

linux中有软链接和硬链接两种文件。

  • 硬链接:指的是指向原始文件inode的指针,系统不为他分配独立的inode文件。所以硬链接和原始文件是同一个文件,只是名字不同。每添加一个硬链接inode就会增加一,而只有当该文件的inode连接数为0时,才算彻底删除它了。硬链接不能对目录进行操作,不能跨硬盘来做。
    个人理解,当一个文件被写入时,内容被写入到存储的一个区域,同时建立一个源指针来指向该内存(源文件),当加硬链接之后,就是将增加了指针,所以即使源指针被删除,还有其他指针执行这块内存,所以文件还在。当指针都被删除时,其实内容还在内存中,只是没有了访问该内存的入口(指针文件)。硬盘数据恢复大概也是这个道理。
  • 软链接:仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行连接。但是当原始文件被删除之后,链接文件也将失效。软链接inode不会增加。
    个人理解:软链接就是window上的快捷方式。

1) ln

ln命令用于创建链接文件,格式为: ln [选项] 目标。
在这里插入图片描述
例程:软链接的设置。

[root@RHEL Desktop]# cat test.txt
i love linux.
i love linux.
#创建软链接
[root@RHEL Desktop]# ln -s test.txt readme.txt
[root@RHEL Desktop]# cat readme.txt 
i love linux.
i love linux.
[root@RHEL Desktop]# cat test.txt
i love linux.
i love linux.
#查看inode 不会增加,还是1.
[root@RHEL Desktop]# ls -l readme.txt 
lrwxrwxrwx. 1 root root 8 Sep 19 21:37 readme.txt -> test.txt
[root@RHEL Desktop]# ls -l test.txt 
-rwSrwxrwx+ 1 root root 28 Aug 26 23:51 test.txt
#删除源文件
[root@RHEL Desktop]# rm -f test.txt 
#软链接文件的名称还在,但是不能读取内容了
[root@RHEL Desktop]# cat readme.txt 
cat: readme.txt: No such file or directory
[root@RHEL Desktop]# ls -l readme.txt 
lrwxrwxrwx. 1 root root 8 Sep 19 21:37 readme.txt -> test.txt
[root@RHEL Desktop]# rm -f readme.txt 
[root@RHEL Desktop]# ls -l readme.txt
ls: cannot access readme.txt: No such file or directory

例程:创建硬链接。

#创建硬链接
[root@RHEL Desktop]# ln test.sh readme.txt
[root@RHEL Desktop]# ls -l test.sh
-rw-rwxr--+ 2 root root 46 Aug 29 21:02 test.sh
[root@RHEL Desktop]# cat test.sh
#!/bin/bash
#for example by root
pwd
ls -al


[root@RHEL Desktop]# cat readme.txt 
#!/bin/bash
#for example by root
pwd
ls -al

#删除源文件
[root@RHEL Desktop]# rm -f test.sh
#硬链接文件还可以被读取
[root@RHEL Desktop]# cat readme.txt 
#!/bin/bash
#for example by root
pwd
ls -al


[root@RHEL Desktop]# 

posted @ 2019-09-15 21:39  远航路上ing  阅读(280)  评论(0编辑  收藏  举报