Linux磁盘管理和文件系统

210 阅读17分钟

1. 磁盘存储术语总结: head, track, sector, cylinder.

术语英文描述
磁头head一个盘对应一个磁头
磁道track盘面上的每一圈就算一个磁道
扇区sector把每个磁道按512bytes大小再进行划分,这就是扇区,每个磁道的扇区数量是不一样的
柱面cylinder磁头移动的时候,是一起移动的,如果是6个盘面,则6个磁头对应的磁道是一致的,这就是柱面

2. 总结MBR,GPT结构。

两种分区方式:MBR、GPT

MBR分区:

MBR:MasterBootRecord,1982年,使用32位表示扇区数,分区不超过2T

划分分区的单位: CentOS5 之前按整柱面划分 CentOS6版本后可以按Sector(扇区)划分

0磁道0扇区:512bytes,不给使用

446bytes:boot loader启动相关

64bytes:分区表,其中每16bytes标识一个分区

Zbytes:55AA,标识符


MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)

MBR分区:主和扩展分区对应的1--4,/dev/sda3,逻辑分区从5开始,/dev/sda5


为什么不能超过4个主分区?

因为在0磁道0扇区上只留了64bytes空间存储分区表信息,而一个分区的关键信息要占用16个字节来存放


为什么单分区不能超过2T?

一个分区信息占用16个字节,其中记录分区开始位置的空间为4个字节,记录分区结束的空间也是4个字节;

一个字节8位,4个字节是32位,则起始位最小值为32个0,结束位最大值为32个1。

所以1个分区,最大就是2的32次方个扇区,一个是扇区512字节,则最大空间是2^32*2^9=2^41字节;

2^40就是T,那2^41就表示不超过2T

GPT分区

GPT支持128个分区,使用64位

使用128位UUID(Universally Unique ldentifier)表示磁盘和分区,GPT分区表自动备份在头和尾两份,并有CRC校验位

UEFl (Unified Extensible Firmware Interface 统一可扩展固件接口)硬件支持GPT,使得操作系统可以启动

BIOS和UEFI

BIOS是固化在电脑主板上的程序,主要用于开机系统自检和引导操作系统。目前新式的电脑基本上都是 UEFI启动

BIOS(Basic Input Output System 基本输入输出系统)主要完成系统硬件自检和引导操作系统,操作系统开始启动之后,BIOS的任务就完成了。系统硬件自检: 如果系统硬件有故障,主板上的扬声器就会发出长短不同的"清潏“音,可以简单的判断硬件故障,比如”“1长1短”通常表示内存故障,"1长3短“通常 表示显卡故障

EFI(Extensible Frmware interiace)可扩展固件接口,是 intel为PC固件的体系结构、接口和服务提出的建议标准,其主要目的是为了提供一组在 OS 加载之前(启动前)在所有平台上一致的、正确指定的启动服务,被看做是BIOS的继任者,或者理解为新版BIOS。

UEFI是由EFI1.10为基础发展起来的,它的所有者已不再是Intel,而是一个称作Unified Efl Form的国际组织。

UEFl(Unified Extensible firmware Interface)统一的可扩展固件接口,是一种详细描述类型接口的标准,UEFI相当于一个轻量化的操作系统,提供了硬件和操作系统之间的一个接口,提供了图形化的操作界面。最关键的是引入了GPT分区表,支持2T以上的硬盘,硬盘分区不受限制

MSDN (Microsoft Developer Network)指出,Windows 只能安装于 BIOS+ MBR或是 UEF+ GPT 的组合上,而 BIOS+ GPT和 UEFI+ MBR 是不允许的,但是BIOS + GPT + GRUB 启动Linux 是可以的

3. 总结分区,文件系统管理,SWAP管理相关的命令及示例(加注释),示例 fdisk, mkfs, fsck, mount, umount, swapon, swapoff

Linux常用文件系统

文件系统备注
ext2Extended file system 适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区
ext3ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复
ext4ext 文件系统的最新版。有很多新的特性,包括纳秒级时间戳、巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
xfsSGI,支持最大8EB的文件系统
swap交换分区专用的文件系统
iso9660光盘文件系统
btrFSOracle公司开发
relserFS

分区工具fdisk

fdisk 主要支持 MBR分区表

fdisk

#常用子目录
m		#查看帮助
p		#输出分区列表
t		#更改分区类型
n		#创建新分区
d		#删除分区
v		#校验分区
u		#转换分区
w		#保存并退出
q		#不保存并退出
x		#高级功能(专家模式)

