管理文件系统(shell06)

20 篇文章 1 订阅

管理文件系统

基本的 Linux 文件系统

ext文件系统

ext文件系统采用名为索引节点的系统来存放虚拟目录中所存储文件的信息。索引节点系统在每个物理设备中创建一个单独的表(称为索引节点表)来存储这些文件的信息。存储在虚拟目录中的每一个文件在索引节点表中都有一个条目。 ext文件系统名称中的extended部分来自其跟踪的每个文件的额外数据,包括:

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

Linux通过唯一的数值(称作索引节点号)来引用索引节点表中的每个索引节点,这个值是创建文件时由文件系统分配的。文件系统通过索引节点号而不是文件全名及路径来标识文件。

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

ext文件系统常见的问题是在文件写入到物理设备时,存储数据用的块很容易分散在整个设备中(称作碎片化,fragmentation)。数据块的碎片化会降低文件系统的性能,因为需要更长的时间在存储设备中查找特定文件的所有块

ext2文件系统

ext2的索引节点表为文件添加了创建时间值、修改时间值和最后访问时间值来帮助系统管理员追踪文件的访问情况。 ext2文件系统还将允许的最大文件大小增加到了2 TB(在ext2的后期版本中增加到了32 TB),以容纳数据库服务器中常见的大文件。

保存文件时, ext2文件系统通过按组分配磁盘块来减轻碎片化。通过将数据块分组,文件系统在读取文件时不需要为了数据块查找整个物理设备。

ext2文件系统由于容易在系统崩溃或断电时损坏而臭名昭著。即使文件数据正常保存到了物理设备上,如果索引节点表记录没完成更新的话, ext2文件系统甚至都不知道那个文件存在!

日志文件系统

日志文件系统为Linux系统增加了一层安全性。它不再使用之前先将数据直接写入存储设备再更新索引节点表的做法,而是先将文件的更改写入到临时文件(称作日志, journal)中。在数据成功写到存储设备和索引节点表之后,再删除对应的日志条目。

如果系统在数据被写入存储设备之前崩溃或断电了,日志文件系统下次会读取日志文件并处理上次留下的未写入的数据。

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

  • 数据模式 索引节点和文件都会被写入日志;丢失数据风险低,但性能差
  • 有序模式 只有索引节点数据会被写入日志,但只有数据成功写入后才删除;在性能和安全性之间取得了良好的折中
  • 回写模式 只有索引节点数据会被写入日志,但不控制文件数据何时写入;丢失数据风险高,但仍比不用日志好
ext3文件系统

它采用和ext2文件系统相同的索引节点表结构,但给每个存储设备增加了一个日志文件,以将准备写入存储设备的数据先记入日志。

默认情况下, ext3文件系统用有序模式的日志功能——只将索引节点信息写入日志文件,直到数据块都被成功写入存储设备才删除。
ext3文件系统无法恢复误删的文件,它没有任何内建的数据压缩功能(虽然有个需单独安装的补丁支持这个功能), ext3文件系统也不支持加密文件。

ext4文件系统

除了支持数据压缩和加密, ext4文件系统还支持一个称作区段( extent)的特性。区段在存储设备上按块分配空间,但在索引节点表中只保存起始块的位置。由于无需列出所有用来存储文件中数据的数据块,它可以在索引节点表中节省一些空间。

ext4还引入了块预分配技术( block preallocation)。如果你想在存储设备上给一个你知道要变大的文件预留空间, ext4文件系统可以为文件分配所有需要用到的块,而不仅仅是那些现在已经用到的块。 ext4文件系统用0填满预留的数据块,不会将它们分配给其他文件。

Reiser文件系统

ReiserFS文件系统只支持回写日志模式——只把索引节点表数据写到日志文件。 ReiserFS文件系统也因此成为Linux上最快的日志文件系统之一。

有两个有意思的特性被引入了ReiserFS文件系统:一个是你可以在线调整已有文件系统的大小;另一个是被称作尾部压缩( tailpacking)的技术,该技术能将一个文件的数据填进另一个文件的数据块中的空白空间。如果你必须为已有文件系统扩容来容纳更多的数据,在线调整文件系统大小功能非常好用。

