bash shell命令学习之文件系统篇

本博客内容来自《Linux命令行与shell脚本编程大全》第八章

目录

1、Linux文件系统

基本的Linux文件系统

ext文件系统

ext2文件系统

日志文件系统

ext3文件系统

ext4文件系统

Reiser文件系统

JSF文件系统

XFS文件系统

写时复制文件系统

ZFS文件系统

Btrf文件系统

2、操作文件系统

创建分区

fdisk命令创建分区

创建文件系统

文件系统的检查与修复

3、逻辑卷管理

逻辑卷管理布局

Linux中的LVM

快照

条带化

镜像

使用Linux LVM

定义物理卷

创建卷组

创建逻辑卷

创建文件系统

修改LVM


1、Linux文件系统

基本的Linux文件系统

  • ext文件系统

ext文件系统,即扩展文件系统,是Linux系统中最早引入的文件系统。主要特点有:

使用虚拟目录来操作硬件设备

在物理设备上按定长的块来存储数据(容易产生数据块碎片化)

使用索引节点系统来存放虚拟目录中所存储文件的信息

索引节点系统在每个物理设备中创建一个单独的索引节点表来存储文件的信息

Linux通过唯一的索引节点号来标识文件

文件大小不超过2G

基本流程是将数据直接写入存储设备再更新索引节点表

ext文件系统之所以叫扩展文件系统,因为包括每个文件的额外信息,包括:

文件名

文件大小

文件的属主

文件的属组

文件的访问权限

指向存有文件数据的每个硬盘快的指针

  • ext2文件系统

ext2文件系统对ext文件系统进行扩展,其索引节点表为文件添加了:

创建时间值

修改时间值

最后访问时间值

还将允许的最大文件大小增加到了2TB,后增加到32TB。

基于区段的文件分配,通过按组分配磁盘块来减轻碎片化,文件系统读取文件时不需要查找整个物理设备。

ext2系统由于容易在系统崩溃或断电时损坏而臭名昭著,索引数据表如果恰好没有更新完则将丢失已经保存的文件数据信息。

日志文件系统

更安全,先将文件修改写入临时文件(日志),在数据成功写入存储设备和索引节点表后再删除对应的日志条目。

文件系统的日志方法主要有:

数据模式:索引节点数据和文件都被写入日志,数据丢失风险低,效率低

有序模式:只将索引节点数据写入日志,成功写入后删除,性能和安全之间良好折中

回写模式:只将索引节点数据写入日志,不控制文件数据何时写入,丢失数据风险高

  • ext3文件系统

2001年引入Linux内核,Linux发行版近期默认文件系统。

在ext2的基础上为每个存储设备增加日志文件做缓存,默认使用有序模式,只将索引节点信息写入日志文件,直到数据块被成功写入存储设备才删除。

无法恢复误删除文件,没有任何内建的数据压缩功能,不支持加密文件。

  • ext4文件系统

大多数Linux发行版采用的文件系统。

支持数据压缩与加密,支持区段特性。

引入块预分配技术。

  • Reiser文件系统

只支持回写日志模式,是Linux上最快的日志文件系统之一。

可以在线调整已有文件系统的大小。

支持尾部压缩功能(将一个文件的数据填进另一个文件的数据块中的空白部分)。

  • JSF文件系统

日志化文件系统,采用有序日志方法。

基于区段的文件分配,减少碎片。

  • XFS文件系统

采用回写模式的日志。

允许在线调整文件系统大小,只扩大不缩小。

写时复制文件系统

写时复制技术(copy-on-write)利用快照兼顾安全性和性能。

修改数据时使用克隆或可写快照

修改后的数据不会直接覆盖当前数据,而是被放入文件系统的另一个位置上,屏蔽原数据,实现修改效果。

  • ZFS文件系统

sun公司研发,2012年投入Linux产品使用。

弱项是没有GPL许可。

  • Btrf文件系统

B树文件系统

在Reiser4的基础上改进。

2、操作文件系统

创建分区

创建分区来容纳文件系统,分区可以是整个或部分硬盘。

  • fdisk命令创建分区

fdisk命令可以用来帮助管理安装在系统上的任何存储设备上的分区。

现在我是root用户,因此通过fdisk命令可以进入设备的交互界面:

[[email protected] ~]# fdisk /dev/vda1
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.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x9f0fc58a.

Command (m for help): 

现在这个界面就在等待我们输入相关信息啦~可以输入以下命令:

a:设置活动分区标志

b:编辑BSD Unix系统用的磁盘标签

c:设置DOS兼容标志

d:删除分区

l:显示可用的分区类型

m:显示命令选项

n:添加新分区

p:显示当前分区表

q:退出,不保存修改

t:修改分区的系统ID

u:改变使用的存储单位

v:验证分区表

w:将分区表写入磁盘

查看存储设备的详细信息,使用p命令:

Command (m for help): p

Disk /dev/vda1: 42.9 GB, 42947575808 bytes, 83881984 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: 0x9f0fc58a

     Device Boot      Start         End      Blocks   Id  System

Command (m for help): 

存储设备明细后的列表说明这个设备中还没有任何分区,使用n命令创建新分区:

Command (m for help): n
Partition type:           ##分区主要有主分区和扩展分区两种类型
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1         ##每个设备只能有4个分区
First sector (2048-83881983, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-83881983, default 83881983): +4G   ##分配4G的存储空间
Partition 1 of type Linux and of size 4 GiB is set

Command (m for help): 

主分区可以被文件系统直接格式化,扩展分区则只能容纳逻辑分区,因为每个设备只能有4个分区,扩展分区内能够创建逻辑分区从而实现扩展。可以通过p命令查看创建的分区:

