管理文件系统

管理文件系统

Linux文件系统

Linux文件系统的演进

1.ext文件系统

Linux操作系统最初引入的文件系统叫作扩展文件系统(extended filesystem,简称ext),它为Linux提供了一个基本的类Unix文件系统

ext文件系统使用i节点(inode)跟踪存储在虚拟目录中文件的相关信息。

ext文件系统名称中的extended部分得名自其所跟踪的每个文件的额外数据,包括以下内容。

·文件名
·文件大小
·文件属主
·文件属组
·文件访问权限
·指向存有文件数据的每个块的指针

Linux通过一个唯一的数值(称作i节点号)来引用i节点表中的i节点,这个值是创建文件时由文件系统分配的。

最早的ext文件系统限制颇多,比如文件大小不得超过2 GB。

2.ext2文件系统

在保持与ext相同的文件系统结构的同时,ext2在功能上做了扩展。

·在i节点表中加入了文件的创建时间、修改时间以及最后一次访问时间。

·允许的最大文件大小增至2 TB,后期又增加到32 TB。

·保存文件时按组分配磁盘块。

ext2文件系统也有限制。如果系统在存储文件和更新i节点表之间发生了什么事情,则两者内容可能无法同步,潜在的结果是丢失文件在磁盘上的数据位置。

日志文件系统

日志文件系统为Linux系统增加了一层安全性。

它放弃了之前先将数据直接写入存储设备再更新i节点表的做法,而是先将文件变更写入临时文件(称作日志)。在数据被成功写到存储设备和i节点表之后,再删除对应的日志条目。

Linux中有3种广泛使用的日志方法,每种的保护等级都不相同

image-20230515225129791

数据模式日志方法是目前为止最安全的数据保护方法,但速度也是最慢的。所有写入存储设备的数据都必须写两次:一次写入日志,另一次写入实际的存储设备。

1.ext3文件系统

ext3文件系统是ext2的后续版本,支持最大2 TB的文件,能够管理32 TB大小的分区。在默认情况下,ext3采用有序模式的日志方法,不过也可以通过命令行选项改用其他模式。

ext3文件系统无法恢复误删的文件,也没有提供数据压缩功能。

2.ext4文件系统

作为ext3的后续版本,ext4文件系统最大支持16 TiB的文件,能够管理1EiB大小的分区。

默认情况下,ext4采用有序模式的日志方法,不过也可以通过命令行选项改用其他模式。

另外还支持加密、压缩以及单目录下不限数量的子目录。

先前的ext2和ext3也可以作为ext4挂载,以提高性能表现。

3.JFS文件系统

JFS(journaled file system,日志化文件系统)[插图]是IBM在1990年为其Unix衍生版AIX(advanced interactive executive)开发的。

注意 IBM官方将第2版的JFS文件系统命名为JFS2,但大多数Linux系统还是称其为JFS。

JFS文件系统采用的是有序模式的日志方法

4.ReiserFS文件系统

Linux现在已经不再支持最新的Reiser4了。

5.XFS文件系统

XFS(X file system)是Silicon Graphics公司为其高级图形工作站(现在已退出市场)开发的文件系统

卷管理文件系统

采用了日志技术,就必须在安全性和性能之间做出选择。

就文件系统而言,日志技术的替代选择是一种称作写时复制(copy-on-write,COW)的技术。

COW通过快照(snapshot)兼顾了安全性和性能。在修改数据时,使用的是克隆或可写快照。修改过的数据并不会直接覆盖当前数据,而是被放入文件系统中另一个位置。

注意 真正的COW系统仅在数据修改完成之后才会改动旧数据。如果从不覆盖旧数据,那么这种操作准确来说称作写时重定向(redirect-on-write,ROW)。不过,通常都将ROW简称为COW。

尽管磁盘存储容量多年来显著增加,但对更多空间的需求始终存在。从一个或多个磁盘(或磁盘分区)创建的存储池提供了生成虚拟磁盘(称作卷)的能力。

1.ZFS文件系统