JFS文件系统

JFS文件系统采用的是有序日志方法,即只在日志中保存索引节点表数据,直到真正的文件数据被写进存储设备时才删除它。这个方法在ReiserFS的速度和数据模式日志方法的完整性之间的采取的一种折中。
JFS文件系统采用基于区段的文件分配,即为每个写入存储设备的文件分配一组块。这样可以减少存储设备上的碎片。

XFS文件系统

XFS文件系统采用回写模式的日志,在提供了高性能的同时也引入了一定的风险,因为实际数据并未存进日志文件。 XFS文件系统还允许在线调整文件系统的大小,这点类似于ReiserFS文件系统,除了XFS文件系统只能扩大不能缩小。

写时复制文件系统

采用了日志式技术,你就必须在安全性和性能之间做出选择。尽管数据模式日志提供了最高的安全性,但是会对性能带来影响,因为索引节点和数据都需要被日志化。如果是回写模式日志,性能倒是可以接受,但安全性就会受到损害。

就文件系统而言,日志式的另一种选择是一种叫作写时复制( copy-on-write, COW)的技术。COW利用快照兼顾了安全性和性能。如果要修改数据,会使用克隆或可写快照。修改过的数据并不会直接覆盖当前数据,而是被放入文件系统中的另一个位置上。即便是数据修改已经完成,之前的旧数据也不会被重写。

ZFS文件系统

ZFS是一个稳定的文件系统,与Resier4、 Btrfs和ext4势均力敌。它最大的弱项就是没有使用GPL许可。自2013年发起的OpenZFS项目有可能改变这种局面。但是,在获得GPL许可之前, ZFS有可能终无法成为Linux默认的文件系统。

Btrf文件系统

Btrfs文件系统是COW的新人,也被称为B树文件系统。

稳定性、易用性以及能够动态调整已挂载文件系统的大小。

操作文件系统

创建分区

fdisk工具用来帮助管理安装在系统上的任何存储设备上的分区。它是个交互式程序,允许你输入命令来逐步完成硬盘分区操作

要启动fdisk命令,你必须指定要分区的存储设备的设备名,另外还得有超级用户权限。如果在没有对应权限的情况下使用该命令,你会得到类似于下面这种错误提示。

Unable to open /dev/sdb

fdisk交互式命令提示符使用单字母命令来告诉fdisk做什么。

  • a 设置活动分区标志
  • b 编辑BSD Unix系统用的磁盘标签
  • c 设置DOS兼容标志
  • d 删除分区
  • l 显示可用的分区类型
  • m 显示命令选项
  • n 添加一个新分区
  • o 创建DOS分区表
  • p 显示当前分区表
  • q 退出,不保存更改
  • s 为Sun Unix系统创建一个新磁盘标签
  • t 修改分区的系统ID
  • u 改变使用的存储单位
  • v 验证分区表
  • w 将分区表写入磁盘
  • x 高级功能

尽管看上去很恐怖,但实际上你在日常工作中用到的只有几个基本命令。

可以用p命令将一个存储设备的详细信息显示出来。

可以使用n命令在该存储设备上创建新的分区。

分区可以按主分区( primary partition)或扩展分区( extended partition)创建。主分区可以被 文件系统直接格式化,而扩展分区则只能容纳其他逻辑分区

扩展分区出现的原因是每个存储设备上只能有4个分区。可以通过创建多个扩展分区,然后在扩展分区内创建主分区进行扩展。

fdisk允许创建多种分区类型。使用l命令列出可用的不同类型。

存储设备的分区信息被写入分区表中, Linux系统通过ioctl()调用来获知新分区的出现。设置好分区之后,可以使用Linux文件系统对其进行格式化。

有些发行版和较旧的发行版在生成新分区之后并不会自动提醒Linux系统。如果是这样的话,你要么使用partprob或hdparm命令(参考相应的手册页),要么重启系统,让系统读取更新过的分区表。