Command (m for help): p

Disk /dev/vda1: 42.9 GB, 42947575808 bytes, 83881984 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: 0x9f0fc58a

     Device Boot       Start             End         Blocks   Id  System
/dev/vda1p1            2048     8390655     4194304   83  Linux

默认类型为83,该类型定义了一个Linux文件系统。

用w命令将更改保存到存储设备上。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

  • 创建文件系统

在将数据存储到分区前,要先用某种文件系统对其进行格式化,这样Linux才能使用。

创建文件系统的命令行程序有:

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命令可以查看文件系统根据是否已经安装:

[[email protected] ~]# type mkfs.ext4
mkfs.ext4 is /usr/sbin/mkfs.ext4
[[email protected] ~]# type mkfs.btrfs
mkfs.btrfs is /usr/sbin/mkfs.btrfs
[[email protected] ~]# type mkfs.xfs
mkfs.xfs is /usr/sbin/mkfs.xfs
[[email protected] ~]# type mkreiserfs
-bash: type: mkreiserfs: not found

所有文件系统命令都允许通过不带选项的简单命令来创建默认的文件系统:

[[email protected] ~]# mkfs.ext4 /dev/vda1

  • 文件系统的检查与修复

fsck命令能够检查与修复大部分类型的Linux文件系统。命令格式为:

fsck options filesystem

3、逻辑卷管理

Linux逻辑卷管理器LVM软件包主要负责再现有文件系统空间不足时将另一个硬盘上的分区加入已有文件系统。

逻辑卷管理布局

逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。

硬盘分区被称为物理卷(physical volume)PV,每个物理卷都会映射到硬盘上特定的物理分区,多个物理卷集中在一起形成一个卷组(volume group)VG,一个VG被视为一个物理硬盘(事实上一个VG可能分布于多个物理硬盘上的多个分区)。

卷组VG为创建逻辑分区提供平台,逻辑分区里面则包含了文件系统。

逻辑卷(logical volume,LV)为Linux提供了创建文件系统的分区环境,作用类似于Linux中的物理硬盘分区,Linux将逻辑卷LV视为物理分区,可以使用任意一种标准Linux文件系统来格式化逻辑卷LV,再将其加入Linux虚拟目录中的某个挂载点。

关系图如下:

bash shell命令学习之文件系统篇

如上图所示,卷组横跨三个不同硬盘,覆盖五个独立分区,卷组内部有两个独立的逻辑卷,Linux视逻辑卷为物理分区,而不是直接与真实的物理硬盘交互,这样更加便于扩展和移除现有存储空间。

Linux中的LVM

逻辑卷管理器LVM可以用简单的命令行管理一个完整的逻辑卷管理环境。有两个可用版本:

LVM1:早期版本,只能用于Linux内核2.4版本

LVM2:更新版本,用于Linux内核2.6版本

  • 快照

最初的LVM允许你在逻辑卷在线的状态下将其复制到另一个设备,这个功能叫快照。该功能对快速故障转移或涉及修改数据的程序试验很有用。

  • 条带化

条带化功能可跨越多个物理硬盘创建逻辑卷,有助于提高硬盘性能。因为可以同时写入多个硬盘,无需在一个硬盘上等待太久。

  • 镜像

LVM镜像是一个实时更新的逻辑卷的完整副本,之后LVM每次为文件系统写操作执行两次写入——一次写入到主逻辑卷,一次写入到镜像副本。

使用Linux LVM

  • 定义物理卷

创建过程第一步是将硬盘上的物理分区转换成Linux LVM使用的物理卷区段,可以使用fdisk命令:

Command (m for help): t          ##改变分区类型
Selected partition 1
Hex code (type L to list all codes): 8e           ##分区类型8e表示这个分区会被用作Linux LVM的一部分
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): p

Disk /dev/vda1: 42.9 GB, 42947575808 bytes, 83881984 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: 0x9f0fc58a

     Device Boot      Start         End      Blocks   Id  System
/dev/vda1p1            2048     8390655     4194304   8e  Linux LVM

Command (m for help): w     ##保存设置
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

下一步使用分区来创建实际的物理卷,使用命令pvcreate(这个命令可能需要安装)

# pvcreate /dev/vda1p1

查看进度使用

# pvdisplay /dev/vda1p1

  • 创建卷组

下一步是从物理卷中创建一个或多个卷组:

vgcreate MyVg /dev/sdb1

就可以在物理卷/dev/sdb1上创建名为MyVg的卷组。

查看新建卷组细节:

vgdisplay MyVg

  • 创建逻辑卷

使用lvcreate命令。一般使用-l参数指定分配给新逻辑卷的逻辑区段数或者要用的逻辑区段的百分比,-n参数指定新逻辑卷的名称

# lvcreate -l 100%FREE -n lvtest MyVg    ##逻辑卷lvtest创建

  • 创建文件系统

运行完lvcreate命令后逻辑卷就创建好了,但是还没有文件系统。

mkfs.ext4 /dev/MyVg/lvtest

创建完文件系统后,可以用标准Linux mount命令将这个卷挂载到虚拟目录中,就跟他是物理分区一样

mount /dev/MyVg/lvtest /mnt/my_partion

  • 修改LVM

LVM的好处是可以动态修改文件系统。

vgchange:**和禁用卷组

vgremove:删除卷组

vgextend:将物理卷添加到卷组中

vgreduce:从卷组中删除物理卷

lvextend:增加逻辑卷大小

lvreduce:减小逻辑卷大小