fdisk /dev/sdb
#创建sdb1,2为主分区,sdb3为扩展分区,567是其逻辑分区
#删除逻辑分区6,逻辑分区7会自动变成6,这是逻辑分区的特性,而删除主分区2则主分区3不会变成2。
[root@ubuntu2204 ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual S
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: 0xba1e1547

Device     Boot    Start      End  Sectors Size Id Type
/dev/sdb1           2048 10487807 10485760   5G 83 Linux
/dev/sdb2       10487808 18876415  8388608   4G 83 Linux
/dev/sdb3       18876416 41943039 23066624  11G  5 Extended
/dev/sdb5       18878464 23072767  4194304   2G 83 Linux
/dev/sdb6       23074816 31463423  8388608   4G 83 Linux
/dev/sdb7       31465472 41943039 10477568   5G 83 Linux

创建文件系统mkfs

mkfs

#常用选项
-t|--type=model		#指定文件系统类型
-b			#指定块block大小(1024|2048|4096)
-L LABEL		        #设置卷标
-V			#显示创建过程
-j			#同-t ext3
...


#创建ext4 文件系统
#mkfs.ext4 等同于 mkfs -t ext4
[root@Rocky-1 ~]# mkfs.ext4 /dev/sda1 
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 1048576 4k blocks and 262144 inodes
Filesystem UUID: ca903aca-49d1-45b1-a019-662bafbd9a6f
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

#创建xfs 文件系统
[root@Rocky-1 ~]# mkfs.xfs /dev/sda2 
meta-data=/dev/sda2              isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=1310720, 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

#创建后查看
#查看指定设备
[root@Rocky-1 ~]# lsblk -f /dev/sda
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sda                                                      
├─sda1 ext4         ca903aca-49d1-45b1-a019-662bafbd9a6f 
└─sda2 xfs          82a1de92-7e37-4266-b688-2f4cbc52a169 


#df 只能查看已挂载的设备,此处未挂载无显示 
[root@Rocky-1 ~]# df -l
Filesystem          1K-blocks    Used Available Use% Mounted on
devtmpfs              1840732       0   1840732   0% /dev
tmpfs                 1860436       0   1860436   0% /dev/shm
tmpfs                 1860436    9160   1851276   1% /run
tmpfs                 1860436       0   1860436   0% /sys/fs/cgroup
/dev/mapper/rl-root  73364480 2897220  70467260   4% /
/dev/nvme0n1p1        1038336  203068    835268  20% /boot
/dev/mapper/rl-home 131081692  946976 130134716   1% /home
tmpfs                  372084       0    372084   0% /run/user/0

文件系统检测fsck

用于检测文件系统是否有损坏和使用情况

e2fsck主要用于检查和修复ext系列文件系统

#fsck.文件系统可以指定文件系统类型
[root@ubuntu2204 ~]# fsck.
fsck.btrfs   fsck.ext2    fsck.ext4    fsck.minix   fsck.vfat    
fsck.cramfs  fsck.ext3    fsck.fat     fsck.msdos   fsck.xfs  
`-f` 参数表示强制检查,即使文件系统被挂载也可以进行检查。
[root@ubuntu2204 ~]# fsck -f /dev/mapper/vg1-lv2
fsck from util-linux 2.37.2
e2fsck 1.46.5 (30-Dec-2021)
/dev/mapper/vg1-lv2: clean, 13/131072 files, 26158/524288 blocks

clean: 表示文件系统没有发现任何错误或损坏。
13/131072 files: 表示在文件系统中共有 13 个文件,而文件系统的总容量为 131072 个文件。
26158/524288 blocks: 表示已使用的块数为 26158,而文件系统的总块数为 524288

挂载和卸载文件系统

挂载:将额外文件系统与根文件系统现存的目录建立起关联关系,进而使得此目录作为其他文件访问入口的行为

卸载:为解除此关联关系的过程

把设备关联挂载点:mount device mountpoint

挂载点下原有文件在挂载完成后被临时隐藏,因此,挂载点目录一般最好为空 进程正在使用中的设备无法被卸载

挂载mount

device:指明要挂载的设备

设备文件
卷标LABEL
UUID
伪文件系统名称

mountpoint:挂载点目录必须事先存在,建议使用空目录


挂载规则:

一个挂载点同一时间只能挂载一个设备

一个挂载点同一时间挂载了多个设备,只能看到最后一个设备的数据,其它设备上的数据将被隐藏

一个设备可以同时挂载到多个挂载点

通常挂载点一般是已存在空的目录


mount常用命令选项

-a		#自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
-B|--bind	        #绑定目录到另一个目录上
...

范例:将sda1挂载到dir1目录,并使用df命令查看

[root@Rocky-1 ~]# mkdir /dir{1,2}
[root@Rocky-1 ~]# ls /
bin  boot  dev  dir1  dir2  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@Rocky-1 ~]# mount /dev/sda
sda   sda1  sda2  
[root@Rocky-1 ~]# mount /dev/sda1 /dir1/
[root@Rocky-1 ~]# df -lh
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             1.8G     0  1.8G   0% /dev
tmpfs                1.8G     0  1.8G   0% /dev/shm
tmpfs                1.8G  9.0M  1.8G   1% /run
tmpfs                1.8G     0  1.8G   0% /sys/fs/cgroup
/dev/mapper/rl-root   70G  2.8G   68G   4% /
/dev/nvme0n1p1      1014M  199M  816M  20% /boot
/dev/mapper/rl-home  126G  925M  125G   1% /home
tmpfs                364M     0  364M   0% /run/user/0
/dev/sda1            3.9G   24K  3.7G   1% /dir1