ZFS是一个稳定的文件系统,与Resier4、Btrfs和ext4势均力敌。它拥有数据完整性验证和自动修复功能,支持最大16 EB的文件,能够管理256万亿ZB(256 quadrillion zettabyte)的存储空间。

2.Btrfs文件系统

openSUSE Linux发行版将Btrfs确立为其默认文件系统,但在2017年,Red Hat废弃了Btrfs,不再支持该文件系统(RHEL版本8以及后续版本)。

3.Stratis文件系统

当Red Hat弃用Btrfs时,决定创建一种新的文件系统,即Stratis

使用文件系统

创建分区

首先,需要在存储设备上创建可容纳文件系统的分区。分区范围可以是整个硬盘,也可以是部分硬盘以包含虚拟目录的一部分。

组织和管理分区的工具:

·fdisk
·gdisk
·GNU parted

有时候,创建磁盘分区时最麻烦的地方就是找出Linux系统中的物理硬盘。Linux采用了一种标准格式来为硬盘分配设备名称,在进行分区之前,必须熟悉这种格式。

·SATA驱动器和SCSI驱动器:设备命名格式为/dev/sdx,其中字母x具体是什么要根据驱动器的检测顺序决定(第一个检测到的驱动器是a,第二个是b,以此类推)。
·SSD NVMe驱动器:设备命名格式为/dev/nvmeNn#,其中数字N具体是什么要根据驱动器的检测顺序决定(从0起始)。#是分配给该驱动器的名称空间编号(从1起始)。
·IDE驱动器:设备命名格式为/dev/hdx,其中字母x具体是什么要根据驱动器的检测顺序决定(第一个检测到的驱动器是a,第二个是b,以此类推)。
/ dev / vda是第一个检测到的半虚拟化磁盘驱动程序。如果两者都被引用到同一个磁盘,则它比仿真sdX设备要快,因为与仿真驱动器相比,其操作开销较小。

1.fdisk

fdisk是一款老而弥坚的工具,可以在任何存储设备上创建和管理分区。但是,fdisk只能处理最大2 TB的硬盘。如果大于此容量,则只能使用gdisk或GNU parted代替。

提示 如果存储设备是首次分区,则fdisk会警告你该设备没有分区表。

fdisk是一个交互式程序,允许你输入命令来逐步完成硬盘分区操作。要启动fdisk,需要指定待分区的存储设备的名称,同时还必须有超级用户权限(以root用户登录或使用sudo命令)。

[root@Wesuiliye ~]# whoami
root
[root@Wesuiliye ~]# fdisk /dev/vda 
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): 

fdisk使用自己的命令行,允许你提交命令,对存储设备进行分区。

p命令会显示指定存储设备当前的分区表:

[root@Wesuiliye ~]# fdisk /dev/vda 
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p   

Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 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
Disk label type: dos
Disk identifier: 0x000c0dab

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    83886046    41941999+  83  Linux

Command (m for help):

fdisk命令有些简陋,不允许调整现有分区的大小。你能做的是删除现有分区,然后重新创建。

提示 一些发行版和比较旧的发行版在创建好分区后不会自动通知Linux系统。在这种情况下,需要使用partprobe命令或hdparm命令(参见命令相关的手册页),或者重启系统,使其读取更新后的分区表。

如果对分区做了改动,那么务必使用w命令将改动写入硬盘后再退出。如果不想保存修改内容,则直接使用q命令退出:

Command (m for help): q

[root@Wesuiliye ~]# 

下面的例子在/dev/sdb硬盘上创建了一个新分区

[root@Wesuiliye01 ~]# fdisk /dev/sdb 
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):p

磁盘 /dev/sdb:1073 MB, 1073741824 字节,2097152 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x6463d064

   设备 Boot      Start         End      Blocks   Id  System

命令(输入 m 获取帮助):n  
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-2097151,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):
将使用默认值 2097151
分区 1 已设置为 Linux 类型,大小设为 1023 MiB

命令(输入 m 获取帮助):
命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@Wesuiliye01 ~]# 

2.gdisk

存储设备要采用GUID分区表(GUID partition table,GPT),就要用到gdisk:

[root@Wesuiliye01 ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************


Command (? for help): q
[root@Wesuiliye01 ~]# 

gdisk会识别存储设备所采用的分区类型。如果当前未使用GPT方法,则gdisk会提供相应的选项,将其转换为GPT。

警告 在转换存储设备分区类型的时候务必小心。所选择的类型必须与系统固件(BIOS或UEFI)兼容,否则,将无法引导设备。

常用的gdisk命令

3.GNU parted

[root@Wesuiliye01 ~]# parted /dev/sdb
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start  End  Size  Type  File system  标志

(parted) q                                                                
[root@Wesuiliye01 ~]# 

parted的卖点之一是允许调整现有的分区大小,所以可以很容易地收缩或扩大磁盘分区。

创建文件系统

将数据存储到分区之前,必须使用某种文件系统对其进行格式化,以便Linux能够使用分区。

创建文件系统的命令行工具

要想知道某个工具是否可用,可以使用type命令:

type mkfs.ext4

所有的文件系统命令都允许通过不带选项的简单形式来创建默认的文件系统,但要求你拥有超级用户权限:

[root@Wesuiliye01 ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 261888 blocks
13094 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

[root@Wesuiliye01 ~]# 

为分区创建好文件系统之后,下一步是将其挂载到虚拟目录中的某个挂载点,以便在新分区中存储数据。挂载点可以是虚拟目录中的任何位置。

[root@Wesuiliye01 ~]# mkdir part
[root@Wesuiliye01 ~]# mount -t ext4 /dev/sdb1 /root/part/
[root@Wesuiliye01 ~]# lsblk -f
NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
sda                                                                 
├─sda1 ext4                    d6a6600b-0d88-45fc-b5f7-9345c0e11f8c /boot
├─sda2 ext4                    b406d0d3-b528-461c-a5ff-cf39bba41dc0 /
└─sda3 swap                    b63a3f1a-ab27-4549-bd62-7cc68f85e7bd [SWAP]
sdb                                                                 
└─sdb1 ext4                    8b64c226-7b3d-488d-8ce5-42dfbf89b093 /root/part
sr0    iso9660 CentOS 7 x86_64 2018-11-25-23-54-16-00               
[root@Wesuiliye01 ~]# lsblk -f /dev/sdb
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sdb                                                      
└─sdb1 ext4         8b64c226-7b3d-488d-8ce5-42dfbf89b093 /root/part
[root@Wesuiliye01 ~]# 

mount命令的-t选项指明了要挂载的文件系统类型(ext4)。

lsblk -f命令可以显示新近格式化过并挂载的分区。

警告 这种挂载文件系统的方法只能实现临时挂载,重启系统后就失效了。要强制Linux在启动时自动挂载文件系统,可以将其添加到/etc/fstab文件中。

#打开fstab
vim /etc/fstab 
#添加内容
UUID=8b64c226-7b3d-488d-8ce5-42dfbf89b093 /root/part       ext4    defaults        0 0

文件系统的检查与修复

fsck命令可以检查和修复大部分Linux文件系统类型,包括本章早些时候讨论的那些文件系统。

该命令的格式如下:

fsck options filesystem

逻辑卷管理

通过将另一块硬盘上的分区加入已有的文件系统来动态地添加存储空间。Linux逻辑卷管理器(logical volume manager,LVM)正是用来做这个的。它可以让你在无须重建整个文件系统的情况下,轻松地管理磁盘空间。

LVM布局

1.物理卷

物理卷(physical volume,PV)通过LVM的pvcreate命令创建。该命令指定了一个未使用的磁盘分区(或整个驱动器)由LVM使用。在这个过程中,LVM结构、卷标和元数据都会被添加到该分区。

2.卷组

卷组(volume group,VG)通过LVM的vgcreate命令创建。该命令会将PV加入存储池,后者随后用于构建各种逻辑卷。

也就是说,多个物理卷(PV) 集中在一起会形成卷组(VG) ,由此形成了一个存储池,从中为逻辑卷(LV) 分配存储空间。

可以存在多个卷组。当你使用vgcreate将一个或多个PV加入VG时,也会同时添加卷组的元数据。

被指定为PV的分区只能属于单个VG。但是,被指定为PV的其他分区可以属于其他VG。

3.逻辑卷

逻辑卷(logical volume,LV)通过LVM的lvcreate命令创建。这是逻辑卷创建过程的最终产物。LV由VG的存储空间块组成。你可以使用文件系统格式化LV,然后将其挂载,像普通的磁盘分区那样使用。

尽管可以有多个VG,但LV只能从一个指定的VG中创建。不过,多个LV可以共享单个VG。你可以使用相应的LVM命令调整(增加或减少)LV的容量。

Linux中的LVM

lvm是用于创建和管理LV的交互式实用工具。

注意 lvm2或LVM2中的2指的是版本号。相较于LMV版本1(lvm1),新版本额外添加了一些特性并改善了设计。

首次设置逻辑卷的步骤如下。

(1) 创建物理卷。

(2) 创建卷组。

(3) 创建逻辑卷。

(4) 格式化逻辑卷。

(5) 挂载逻辑卷。

1.创建PV

在指定作为PV的存储设备之前,先确保已经分区且未使用。

可以使用pvcreate命令指定要作为PV的分区,执行该命令需要有超级用户权限:

[root@Wesuiliye01 ~]# 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   17G  0 part /
└─sda3   8:3    0    2G  0 part [SWAP]
sdb      8:16   0    1G  0 disk 
sdc      8:32   0    1G  0 disk 
sdd      8:48   0    1G  0 disk 
sr0     11:0    1  4.3G  0 rom  
[root@Wesuiliye01 ~]# 
[root@Wesuiliye01 ~]# pvcreate /dev/sdb /dev/sdc /dev/sdd
WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: y
  Wiping dos signature on /dev/sdb.
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.

最好多设置几个PV。LVM的关键在于将额外的存储空间动态添加到LV。设置过PV后,就该创建VG了。

2.创建VG

只要是PV,就可以加入VG。创建VG的命令是vgcreate

提示 在创建VG的过程中可以指定多个PV。如果随后需要向VG中添加PV,可以使用vgextend命令。

通常的做法是将第一个VG命名为vg00,将下一个VG命名为vg01,以此类推。

vgdisplay命令检查一下系统当前的VG:

[root@Wesuiliye01 ~]# vgdisplay 
[root@Wesuiliye01 ~]# 

创建VG

[root@Wesuiliye01 ~]# vgcreate vg00 /dev/sdb /dev/sdc 
  Volume group "vg00" successfully created
[root@Wesuiliye01 ~]# 
[root@Wesuiliye01 ~]# vgdisplay 
  --- Volume group ---
  VG Name               vg00
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       0 / 0   
  Free  PE / Size       510 / 1.99 GiB
  VG UUID               2QpcFx-76dr-lGEO-cyGc-ne9V-n0kT-Pnl6ai

3.创建LV

可以使用lvcreate命令创建LV。LV的大小由-L选项设置,使用的空间取自指定的VG存储池:

[root@Wesuiliye01 ~]# lvcreate -L 1g -v vg00 
    Archiving volume group "vg00" metadata (seqno 1).
    Creating logical volume lvol0
    ......
    Logical volume "lvol0" created.
[root@Wesuiliye01 ~]# 

注意 如果出于某种原因,VG没有足够的存储空间来满足LV要求的大小,那么lvcreate命令将无法创建LV。你会看到错误消息insufficient free space error。

创建好LV之后,可以使用lvdisplay命令显示相关信息。注意,命令中的完整路径名用于指定LV:

[root@Wesuiliye01 ~]# lvdisplay /dev/vg00/lvol0 
  --- Logical volume ---
  LV Path                /dev/vg00/lvol0
  LV Name                lvol0
  VG Name                vg00
  LV UUID                i14NIB-XZnS-LcQj-l5Ne-tlmU-Zrmo-Z16Njd
  LV Write Access        read/write
  LV Creation host, time Wesuiliye01, 2023-05-20 22:06:03 +0800
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
   

使用Linux LVM

一旦创建好LV,就可以将其视作普通分区。

当然,不同之处在于你可以根据需要,扩大或收缩这个分区。

但在此之前,必须将LV挂载到虚拟目录结构中。

1.格式化和挂载LV

[root@Wesuiliye01 ~]# mkfs.ext4 /dev/vg00/lvol0 
[root@Wesuiliye01 ~]# mkdir my_LV     
[root@Wesuiliye01 ~]# mount -t ext4 /dev/vg00/lvol0 my_LV
[root@Wesuiliye01 ~]# ls my_LV/
lost+found
[root@Wesuiliye01 ~]# 

2.扩大或收缩VG和LV

扩大或收缩LVM的命令

lvextend 命令用于逻辑卷在线扩容,也就是说lvextend扩容是不需要停机的,应用服务也不需要关闭,其语法格式如下:

lvextend  [参数] 	LogicalVolume[Path] [ PhysicalVolumePath... ]

常用参数:

-l +  :指定逻辑卷的LE个数,如 -l +200
-L + :表示增加多少空间,如 -L +15G ,单位有bBsSkKmMgGtTpPeE
-l +100%FREE	:表示增加vg的全部可用空间

注意:lvextend 扩展后只是扩展了lv的大小,而此时文件系统并未感知到,所有还需要使用xfs_growfs、resize2fs等命令来扩展文件系统,xfs_growf命令是扩展xfs文件系统,resize2fs是扩展ext4文件系统。

[root@Wesuiliye01 ~]# lvs
  LV    VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvol0 vg00 -wi-ao---- 1.00g                       
#逻辑卷扩容,增加512MB的空间
[root@Wesuiliye01 ~]# lvextend -L +512MB /dev/vg00/lvol0 
  Size of logical volume vg00/lvol0 changed from 1.00 GiB (256 extents) to 1.50 GiB (384 extents).
  Logical volume vg00/lvol0 successfully resized.
[root@Wesuiliye01 ~]# lvs
  LV    VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvol0 vg00 -wi-ao---- 1.50g      # 可以看到有增加空间
[root@Wesuiliye01 ~]# 

#逻辑卷还是1G,说明即使lv增大了但文件系统并未感知到lv增大了
[root@Wesuiliye01 ~]# df -Th /dev/mapper/vg00-lvol0 
文件系统               类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vg00-lvol0 ext4  976M  2.6M  907M    1% /root/my_LV


哎呀,df -Th 看到的怎么是/dev/mapper/vg00-lvol0,我们的逻辑卷文件明明是/dev/vg00/lvol0的呀,怎么回事?

原来这是lvm的mapper机制决定的,当我们lvcreate一个逻辑卷的时候,Linux会新建两个软链接文件,

如/dev/VGName/LVName和/dev/mapper/VGName-LVName,而这2个文件都是指向/dev/dm-X 块文件的,所有,当我们使用df -h看

到的/dev/mapper/vg00-lvol0其实是和/dev/vg00/lvol0一样的,不管我们使用哪个都是可以的。

#查看你的逻辑卷是什么文件系统类型,如果是xfs文件系统,使用xfs_growfs命令扩展容量:
xfs_growfs /dev/vg00/lvol0 
#查看你的逻辑卷是什么文件系统类型,如果是ext4文件系统,使用resize2fs命令扩展容量:
resize2fs /dev/vg00/lvol0 
[root@Wesuiliye01 ~]# df -Th
文件系统               类型      容量  已用  可用 已用% 挂载点
devtmpfs               devtmpfs  2.0G     0  2.0G    0% /dev
tmpfs                  tmpfs     2.0G     0  2.0G    0% /dev/shm
tmpfs                  tmpfs     2.0G   12M  2.0G    1% /run
tmpfs                  tmpfs     2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/sda2              ext4       17G  9.3G  6.5G   59% /
/dev/sda1              ext4      976M  172M  738M   19% /boot
tmpfs                  tmpfs     394M     0  394M    0% /run/user/0
# 大小实际增大了
/dev/mapper/vg00-lvol0 ext4      1.5G  3.0M  1.4G    1% /root/my_LV
posted @ 2023-05-23 14:50  0x1e61  阅读(38)  评论(0编辑  收藏  举报