创建文件系统
  • mkefs 创建一个ext文件系统
  • mke2fs 创建一个ext2文件系统
  • mkfs.ext3 创建一个ext3文件系统
  • mkfs.ext4 创建一个ext4文件系统
  • mkreiserfs 创建一个ReiserFS文件系统
  • jfs_mkfs 创建一个JFS文件系统
  • mkfs.xfs 创建一个XFS文件系统
  • mkfs.zfs 创建一个ZFS文件系统
  • mkfs.btrfs 创建一个Btrfs文件系统

并非所有文件系统工具都已经默认安装了。要想知道某个文件系统工具是否可用,可以使用type命令。

文件系统的检查与修复

fsck命令能够检查和修复大部分类型的Linux文件系统,包括本章早些时候讨论过的ext、ext2、 ext3、 ext4、 ReiserFS、 JFS和XFS。

该命令的格式是:

fsck options filesystem  

你可以在命令行上列出多个要检查的文件系统。文件系统可以通过设备名、在虚拟目录中的挂载点以及分配给文件系统的唯一UUID值来引用。

尽管日志式文件系统的用户需要用到fsck命令,但是COW文件系统的用户是否也得使用该命令还存在争议。实际上, ZFS文件系统甚至都没有提供fsck工具的接口。

fsck命令使用/etc/fstab文件来自动决定正常挂载到系统上的存储设备的文件系统。如果存储设备尚未挂载(比如你刚刚在新的存储设备上创建了个文件系统),你需要用-t命令行选项来指定文件系统类型。

  • -a 如果检测到错误,自动修复文件系统
  • -A 检查/etc/fstab文件中列出的所有文件系统
  • -C 给支持进度条功能的文件系统显示一个进度条(只有ext2和ext3)
  • -N 不进行检查,只显示哪些检查会执行
  • -r 出现错误时提示
  • -R 使用-A选项时跳过根文件系统
  • -s 检查多个文件系统时,依次进行检查
  • -t 指定要检查的文件系统类型
  • -T 启动时不显示头部信息
  • -V 在检查时产生详细输出
  • -y 检测到错误时自动修复文件系统

你可能注意到了,有些命令行选项是重复的。这是为多个命令实现通用的前端带来的部分问题。有些文件系统修复命令有一些额外的可用选项。如果要做更高级的错误检查,就需要查看这个文件系统修复工具的手册页面来确定是不是有该文件系统专用的扩展选项。

只能在未挂载的文件系统上运行fsck命令。对大多数文件系统来说,你只需卸载文件系统来进行检查,检查完成之后重新挂载就好了。但因为根文件系统含有所有核心的Linux命令和日志文件,所以你无法在处于运行状态的系统上卸载它。这正是亲手体验Linux LiveCD的好时机!只需用LiveCD启动系统即可,然后在根文件系统上运行fsck命令。

逻辑卷管理

如果用标准分区在硬盘上创建了文件系统,为已有文件系统添加额外的空间多少是一种痛苦的体验。你只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有地方了,你就必须弄一个更大的硬盘,然后手动将已有的文件系统移动到新的硬盘上。
这时候可以通过将另外一个硬盘上的分区加入已有文件系统,动态地添加存储空间。 Linux逻辑卷管理器( logical volume manager, LVM)软件包正好可以用来做这个。它可以让你在无需重建整个文件系统的情况下,轻松地管理磁盘空间。

逻辑卷管理布局

逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理的世界里,硬盘称作物理卷( physical volume, PV)。每个物理卷都会映射到硬盘上特定的物理分区。

多个物理卷集中在一起可以形成一个卷组( volume group, VG)。逻辑卷管理系统将卷组视为一个物理硬盘,但事实上卷组可能是由分布在多个物理硬盘上的多个物理分区组成的。卷组提供了一个创建逻辑分区的平台,而这些逻辑分区则包含了文件系统。

整个结构中的最后一层是逻辑卷( logical volume, LV)。逻辑卷为Linux提供了创建文件系统的分区环境,作用类似于到目前为止我们一直在探讨的Linux中的物理硬盘分区。 Linux系统将逻辑卷视为物理分区。
可以使用任意一种标准Linux文件系统来格式化逻辑卷,然后再将它加入Linux虚拟目录中的某个挂载点。

Linux 中的 LVM
快照

