zoukankan      html  css  js  c++  java
  • LINUX 存储结构与管理硬盘

    FHS:Filesystem Hierarchy Standard)采用倒树状结构来存放文件,以及定义了常见目录的用途。

     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

    当文件系统发生错误时,将一些丢失的文件片段存放在这里

     物理设备的命名规则

    在Linux系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。Linux系统中常见的硬件设备的文件名称如表6-2所示。

    表6-2                                             常见的硬件设备及其文件名称

    硬件设备 文件名称
    IDE设备 /dev/hd[a-d]
    SCSI/SATA/U盘 /dev/sd[a-z]
    virtio设备 /dev/vd[a-z]
    软驱 /dev/fd[0-1]
    打印机 /dev/lp[0-15]
    光驱 /dev/cdrom
    鼠标 /dev/mouse
    磁带机 /dev/st0或/dev/ht0

    Tips

    所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向其它分区的指针,这种指针结构将形成一个单向链表。因此扩展分区自身不能够存储数据,用户需要在其指向的对应分区上进行操作,称之为逻辑分区。

    Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。

    Ext2:最早可追溯到1993年,是Linux系统第一个商业级文件系统,基本沿袭的是Unix文件系统的设计标准。但由于不包含读写日志功能,数据丢失可能性很大,能不用就不要用,或者顶多建议用于SD存储卡或U盘。

    Ext3:是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来,然后再实际操作,以便在发生异常宕机后能回溯追踪到被中断的部分。Ext3能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。

    Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。现在很多主流服务器也会使用。

    XFS:是一种高性能的日志文件系统,而且是RHEL 7/8中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。

    inode:每个文件占用一个独立的inode表格,该表格的大小默认为128字节,里面记录着如下信息:

    该文件的访问权限(read、write、execute);

    该文件的所有者与所属组(owner、group);

    该文件的大小(size);

    该文件的创建或内容修改时间(ctime);

    该文件的最后一次访问时间(atime);

    该文件的修改时间(mtime);

    文件的特殊权限(SUID、SGID、SBIT);

    该文件的真实数据地址(point)。

    VFS(Virtual File System,虚拟文件系统)

    挂载 ------》 使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”

    mount命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。mount命令中可用的参数及作用如表6-3所示。挂载是在使用硬件设备前所执行的最后一步操作。只需使用mount命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了。对于比较新的Linux系统来讲,一般不需要使用-t参数来指定文件系统的类型,Linux系统会自动进行判断。而mount 中的-a参数则厉害了,它会在执行后自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。

    表6-3                                             mount命令中的参数以及作用

    参数 作用
    -a 挂载所有在/etc/fstab中定义的文件系统
    -t 指定文件系统的类型
    [root@linuxprobe ~]# mount /dev/sdb2 /backup   (表示:把设备/dev/sdb2挂载到/backup目录,只需要在mount命令中填写设备与挂载目录参数就行,系统会自动去判断要挂载文件的类型)

    blkid命令用于显示设备的属性信息,英文全称为:“block id”,语法格式为:“blkid [设备名]”。
    [root@linuxprobe ~]# blkid
    /dev/sdb1: UUID="2db66eb4-d9c1-4522-8fab-ac074cd3ea0b" TYPE="xfs" PARTUUID="eb23857a-01"
    /dev/sdb2: UUID="478fRb-1pOc-oPXv-fJOS-tTvH-KyBz-VaKwZG" TYPE="ext4" PARTUUID="eb23857a-02"

    有了设备的UUID值之后,以后就可以用它挂载网络设备了:

         [root@linuxprobe ~]# mount UUID=478fRb-1pOc-oPXv-fJOS-tTvH-KyBz-VaKwZG /backup

    永久挂载:写入到/etc/fstab文件中。这个文件中包含着挂载所需的诸多信息项目,一旦配置好之后就能一劳永逸了。

    表6-4                        用于挂载信息的指定填写格式中,各字段所表示的意义

    字段 意义
    设备文件 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)
    挂载目录 指定要挂载到的目录,需在挂载前创建好
    格式类型 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
    权限选项 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
    是否备份 若为1则开机后使用dump进行磁盘备份,为0则不备份
    是否自检 若为1则开机后自动进行磁盘自检,为0则不自检
    [root@linuxprobe ~]# vim /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Tue Jul 21 05:03:40 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.
    #
    # After editing this file, run 'systemctl daemon-reload' to update systemd
    # units generated from this file.
    #
    /dev/mapper/rhel-root                     /        xfs     defaults    0 0
    UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot    xfs     defaults    0 0
    /dev/mapper/rhel-swap                     swap     swap    defaults    0 0
    /dev/sdb2                                 /backup  ext4    defaults    0 0

    挂载光盘 :/media/cdrom目录,光盘设备的文件系统格式是iso9660:
    [root@linuxprobe ~]# vim /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Tue Jul 21 05:03:40 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.
    #
    # After editing this file, run 'systemctl daemon-reload' to update systemd
    # units generated from this file.
    #
    /dev/mapper/rhel-root                     /              xfs        defaults       0 0
    UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot          xfs        defaults       0 0
    /dev/mapper/rhel-swap                     swap           swap       defaults       0 0
    /dev/sdb2                                 /backup        ext4       defaults       0 0
    /dev/cdrom                                /media/cdrom   iso9660    defaults       0 0

    写入到/etc/fstab文件中的设备信息并不会立即生效,需要使用mount -a参数进行自动挂载:

         [root@linuxprobe ~]# mount -a

    df命令用于已挂载的磁盘空间使用情况,英文全称为:“disk free”,语法格式为:“df -h”。

    [root@linuxprobe~]# df -h
    Filesystem             Size  Used Avail Use% Mounted on
    devtmpfs               969M     0  969M   0% /dev
    tmpfs                  984M     0  984M   0% /dev/shm
    tmpfs                  984M   18M  966M   2% /run
    tmpfs                  984M     0  984M   0% /sys/fs/cgroup
    /dev/mapper/rhel-root   17G  3.9G   14G  23% /
    /dev/sda1             1014M  152M  863M  15% /boot
    /dev/sdb2              480M   20M  460M   4% /backup
    tmpfs                  197M   16K  197M   1% /run/user/42
    tmpfs                  197M  3.5M  194M   2% /run/user/0
    /dev/sr0               6.7G  6.7G     0 100% /media/cdrom

    网络存储设备挂载:
    建议您加上_netdev参数。加上后系统会等待联网成功后再尝试挂载这块网络存储设备,避免了开机时间过长或失败的情况,建议第17章节学iSCSI技术时可以用上。
    [root@linuxprobe ~]# vim /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Tue Jul 21 05:03:40 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.
    #
    # After editing this file, run 'systemctl daemon-reload' to update systemd
    # units generated from this file.
    #
    /dev/mapper/rhel-root                       /              xfs       defaults            0 0
    UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b   /boot          xfs       defaults            0 0
    /dev/mapper/rhel-swap                       swap           swap      defaults            0 0
    /dev/sdb2                                   /backup        ext4      defaults,_netdev    0 0
    /dev/cdrom /media/cdrom iso9660 defaults 0 0

    卸载设备或文件系统:umount命令用于卸载设备或文件系统,英文全称为:“un mount”,语法格式为:“umount [设备文件/挂载目录]”。

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

    lsblk 命令用于已挂载的磁盘空间使用情况,英文全称为:“list block id”,输入后回车执行即可。

    [root@linuxprobe ~]# lsblk 
    NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda             8:0    0   20G  0 disk 
    ├─sda1          8:1    0    1G  0 part /boot
    └─sda2          8:2    0   19G  0 part 
      ├─rhel-root 253:0    0   17G  0 lvm  /
      └─rhel-swap 253:1    0    2G  0 lvm  [SWAP]
    sr0            11:0    1  6.6G  0 rom  /media/cdrom
    
    
    

    fdisk命令:用新建、修改及删除磁盘的分区表信息,英文全称为:“format disk”,语法格式为:“fdisk 磁盘名称”。

    在Linux系统中,管理硬盘设备最常用的方法就当属fdisk命令了。fdisk命令用于管理磁盘分区,格式为“fdisk  [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。不过与前面讲解的直接写到命令后面的参数不同,这条命令的参数(见表6-5)是交互式的,一问一答的形式,因此在管理硬盘设备时特别方便,可以根据需求动态调整。

    表6-5                                              fdisk命令中的参数以及作用

    参数 作用
    m 查看全部可用的参数
    n 添加新的分区
    d 删除某个分区信息
    l 列出所有可用的分区类型
    t 改变某个分区的类型
    p 查看分区表信息
    w 保存并退出
    q 不保存直接退出
    分区的实际操作过程:

    第1步:首先使用fdisk命令来尝试管理/dev/sdb硬盘设备。在看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:

    [root@linuxprobe ~]# fdisk /dev/sdb
    
    Welcome to fdisk (util-linux 2.32.1).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    Device does not contain a recognized partition table.
    Created a new DOS disklabel with disk identifier 0x88b2c2b0.
    
    Command (m for help): p
    Disk /dev/sdb: 20 GiB, 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
    Disklabel type: dos
    Disk identifier: 0x88b2c2b0
    

    第2步:输入参数n尝试添加新的分区。系统会要求您是选择继续输入参数p来创建主分区,还是输入参数e来创建扩展分区。这里输入参数p来创建一个主分区:

    Command (m for help): n
    Partition type
       p   primary (0 primary, 0 extended, 4 free)
       e   extended (container for logical partitions)
    Select (default p): p
    

    第3步:在确认创建一个主分区后,系统要求您先输入主分区的编号。在前文得知,主分区的编号范围是1~4,因此这里输入默认的1就可以了。接下来系统会提示定义起始的扇区位置,这不需要改动,敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入+2G即可创建出一个容量为2GB的硬盘分区。

    Partition number (1-4, default 1): 1
    First sector (2048-41943039, default 2048): 此处敲击回车即可
    Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +2G
    
    Created a new partition 1 of type 'Linux' and of size 2 GiB.

    第4步:再次使用参数p来查看硬盘设备中的分区信息。果然就能看到一个名称为/dev/sdb1、起始扇区位置为2048、结束扇区位置为4196351的主分区了。这时候千万不要直接关闭窗口,而应该敲击参数w后回车,这样分区信息才是真正的写入成功啦。

    Command (m for help): p
    Disk /dev/sdb: 20 GiB, 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
    Disklabel type: dos
    Disk identifier: 0x88b2c2b0
    
    Device     Boot Start     End Sectors Size Id Type
    /dev/sdb1        2048 4196351 4194304   2G 83 Linux
    
    Command (m for help): w
    The partition table has been altered.
    Calling ioctl() to re-read partition table.
    Syncing disks.
    

    分区信息中第六个字段的Id值代表标识该分区作用的编码,帮助用户快速了解该分区的作用,一般没必要修改。使用l参数查看都有哪些的磁盘编码,然后下一个章节做SWAP时再修改吧:

    Command (m for help): l  
    
     0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
     1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
     2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
     3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
     4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
     5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
     6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
     7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
     8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
     9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
     a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
     b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
     c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
     e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        
     f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
    10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
    11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
    12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
    14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor      
    16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary  
    17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
    18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE 
    1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
    1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
    1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT   
    

    第5步:在上述步骤执行完毕之后,Linux系统会自动把这个硬盘主分区抽象成/dev/sdb1设备文件。可以使用file命令查看该文件的属性,但是在讲课和工作中发现,有些时候系统并没有自动把分区信息同步给Linux内核,而且这种情况似乎还比较常见(但不能算作是严重的bug)。我们可以输入partprobe命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个杀手锏百试百灵,一定会有用的。

    [root@linuxprobe ]# file /dev/sdb1
    /dev/sdb1: cannot open `/dev/sdb1' (No such file or directory)
    [root@linuxprobe ]# partprobe
    [root@linuxprobe ]# partprobe
    [root@linuxprobe ]# file /dev/sdb1
    /dev/sdb1: block special

    如果硬件存储设备没有进行格式化,则Linux系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在Linux系统中用于格式化操作的命令是mkfs。这条命令很有意思,因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果:

    [root@linuxprobe ~]# mkfs
    mkfs         mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat    
    mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs     
    

    对!这个mkfs命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。例如要格式分区为XFS的文件系统,则命令应为mkfs.xfs /dev/sdb1。

    [root@linuxprobe ~]# mkfs.xfs /dev/sdb1
    meta-data=/dev/sdb1              isize=512    agcount=4, agsize=131072 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=1, sparse=1, rmapbt=0
             =                       reflink=1
    data     =                       bsize=4096   blocks=524288, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    

    df -h命令来查看挂载状态和硬盘使用量信息。
    [root@linuxprobe ~]# mkdir /newFS
    [root@linuxprobe ~]# mount /dev/sdb1 /newFS
    [root@linuxprobe ~]# df -h
    Filesystem             Size  Used Avail Use% Mounted on
    devtmpfs               969M     0  969M   0% /dev
    tmpfs                  984M     0  984M   0% /dev/shm
    tmpfs                  984M  9.6M  974M   1% /run
    tmpfs                  984M     0  984M   0% /sys/fs/cgroup
    /dev/mapper/rhel-root   17G  3.9G   14G  23% /
    /dev/sr0               6.7G  6.7G     0 100% /media/cdrom
    /dev/sda1             1014M  152M  863M  15% /boot
    tmpfs                  197M   16K  197M   1% /run/user/42
    tmpfs                  197M  3.5M  194M   2% /run/user/0
    /dev/sdb1              2.0G   47M  2.0G   3% /newFS
    

    du命令用查看分区或目录所占用的磁盘容量大小,英文全称为:“Disk Usage”,语法格式为:“du -sh 目录名称”。

    既然存储设备已经顺利挂载,接下来就可以尝试通过挂载点目录向存储设备中写入文件了。在写入文件之前,先介绍一个用于查看文件数据占用量的du命令,其格式为“du [选项] [文件]”。简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。

    在使用Window系统时,我们总会遇到C盘容量不足,清理垃圾后又很快被占满的情况。在Linux系统中可以使用du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小,一秒钟找到是那个小坏蛋目录占用的空间最多:

    [root@linuxprobe ~]# du -sh /*
    0	/bin
    113M	/boot
    0	/dev
    29M	/etc
    12K	/home
    0	/lib
    0	/lib64
    6.7G	/media
    0	/mnt
    0	/newFS
    0	/opt
    0	/proc
    8.6M	/root
    9.6M	/run
    0	/sbin
    0	/srv
    0	/sys
    12K	/tmp
    3.5G	/usr
    155M	/var
    

    先从某些目录中复制过来一批文件,然后查看这些文件总共占用了多大的容量:

    [root@linuxprobe ~]# cp -rf /etc/* /newFS
    [root@linuxprobe ~]# ls /newFS
    adjtime                     hostname                  profile.d
    aliases                     hosts                     protocols
    alsa                        hosts.allow               pulse
    alternatives                hosts.deny                qemu-ga
    anacrontab                  hp                        qemu-kvm
    asound.conf                 idmapd.conf               radvd.conf
    ………………省略部分输入信息………………
    [root@linuxprobe ~]# du -sh /newFS
    39M /newFS/
    

    细心的读者一定还记得,前面在讲解mount命令时提到,使用mount命令挂载的设备文件会在系统下一次重启的时候失效。如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中:

    [root@linuxprobe ~]# vim /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Tue Jul 21 05:03:40 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.
    #
    # After editing this file, run 'systemctl daemon-reload' to update systemd
    # units generated from this file.
    #
    /dev/mapper/rhel-root                     /                      xfs      defaults        0 0
    UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot                  xfs      defaults        0 0
    /dev/mapper/rhel-swap                     swap                   swap     defaults        0 0
    /dev/cdrom                                /media/cdrom           iso9660  defaults        0 0 
    /dev/sdb1                                 /newFS                 xfs      defaults        0 0 
    
    
    
    添加交换分区

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

    交换分区的创建过程与前文讲到的挂载并使用存储设备的过程非常相似。在对/dev/sdb存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍,为了让大家更明显地感受交换分区空间的变化,这里取出一个大小为5GB的主分区作为交换分区资源:

    [root@linuxprobe ~]# fdisk /dev/sdb
    Welcome to fdisk (util-linux 2.32.1).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    Command (m for help): n
    Partition type
       p   primary (1 primary, 0 extended, 3 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (2-4, default 2): 敲击回车即可
    First sector (4196352-41943039, default 4196352): 敲击回车即可
    Last sector, +sectors or +size{K,M,G,T,P} (4196352-41943039, default 41943039): +5G
    
    Created a new partition 2 of type 'Linux' and of size 5 GiB.
    

    上面操作结束后,我们就得到了一个容量为5G的新分区,试试修改下硬盘的标识码吧~改成82(Linux swap)方便以后知道它的作用:

    Command (m for help): t
    Partition number (1,2, default 2): 2
    Hex code (type L to list all codes): 82
    
    Changed type of partition 'Linux' to 'Linux swap / Solaris'.
    
    Command (m for help): p 
    Disk /dev/sdb: 20 GiB, 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
    Disklabel type: dos
    Disk identifier: 0x88b2c2b0
    
    Device     Boot   Start      End  Sectors Size Id Type
    /dev/sdb1          2048  4196351  4194304   2G 83 Linux
    /dev/sdb2       4196352 14682111 10485760   5G 82 Linux swap / Solaris
    

    搞定,敲击w参数退出分区表编辑工具:

    Command (m for help): w
    The partition table has been altered.
    Calling ioctl() to re-read partition table.
    Syncing disks.
    

    mkswap命令用于对新设备做交换分区格式化,英文全称为:“make swap”,语法格式为:“mkswap 设备名称”。

    [root@linuxprobe ~]# mkswap /dev/sdb2
    Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
    no label, UUID=45a4047c-49bf-4c88-9b99-f6ac93908485
    

    swapon命令用于激活新的交换分区设备,英文全称为:“swap on”,语法格式为:“swapon设备名称”。

    使用swapon命令把准备好的SWAP硬盘设备正式挂载到系统中,读者可以使用free -m命令查看交换分区的大小变化(由2047MB增加到7167MB):

    [root@linuxprobe ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:           1966        1391         105          12         469         384
    Swap:          2047           9        2038
    [root@linuxprobe ~]# swapon /dev/sdb2
    [root@linuxprobe ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:           1966        1395         101          12         469         380
    Swap:          7167           9        7158
    

    为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入到配置文件中,并记得保存:

    [root@linuxprobe ~]# vim /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Tue Jul 21 05:03:40 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.
    #
    # After editing this file, run 'systemctl daemon-reload' to update systemd
    # units generated from this file.
    #
    /dev/mapper/rhel-root                        /               xfs        defaults    1 1
    UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b    /boot           xfs        defaults    1 2
    /dev/mapper/rhel-swap                        swap            swap       defaults    0 0
    /dev/cdrom                                   /media/cdrom    iso9660    defaults    0 0 
    /dev/sdb1                                    /newFS          xfs        defaults    0 0 
    /dev/sdb2                                    swap            swap       defaults    0 0 

    磁盘容量配额

    使用quota技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota技术还有软限制和硬限制的功能。

    软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。

    硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。

    RHEL 8系统中已经安装了quota磁盘容量配额服务程序包,但存储设备却默认没有开启对quota技术的支持,此时需要手动编辑配置文件再重启一次,让系统中的启动目录(/boot)能够支持quota磁盘配额技术。

    [root@linuxprobe ~]# vim /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Tue Jul 21 05:03:40 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.
    #
    # After editing this file, run 'systemctl daemon-reload' to update systemd
    # units generated from this file.
    #
    /dev/mapper/rhel-root                        /             xfs        defaults         1 1
    UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b    /boot         xfs        defaults,uquota  1 2
    /dev/mapper/rhel-swap                        swap          swap       defaults         0 0
    /dev/cdrom                                   /media/cdrom  iso9660    defaults         0 0 
    /dev/sdb1                                    /newFS        xfs        defaults         0 0 
    /dev/sdb2                                    swap          swap       defaults         0 0 
    [root@linuxprobe ~]# reboot

    另外,对于学习过早期的Linux系统,或者具有RHEL 5/6系统使用经验的读者来说,这里需要特别注意。早期的Linux系统要想让硬盘设备支持quota磁盘容量配额服务,使用的是usrquota参数,而RHEL 7/8系统使用的则是uquota参数。在重启系统后使用mount命令查看,即可发现/boot目录已经支持quota磁盘配额技术了:

    [root@linuxprobe ~]# mount | grep boot
    /dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)

    接下来创建一个用于检查quota磁盘容量配额效果的用户tom,并针对/boot目录增加其他人的写权限,保证用户能够正常写入数据:

    [root@linuxprobe ~]# useradd tom
    [root@linuxprobe ~]# chmod -R o+w /boot
    

    xfs_quota命令用于管理设备的磁盘容量配额,语法格式为:“xfs_quota [参数] 配额 文件系统”。

    这是一个专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令,其中,-c参数用于以参数的形式设置要执行的命令;-x参数是专家模式,让运维人员能够对quota服务进行更多复杂的配置。接下来使用xfs_quota命令来设置用户tom对/boot目录的quota磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个。

    [root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
    [root@linuxprobe ~]# xfs_quota -x -c report /boot
    User quota on /boot (/dev/sda1)
                                   Blocks                     
    User ID          Used       Soft       Hard    Warn/Grace     
    ---------- -------------------------------------------------- 
    root           114964          0          0     00 [--------]
    tom                 0       3072       6144     00 [--------]

    上面所使用的参数分为两组,分别是isoft/ihard与bsoft/bhard,我们来深入的讲解一下。在6.3小节中曾经讲过,在Linux系统中每个文件都会被一个独立的inode信息块所保存属性信息,一个文件对应一个inode信息块,所有isoft和ihard就是通过限制了系统最大使用的inode个数来限制了文件格式。bsoft和bhard则是代表文件所占用的block块大小,也就是文件最多所占用的总统计。

    soft是软限制,超过了也只是写到日志中,不对用户行为进行限制。而hard是硬限制,一旦超过就会马上进行禁止,再也不能创建或新占任何的硬盘容量。

    当配置好上述的各种软硬限制后,尝试切换到这个普通用户,然后分别尝试创建一个体积为5MB和8MB的文件。可以发现,在创建8MB的文件时受到了系统限制:

    [root@linuxprobe ~]# su - tom
    [tom@linuxprobe ~]$ cd /boot
    [tom@linuxprobe boot]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
    1+0 records in
    1+0 records out
    5242880 bytes (5.2 MB, 5.0 MiB) copied, 0.00298178 s, 1.8 GB/s
    [tom@linuxprobe boot]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
    dd: error writing '/boot/tom': Disk quota exceeded
    1+0 records in
    0+0 records out
    4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.00398607 s, 1.1 GB/s

    棒棒的!

    edquota命令用于管理系统的磁盘配额,英文全称为:“edit quota”,语法格式为:“edquota [参数] 用户名”。

    在为用户设置了quota磁盘容量配额限制后,可以使用edquota命令按需修改限额的数值。其中,-u参数表示要针对哪个用户进行设置;-g参数表示要针对哪个用户组进行设置,如表6-6所示。

    表6-6                                             edquota命令中可用的参数以及作用

    参数 作用
    -u 对某个用户进行设置
    -g 对某个用户组进行设置
    -p 复制原有的规则到新的用户/组
    -t 限制宽限期限

    edquota命令会调用Vi或Vim编辑器来让root管理员修改要限制的具体细节,记得用wq保存退出呦。动手把用户tom的硬盘使用量的硬限额从5MB提升到8MB吧:

    [tom@linuxprobe ~]$ exit
    [root@linuxprobe ~]# edquota -u tom
    Disk quotas for user tom (uid 1001):
      Filesystem                   blocks       soft       hard     inodes     soft     hard
      /dev/sda1                      4096       3072       8192          1        3        6
    [root@linuxprobe ~]# su - tom
    [tom@linuxprobe ~]$ cd /boot
    [tom@linuxprobe boot]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
    1+0 records in
    1+0 records out
    8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.0185476 s, 452 MB/s


    VDO虚拟数据优化

    Virtual Data Optimize是一种通过压缩或删除存储设备上的数据来优化存储空间的技术,简称VDO,中文名叫虚拟数据优化。

    表6-7                                            对各种类型文件压缩效果汇总表

    文件名 描述 类型 原始大小(KB) 实际占用空间(KB)
    dickens 狄更斯文集 英文原文 9953 9948
    mozilla Mozilla的1.0可执行文件 执行程序 50020 33228
    mr 医用resonanse图像 图片 9736 9272
    nci 结构化的化学数据库 数据库 32767 10168
    ooffice Open Office.org 1.01 DLL 可执行程序 6008 5640
    osdb 基准测试用的MySQL格式示例数据库 数据库 9849 9824
    reymont 瓦迪斯瓦夫·雷蒙特的书 PDF 6471 6312
    samba samba源代码 src源码 21100 11768
    sao 星空数据 天文格式的bin文件 7081 7036
    webster 辞海 HTML 40487 40144
    xml XML文件 HTML 5220 2180
    x-ray 透视医学图片 医院数据 8275 8260
     

    RHEL/CentOS 8系统中默认已经启用VDO技术了,既然是红帽公司自己的技术,兼容性自然没得说。如果您所在的系统没有安装的话不要着急,用dnf命令即可完成:

    [root@linuxprobe ~]# dnf install kmod-kvdo vdo
    Updating Subscription Management repositories.
    Unable to read consumer identity
    This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
    Last metadata expiration check: 0:01:56 ago on Wed 06 Jan 2021 10:37:19 PM CST.
    Package kmod-kvdo-6.2.0.293-50.el8.x86_64 is already installed.
    Package vdo-6.2.0.293-10.el8.x86_64 is already installed.
    Dependencies resolved.
    Nothing to do.
    Complete!

    第1步:创建一个全新的VDO卷

    管理设备用的就是vdo命令本身,name参数代表新的设备卷的名称;device参数代表由那块磁盘进行制作;vdoLogicalSize参数代表制作后的逻辑卷大小,遵循红帽推荐的原则,20G硬盘翻成200G逻辑卷:

    [root@linuxprobe ~]# vdo create --name=storage --device=/dev/sdc --vdoLogicalSize=200G
    Creating VDO storage
    Starting VDO storage
    Starting compression on VDO storage
    VDO instance 0 volume is ready at /dev/mapper/storage

    Tips

    Linux命令行严格区别大小写,vdoLogicalSize参数中的L与S字母需要大写。

    第2步:创建成功后,使用status参数查看新建卷的概述信息。

    [root@linuxprobe ~]# vdo status --name=storage
    VDO status:
      Date: '2021-01-06 22:51:33+08:00'
      Node: linuxprobe.com
    Kernel module:
      Loaded: true
      Name: kvdo
      Version information:
        kvdo version: 6.2.0.293
    Configuration:
      File: /etc/vdoconf.yml
      Last modified: '2021-01-06 22:49:33'
    VDOs:
      storage:
        Acknowledgement threads: 1
        Activate: enabled
        Bio rotation interval: 64
        Bio submission threads: 4
        Block map cache size: 128M
        Block map period: 16380
        Block size: 4096
        CPU-work threads: 2
        Compression: enabled
        Configured write policy: auto
        Deduplication: enabled
    ………………省略部分输出信息………………

    输出信息中包含了VDO卷创建的时间、主机名、版本、是否删重(Deduplication)及是否压缩(Compression)等关键指标。

    第3步:对新建卷做格式化操作并挂载使用。

    新建的VDO卷设备会被乖乖的存放在/dev/mapper目录下,以设备名称命名的文件,对它操作就行。另外挂载前可以用udevadm settle命令来对设备进行一次刷新操作,避免刚刚的配置没有生效:

    [root@linuxprobe ~]# mkfs.xfs /dev/mapper/storage 
    meta-data=/dev/mapper/storage    isize=512    agcount=4, agsize=13107200 blks
             =                       sectsz=4096  attr=2, projid32bit=1
             =                       crc=1        finobt=1, sparse=1, rmapbt=0
             =                       reflink=1
    data     =                       bsize=4096   blocks=52428800, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=25600, version=2
             =                       sectsz=4096  sunit=1 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@linuxprobe ~]# udevadm settle
    [root@linuxprobe ~]# mkdir /storage
    [root@linuxprobe ~]# mount /dev/mapper/storage /storage
    

    如果想看下设备的实际使用情况,用vdostats命令即可,human-readable参数作用是存储容量自动进位,以人们更易读的单位输出(显示20G而不是20971520K):

    [root@linuxprobe ~]# vdostats --human-readable
    Device                    Size      Used Available Use% Space saving%
    /dev/mapper/storage      20.0G      4.0G     16.0G  20%           99%

    这里显示的Size是实际物理存储空间大小,20.0G是硬盘的大小,如果想看逻辑存储空间可以用df命令进行查看:

    [root@linuxprobe ~]# df -h
    Filesystem             Size  Used Avail Use% Mounted on
    devtmpfs               969M     0  969M   0% /dev
    tmpfs                  984M     0  984M   0% /dev/shm
    tmpfs                  984M  9.6M  974M   1% /run
    tmpfs                  984M     0  984M   0% /sys/fs/cgroup
    /dev/mapper/rhel-root   17G  3.9G   14G  23% /
    /dev/sr0               6.7G  6.7G     0 100% /media/cdrom
    /dev/sda1             1014M  152M  863M  15% /boot
    tmpfs                  197M   16K  197M   1% /run/user/42
    tmpfs                  197M  3.5M  194M   2% /run/user/0
    /dev/sdb1              2.0G   47M  2.0G   3% /newFS
    /dev/mapper/storage    200G  2.4G  198G   2% /storage
    

    第4步:随便复制来一个大文件,看看占用了多少容量,以及空间节省率Space saving是多少呢?

    [root@linuxprobe ~]# ls -lh /media/cdrom/images/install.img 
    -r--r--r--. 1 root root 448M Apr 4 2019 /media/cdrom/images/install.img
    [root@linuxprobe ~]# cp /media/cdrom/images/install.img /storage/
    [root@linuxprobe ~]# ls -lh /storage/install.img 
    -r--r--r--. 1 root root 448M Jan  6 23:06 /storage/install.img
    [root@linuxprobe ~]# vdostats --human-readable
    Device                    Size      Used Available Use% Space saving%
    /dev/mapper/storage      20.0G      4.4G     15.6G  22%           18%

    嗯?效果不明显,再复制来一份,看看这次占用了多少空间:

    [root@linuxprobe ~]# cp /media/cdrom/images/install.img /storage/rhel.img
    [root@linuxprobe ~]# vdostats --human-readable
    Device                    Size      Used Available Use% Space saving%
    /dev/mapper/storage      20.0G      4.5G     15.5G  22%           55%

    是不是感觉很棒,原先448M的文件这次只占用了不到100M的容量,空间节省率也从18%提升到了55%。当然这还仅仅是两次操作而已,好处就已经如此明显了。

    第5步:将设备设置成永久挂载生效,一直提供服务。

    VDO设备卷创建后就会一直存在了,但需要手动的编辑/etc/fstab文件后才能在下一次重启后自动挂载生效,为我们所用。对于这种逻辑存储设备,其实不太建议用/dev/mapper/storage作为设备名进行挂载,不如试试前面所说的UUID唯一标识符吧?

    [root@linuxprobe ~]# blkid /dev/mapper/storage 
    /dev/mapper/storage: UUID="cd4e9f12-e16a-415c-ae76-8de069076713" TYPE="xfs"

    高高兴兴的打开/etc/fstab文件,把对应的字段填写完整即可。建议再加上_netdev参数,代表等系统及网络都启动后再挂载VDO设备卷,保证万无一失。

    [root@linuxprobe ~]# vim /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Tue Jul 21 05:03:40 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.
    #
    # After editing this file, run 'systemctl daemon-reload' to update systemd
    # units generated from this file.
    #
    /dev/mapper/rhel-root                        /             xfs        defaults           1 1
    UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b    /boot         xfs        defaults,uquota    1 2
    /dev/mapper/rhel-swap                        swap          swap       defaults           0 0
    /dev/cdrom                                   /media/cdrom  iso9660    defaults           0 0 
    /dev/sdb1                                    /newFS        xfs        defaults           0 0 
    /dev/sdb2                                    swap          swap       defaults           0 0 
    UUID=cd4e9f12-e16a-415c-ae76-8de069076713    /storage      xfs        defaults,_netdev   0 0 
    

    软链接(symbolic link):也叫符号链接,仅仅包含所链接文件的名称和路径,像个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问,可以对文件、目录做软链接,跨文件系统也不是问题,从这一点来看与Windows系统的“快捷方式”具有一样的性质。用户访问起来的效果如图6-15所示。

     硬链接(hard link):可以将它理解为一个“指向原始文件block的指针”,系统会创建出一个与原来一摸一样的inode信息块。所以,硬链接文件与原始文件其实是一摸一样的,只是名字不同。每添加一个硬链接,该文件的inode个数就会增加1;

    ln命令用于创建文件的软硬链接,英文全称为:“link”,语法格式为:“ln [参数] 原始文件名 链接文件名”。

    ln命令用于创建链接文件,格式为“ln [选项] 目标”,其可用的参数以及作用如表6-8所示。在使用ln命令时,是否添加-s参数,将创建出性质不同的两种“快捷方式”。因此如果没有扎实的理论知识和实践经验做铺垫,尽管能够成功完成实验,但永远不会明白为什么会成功。

    表6-8                                             ln命令中可用的参数以及作用

    参数 作用
    -s 创建“符号链接”(如果不带-s参数,则默认创建硬链接)
    -f 强制创建文件或目录的链接
    -i 覆盖前先询问
    -v 显示创建链接的过程
    实例:

    [root@linuxprobe ~]# rm -f old.txt 
    [root@linuxprobe ~]# cat new.txt 
    cat: readit.txt: No such file or directory

    接下来还是针对原始文件创建一个硬链接,即相当于针对原始文件的硬盘存储位置创建了一个指针,这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取。同时可以看到创建硬链接后,原始文件的硬盘链接数量增加到了2。

    [root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > old.txt
    [root@linuxprobe ~]# ln old.txt new.txt
    [root@linuxprobe ~]# cat old.txt 
    Welcome to linuxprobe.com
    [root@linuxprobe ~]# cat new.txt 
    Welcome to linuxprobe.com
    [root@linuxprobe ~]# ls -l old.txt 
    -rw-r--r-- 2 root root 26 Jan 11 00:13 old.txt

    非常有意思的现象,创建的硬链接文件竟然会让文件属性第二列的数字变成了2,这个数字就是文件的inode信息块数量。相信同学们已经非常肯定的知道,即便删除了原始文件,新的文件也会一如既往的可以读取,因为只有当文件inode数量被“清零”时,才真正代表这个文件被删除了。

    [root@linuxprobe ~]# rm -f old.txt 
    [root@linuxprobe ~]# cat new.txt 
    Welcome to linuxprobe.com


     
     


  • 相关阅读:
    __attribute__ 总结
    linux文件夹打包命令
    学习ARM的一些基本知识,个人整理
    备忘录之 —— .bashrc(IC工具篇)
    GitHub的基本使用
    02: SocketServer服务
    01: socket模块
    08: python基础练习题
    07: 高阶函数&异常处理
    06: 面向对象
  • 原文地址:https://www.cnblogs.com/yyuuee/p/14816532.html
Copyright © 2011-2022 走看看