#-o选项指定readonly
mount --souce /dev/sda2 -o ro /dir2

卸载umount

卸载时,可用设备,也可使用挂载点

umount /dev/sda1

umount /dir1/

4. 总结raid 0, 1, 5, 10, 01的工作原理。总结各自的利用率,冗余性,性能,至少几个硬盘实现。

raid 0

以 chunk 单位,读写数据,因为读写时都可以并行处理,所以在所有的级别中,RAID0的速度是最快的。但是RAID0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失。

RAID 0的磁盘利用率为100%,最少需要2块硬盘实现。

raid 1

也称为镜像,两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘 数量的倍数,与RAID 0相同。另外写入速度有微小的降低。

RAID 0的磁盘利用率为50%,最少需要2块硬盘实现。最多可坏1个硬盘。

raid 5

多块数据盘异或运算值分布在所有盘上。

RAID 5的磁盘利用率为(N-1)/N,最少需要硬盘:3,3+。有冗余能力,最多可坏1个硬盘。

raid 10

先做RAID1再做RAID0。

RAID 10的磁盘利用率为50%,最少需要4块硬盘实现,每组镜像最多只能坏1块硬盘。

raid 01

先做RAID0再做RAID1。

RAID 01的磁盘利用率为50%,最少需要4块硬盘实现,每组镜像最多能坏2块硬盘。

5. 总结LVM的基本原理,完成实验对LVM的创建和磁盘扩容。

LVM: Logical Volume Manager 可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,允许在多个物理设备间重新组织文件系统 LVM可以弹性的更改LVM的容量。

实现过程

将设备指定为物理卷 用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的 在物理卷上创建的逻辑卷,是由物理区域(PE)组成 可以在逻辑卷上创建文件系统并挂载。

物理卷->卷组->逻辑卷。

PV管理工具

将块设备创建为物理卷,本质上就是给块设备打一个标签

块设备数量和物理卷数量是对应的,有几个块设备,就可以创建几个物理卷

块设备容量大小不限,可以跨分区

显示pv信息
pvs
pvdisplay

创建pv
pvcreate /dev/DEVICE

删除pv
pvremove /dev/DEVICE

创建物理卷后查看
pvcreate /dev/sdb{1..3}
pvcreate /dev/sdc
[root@ubuntu2204 ~]# pvs
  PV         VG        Fmt  Attr PSize    PFree  
  /dev/sda3  ubuntu-vg lvm2 a--  <198.00g  99.00g
  /dev/sdb1            lvm2 ---     4.00g   4.00g
  /dev/sdb2            lvm2 ---     5.00g   5.00g
  /dev/sdb3            lvm2 ---   <11.00g <11.00g
  /dev/sdc             lvm2 ---    20.00g  20.00g

VG管理工具

显示卷组
vgs
vgdisplay

创建卷组
vgcreate [-s Size] vgname pv1 [pv2...]

#-s 指定PE大小,数字加单位,单位为k|K|m|M|g|G|t|T|p|P|e|E

管理卷组
vgextend vgname pv1 [ pv2...]		#往卷中添加物理卷
vgreduce vgname pv1 [ pv2...]		#从卷组中移除物理卷

删除卷组
删除vg之前,要先把相应的pv解除绑定(pvremove)
vgremove vgname


范例:创建vg
[root@ubuntu2204 ~]# vgcreate vg1 /dev/sdb{1,2}
  Volume group "vg1" successfully created
[root@ubuntu2204 ~]# pvs
  PV         VG        Fmt  Attr PSize    PFree  
  /dev/sda3  ubuntu-vg lvm2 a--  <198.00g  99.00g
  /dev/sdb1  vg1       lvm2 a--    <4.00g  <4.00g
  /dev/sdb2  vg1       lvm2 a--    <5.00g  <5.00g
  /dev/sdb3            lvm2 ---   <11.00g <11.00g
  /dev/sdc             lvm2 ---    20.00g  20.00g
[root@ubuntu2204 ~]# vgs
  VG        #PV #LV #SN Attr   VSize    VFree 
  ubuntu-vg   1   1   0 wz--n- <198.00g 99.00g
  vg1         2   0   0 wz--n-    8.99g  8.99g
  
  
