Linux磁盘与文件系统管理

298 阅读10分钟

Linux磁盘与文件系统管理.png

认识Linux系统

磁盘组成与分区

磁盘中以扇区为最小单位。

磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区 表。

MBR 分区表中,第一个扇区最重要,里面有:

(1)主要开机区(Master boot record, MBR)及分区表 (partition table), 其中 MBR 占有 446 Bytes,而 partition table 则占有 64 Bytes。

(2)GPT 分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB。

/dev/sd[a-p][1-128]:为实体磁盘的磁盘文件名

/dev/vd[a-d][1-128]:为虚拟磁盘的磁盘文件名

文件系统特性

在磁盘分区之后都要进行格式化(format)之后才能使用,这是因为文件系统都有不同的格式和类型。

文件系统通常会将两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,实际数据则放置到 data block 区块中。

还有一个超级区块 (superblock) 会记录整个文件系 统的整体信息,包括 inode 与 block 的总量、使用量、剩余量

  • superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码
  • block:实际记录文件的内容,若文件太大时,会占用多个block

inode

  • 该文件的存取模式(read/write/excute)
  • 该文件的拥有者与群组(owner/group)
  • 该文件的容量;
  • 该文件创建或状态改变的时间(ctime)
  • 最近一次的读取时间(atime); 最近修改的时间(mtime)
  • 定义文件特性的旗标(flag),如 SetUID...
  • 该文件真正内容的指向 (pointer)

inode 的数量与大小也是在格式化时就已经固定了

  • 每个 inode 大小均固定为 128 Bytes (新的 ext4 与 xfs 可设置到 256 Bytes)-
  • 每个文件都仅会占用一个 inode 而已

承上,因此文件系统能够创建的文件数量与 inode 的数量有关; 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与使用者是否符合,若符合才能够开始 实际读取 block 的内容。

与目录树的关系

创建目录时,系统会给目录分配一个inode和至少一个block,inode中存的时目录的相关权限和属性,而block中存的是文件名和文件对应的inode号

XFS日志式文件系统

xfs主要规划为三个部分,一个数据区 (data section)、一个文件系统活动登录区 (log section)以及一个实时运行区(realtime section)。

磁盘分区、格式化、检视与挂载

观察磁盘分区的状态: lsblk列出系统上的所有磁盘列表

参数选项
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据 
-f :同时列出该磁盘内的文件系统名称 
-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用) 
-m :同时输出该设备在 /dev 下面的权限数据 (rwx 的数据) 
-p :列出该设备的完整文件名!而不是仅列出最后的名字而已。 
-t :列出该磁盘设备的详细数据,包括磁盘伫列机制、预读写的数据量大小等
[root@lx:~]#lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   50G  0 disk 
├─sda1          8:1    0    1G  0 part /boot
└─sda2          8:2    0   49G  0 part 
  ├─klas-root 253:0    0 46.9G  0 lvm  /
  └─klas-swap 253:1    0  2.1G  0 lvm  [SWAP]
sdb             8:16   0  500G  0 disk 
sr0            11:0    1  4.3G  0 rom  
  • NAME:就是设备的文件名啰!会省略 /dev 等前导目录!
  • MAJ:MIN:其实核心认识的设备都是通过这两个代码来熟悉的!分别是主要:次要设备代码!
  • RM:是否为可卸载设备 (removable device),如光盘、USB 磁盘等等
  • SIZE:当然就是容量啰!
  • RO:是否为只读设备的意思
  • TYPE:是磁盘 (disk)、分区 (partition) 还是只读存储器 (rom) 等输出
  • MOUTPOINT:挂载点!

blkid 列出设备的 UUID 等参数

[root@lx:~]#blkid
/dev/mapper/klas-swap: UUID="0ade10c9-40f6-4d2a-8e1d-934474800604" TYPE="swap"
/dev/sr0: BLOCK_SIZE="2048" UUID="2023-03-31-21-06-57-00" LABEL="Kylin-Server-10" TYPE="iso9660"
/dev/mapper/klas-root: UUID="6cac1d1f-35b0-40b9-af73-c1d3243e7e19" BLOCK_SIZE="512" TYPE="xfs"
/dev/sda2: UUID="hgK3Rb-yiU1-f43o-lT7c-FatC-NLYl-2Gvdpi" TYPE="LVM2_member" PARTUUID="1873d1e8-02"
/dev/sda1: UUID="f32340b3-19ad-400e-b731-a9edca312394" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="1873d1e8-01"

parted 列出磁盘的分区表类型与分区信息

[root@lx:~]#parted /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  53.7GB  52.6GB  primary               lvm

磁盘分区工具gdisk/fdisk

在分区管理中,使用不同的工具(如 fdisk 和 gdisk)来处理 MBR(主引导记录)和 GPT(GUID 分区表)主要是因为这两种分区格式的结构和实现方式存在显著差异。以下是对这两个工具及其适用范围的详细说明:

MBR 和 GPT 分区格式

  1. MBR(主引导记录)

    • 由 BIOS 使用的一种较旧的分区格式。
    • 最大支持 2TB 的单个分区。
    • 最多支持 4 个主分区,或 3 个主分区 + 1 个扩展分区。
    • 分区信息存储在硬盘的前 512 字节中,包括主引导记录。
  2. GPT(GUID 分区表)

    • 由 UEFI 使用的现代分区格式。
    • 最大支持 9.4ZB 的单个分区(理论上)。
    • 支持多达 128 个分区(具体数量取决于实现)。
    • 包含冗余的分区表,分为主 GPT 表和备份 GPT 表,增加了数据的安全性。

工具差异

  • fdisk

    • 是用来管理 MBR 分区表的实用程序。
    • 不支持 GPT 分区表,仅能处理传统的 MBR 格式。
  • gdisk

    • 是 GNU 的 GPT fdisk 工具,专门用来管理 GPT 分区表。
    • 提供了一个类似于 fdisk 的界面,但功能和支持的分区格式不同。

使用parted进行分区

格式化磁盘

mkfs.xfs,格式化的速度超级快,必须格式化磁盘才能使用

开机自动挂载

/etc/fstab或者/etc/rc.local 在 Linux 系统中,挂载磁盘的方式通常取决于磁盘的类型和挂载的需求。以下是一些基本的原则和建议:

/etc/fstab

/etc/fstab 文件是用于在系统启动时自动挂载文件系统的配置文件。适合在此文件中挂载的类型包括:

  • 常用磁盘分区:例如,根分区 (/)、用户分区 (/home)。
  • 网络文件系统:例如 NFS、CIFS。
  • 外部存储设备:如 USB 驱动器和其他类型的存储设备,只要你希望在每次启动时都挂载它们。

示例:

/dev/sda1   /       ext4    defaults    0   1
/dev/sdb1   /data   ext4    defaults    0   2

/etc/rc.local

/etc/rc.local 是一个脚本文件,可用于在系统启动时执行任意命令。这种方法适用于以下场景:

  • 动态或特殊情况下的挂载:你需要根据条件决定是否挂载的文件系统。
  • 不需要在启动时自动挂载但需要在系统运行后挂载的文件系统
  • 需要执行额外命令:比如挂载之后执行特定的操作。

示例:

#!/bin/bash
mount /dev/sdb1 /mnt/external_drive

选择建议

  • 如果你的挂载是静态且较为标准的(例如大多数用户的文件夹),建议使用 /etc/fstab
  • 如果你需要在特定条件下挂载或需要执行其他命令,建议使用 /etc/rc.local

总的来说,最佳实践是尽可能使用 /etc/fstab 进行挂载配置,以保持系统的一致性和简洁性。

mount -a 
mount [-l]
mount [-t 文件系统] LABEL='' 挂载点 
mount [-t 文件系统] UUID='' 挂载点 
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: 允许此 filesystem 被以 mount -a 自动挂载(auto) 
dev, nodev: 是否允许此 filesystem 上,可创建设备文件? dev 为可允许 
suid, nosuid: 是否允许此 filesystem 含有 suid/sgid 的文件格式? 
exec, noexec: 是否允许此 filesystem 上拥有可执行 binary 文件? 
user, nouser: 是否允许此 filesystem 让任何使用者执行 mount ?一般来说, mount 仅有 root 可以进行,但下达 user 参数,则可让 一般 user 也能够对此 partition 进行 mount 。 
defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async 
remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!
# Device Mount point filesystem parameters dump fsck 
/dev/mapper/centos-root / xfs defaults 0 0 UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c 
/boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 
/dev/mapper/centos-swap swap swap defaults 0 0

第一栏Device:要挂载的设备 第二栏Mount point:挂载点 第三栏filesystem:文件系统类型 第四栏parameters:挂载参数一般为默认 第五栏dump:能否被 dump 备份指令作用 第六栏fsck:是否以 fsck 检验扇区

swap内存交换空间

第一步:使用gdisk创建一个swap的空间 第二步:创建swap格式,mkswap /dev/xxx 第三步swapon /dev/xxx 载入

以文件创建swap分区

步骤一:使用dd创建一个自定义大小的文件

dd if=/dev/zero of=/tmp/swap bs=1M count=128

步骤二mkswap 格式化文件

步骤三:载入swapon

步骤四swapoff关闭swap的挂载