最初的Linux LVM允许你在逻辑卷在线的状态下将其复制到另一个设备。这个功能叫作快照。在备份由于高可靠性需求而无法锁定的重要数据时,快照功能非常给力。传统的备份方法在将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键任务的Web服务器或数据库服务器继续工作。遗憾的是, LVM1只允许你创建只读快照。一旦创建了快照,就不能再写入东西了。
LVM2允许你创建在线逻辑卷的可读写快照。有了可读写的快照,就可以删除原先的逻辑卷,然后将快照作为替代挂载上。这个功能对快速故障转移或涉及修改数据的程序试验(如果失败,需要恢复修改过的数据)非常有用。

条带化

有了条带化,可跨多个物理硬盘创建逻辑卷。当Linux LVM将文件写入逻辑卷时,文件中的数据块会被分散到多个硬盘上。每个后继数据块会被写到下一个硬盘上。

条带化有助于提高硬盘的性能,因为Linux可以将一个文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘移动读写磁头到多个不同位置。这个改进同样适用于读取顺序访问的文件,因为LVM可同时从多个硬盘读取数据。

LVM条带化不同于RAID条带化。 LVM条带化不提供用来创建容错环境的校验信息。事实上, LVM条带化会增加文件因硬盘故障而丢失的概率。单个硬盘故障可能会造成多个逻辑卷无法访问。

镜像

通过LVM安装文件系统并不意味着文件系统就不会再出问题。和物理分区一样, LVM逻辑卷也容易受到断电和磁盘故障的影响。一旦文件系统损坏,就有可能再也无法恢复。

LVM快照功能提供了一些安慰,你可以随时创建逻辑卷的备份副本,但对有些环境来说可能还不够。对于涉及大量数据变动的系统,比如数据库服务器,自上次快照之后可能要存储成百上千条记录。
这个问题的一个解决办法就是LVM镜像。镜像是一个实时更新的逻辑卷的完整副本。当你创建镜像逻辑卷时, LVM会将原始逻辑卷同步到镜像副本中。根据原始逻辑卷的大小,这可能需要一些时间才能完成。
一旦原始同步完成, LVM会为文件系统的每次写操作执行两次写入——一次写入到主逻辑卷,一次写入到镜像副本。可以想到,这个过程会降低系统的写入性能。就算原始逻辑卷因为某些原因损坏了,你手头也已经有了一个完整的最新副本!

使用 Linux LVM
定义物理卷

fdisk 创建了基本的Linux分区之后 ,需要通过t命令改变分区类型

分区类型8e表示这个分区将会被用作Linux LVM系统的一部分,而不是一个直接的文件系统

下一步是用分区来创建实际的物理卷。这可以通过pvcreate命令来完成。 pvcreate定义了用于物理卷的物理分区。它只是简单地将分区标记成Linux LVM系统中的分区而已。

sudo pvcreate /dev/sdb1
dev_is_mpath: failed to get device for 8:17
Physical volume "/dev/sdb1" successfully created

别被吓人的消息dev_is_mpath: failed to get device for 8:17或类似的消息唬住了。只要看到了successfully created就没问题。 pvcreate命令会检查分区是否为多路( multi-path, mpath)设备。如果不是的话,就会发出上面那段消息。

如果你想查看创建进度的话,可以使用pvdisplay命令来显示已创建的物理卷列表。

sudo pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "2.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 2.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 0FIuq2-LBod-IOWt-8VeN-tglm-Q2ik-rGU

pvdisplay命令显示出/dev/sdb1现在已经被标记为物理卷。注意,输出中的VG Name内容为空,因为物理卷还不属于某个卷组。

创建卷组

vgcreate命令需要一些命令行参数来定义卷组名以及你用来创建卷组的物理卷名。

sudo vgcreate Vol1 /dev/sdb1  
Volume group "Vol1" successfully created

sudo vgdisplay Vol1
--- Volume group ---
VG Name Vol1
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size 2.00 GiB
PE Size 4.00 MiB
Total PE 513
Alloc PE / Size 0 / 0
Free PE / Size 513 / 2.00 GiB
VG UUID oe4I7e-5RA9-G9ti-ANoI-QKLz-qkX4-58Wj6e

这个例子使用/dev/sdb1分区上创建的物理卷,创建了一个名为Vol1的卷组。
创建一个或多个卷组后,就可以创建逻辑卷了。

创建逻辑卷

Linux系统使用逻辑卷来模拟物理分区,并在其中保存文件系统。 Linux系统会像处理物理分区一样处理逻辑卷,允许你定义逻辑卷中的文件系统,然后将文件系统挂载到虚拟目录上。

要创建逻辑卷,使用lvcreate命令。虽然你通常不需要在其他Linux LVM命令中使用命令行选项,但lvcreate命令要求至少输入一些选项。

  • -c --chunksize 指定快照逻辑卷的单位大小
  • -C --contiguous 设置或重置连续分配策略
  • -i --stripes 指定条带数
  • -I --stripesize 指定每个条带的大小
  • -l --extents 指定分配给新逻辑卷的逻辑区段数,或者要用的逻辑区段的百分比
  • -L --size 指定分配给新逻辑卷的硬盘大小
  • –minor 指定设备的次设备号
  • -m --mirrors 创建逻辑卷镜像
  • -M --persistent 让次设备号一直有效
  • -n --name 指定新逻辑卷的名称
  • -p --permission 为逻辑卷设置读/写权限
  • -r --readahead 设置预读扇区数
  • -R --regionsize 指定将镜像分成多大的区
  • -s snapshot 创建快照逻辑卷
  • -Z --zero 将新逻辑卷的前1 KB数据设置为零

虽然命令行选项看起来可能有点吓人,但大多数情况下你用到的只是少数几个选项。

sudo lvcreate -l 100%FREE -n lvtest Vol1
Logical volume "lvtest" created

#如果想查看你创建的逻辑卷的详细情况,可用lvdisplay命令。
sudo lvdisplay Vol1
--- Logical volume ---
LV Path /dev/Vol1/lvtest
LV Name lvtest
VG Name Vol1
LV UUID 4W2369-pLXy-jWmb-lIFN-SMNX-xZnN-3KN208
LV Write Access read/write
LV Creation host, time ... -0400
LV Status available
# open 0
LV Size 2.00 GiB
Current LE 513
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2

现在可以看到你刚刚创建的逻辑卷了!注意,卷组名( Vol1)用来标识创建新逻辑卷时要使
用的卷组。
-l选项定义了要为逻辑卷指定多少可用的卷组空间。注意,你可以按照卷组空闲空间的百分比来指定这个值。本例中为新逻辑卷使用了所有的空闲空间。
你可以用-l选项来按可用空间的百分比来指定这个大小,或者用-L选项以字节、千字节( KB)、兆字节( MB)或吉字节( GB)为单位来指定实际的大小。 -n选项允许你为逻辑卷指定一个名称(在本例中称作lvtest)。

创建文件系统

运行完lvcreate命令之后,逻辑卷就已经产生了,但它还没有文件系统。你必须使用相应的命令行程序来创建所需要的文件系统。

sudo mkfs.ext4 /dev/Vol1/lvtest
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131376 inodes, 525312 blocks
26265 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7728 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.Use tune2fs -c or -i to override.

在创建了新的文件系统之后,可以用标准Linux mount命令将这个卷挂载到虚拟目录中,就跟它是物理分区一样。唯一的不同是你需要用特殊的路径来标识逻辑卷。

sudo mount /dev/Vol1/lvtest /mnt/my_partition

注意, mkfs.ext4和mount命令中用到的路径都有点奇怪。路径中使用了卷组名和逻辑卷名,而不是物理分区路径。

修改LVM
  • vgchange 激活和禁用卷组
  • vgremove 删除卷组
  • vgextend 将物理卷加到卷组中
  • vgreduce 从卷组中删除物理卷
  • lvextend 增加逻辑卷的大小
  • lvreduce 减小逻辑卷的大小

通过使用这些命令行程序,就能完全控制你的Linux LVM环境

在手动增加或减小逻辑卷的大小时,要特别小心。逻辑卷中的文件系统需要手动修整来处理大小上的改变。大多数文件系统都包含了能够重新格式化文件系统的命令行程序,比如用于ext2、 ext3和ext4文件系统的resize2fs程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

omnibots

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值