范例:拓展vg
[root@ubuntu2204 ~]# vgextend vg1 /dev/sdc
  Volume group "vg1" successfully extended
[root@ubuntu2204 ~]# vgdisplay 
  --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <28.99 GiB
  PE Size               4.00 MiB
  Total PE              7421
  Alloc PE / Size       0 / 0   
  Free  PE / Size       7421 / <28.99 GiB
  VG UUID               PolBoB-RvPJ-wNZz-lrs6-WSuS-gCms-ta5VZm

LV管理工具

显示逻辑卷
lvs
lvdisplay

创建逻辑卷
lvcreate {-L N[mMgGtT] | -l N} -n NAME VolumeGroup

-L|--size N[mMgGtT]		#指定大小
-l|--extents N			#指定PE个数,也可以用百分比
-n NAME				#逻辑卷名称、

扩容逻辑卷
lvextend -L +10G VolumeGroup


范例:创建lv
#从vg1创建lv1,2,3。大小为100个PE,2G,剩余可用PE的20%。lv4为指定vg的10%大小
[root@ubuntu2204 ~]# lvcreate -l 100 -n lv1 vg1
  Logical volume "lv1" created.
[root@ubuntu2204 ~]# lvcreate -L 2G -n lv2 vg1
  Logical volume "lv2" created.
[root@ubuntu2204 ~]# lvcreate -l 20%free -n lv3 vg1
  Logical volume "lv3" created.
  [root@ubuntu2204 ~]# lvcreate -l 10%VG -n lv4 vg1
  Logical volume "lv4" created.
  [root@ubuntu2204 ~]# lvs
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <99.00g                                                    
  lv1       vg1       -wi-a----- 400.00m                                                    
  lv2       vg1       -wi-a-----   2.00g                                                    
  lv3       vg1       -wi-a-----  <5.32g 
  lv4       vg1       -wi-a-----  <2.90g 
  [root@ubuntu2204 ~]# lvdisplay /dev/vg1/lv1
  --- Logical volume ---
  LV Path                /dev/vg1/lv1
  LV Name                lv1
  VG Name                vg1
  LV UUID                woyA3s-L6IA-aLPG-s9FZ-t2Ki-z7Lh-jgkCtV
  LV Write Access        read/write
  LV Creation host, time ubuntu2204, 2024-08-08 12:38:14 +0000
  LV Status              available
  # open                 0
  LV Size                400.00 MiB
  Current LE             100
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
  
逻辑卷的使用和硬盘分区使用一样,要先创建文件系统,再进行挂载、
[root@ubuntu2204 ~]# mkfs.ext4 /dev/vg1/lv1

扩容逻辑卷

扩展逻辑卷之前,要先保证卷组上还有空间

两步实现,先扩展逻辑卷,再扩容文件系统

#第一步实现逻辑卷的空间扩展
lvextend -L [+]N[mMgGtT] /dev/VG_NAME/LV_NAME

#第二步实现文件系统的扩展
#针对ext
resize2fs /dev/VG_NAME/LV_NAME

#针对xfs
xfs_growfs MOUNTPOINT
[root@ubuntu2204 ~]# lvextend -L 3G /dev/vg1/lv1 
  Size of logical volume vg1/lv1 changed from 400.00 MiB (100 extents) to 3.00 GiB (768 extents).
  Logical volume vg1/lv1 successfully resized.
[root@ubuntu2204 ~]# lvs
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <99.00g                                                    
  lv1       vg1       -wi-ao----   3.00g                                                    
  lv2       vg1       -wi-a-----   2.00g                                                    
  lv3       vg1       -wi-a-----  <5.32g                                                    
  lv4       vg1       -wi-a-----  <2.90g 
#没扩展文件系统还是原来的大小
[root@ubuntu2204 ~]# df -lh
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              388M  1.7M  386M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   97G  8.1G   84G   9% /
tmpfs                              1.9G     0  1.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  253M  1.6G  14% /boot
tmpfs                              388M  4.0K  388M   1% /run/user/0
/dev/mapper/vg1-lv1                359M   24K  331M   1% /test1
#扩展文件系统
[root@ubuntu2204 ~]# resize2fs /dev/vg1/lv1 
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/vg1/lv1 is mounted on /test1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg1/lv1 is now 786432 (4k) blocks long.

[root@ubuntu2204 ~]# df -lh
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              388M  1.7M  386M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   97G  8.1G   84G   9% /
tmpfs                              1.9G     0  1.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  253M  1.6G  14% /boot
tmpfs                              388M  4.0K  388M   1% /run/user/0
/dev/mapper/vg1-lv1                2.9G   24K  2.8G   1% /test1

一步实现容量和文件系统的扩展

lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME