在Linux系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。Linux系统中常见的硬件设备的文件名称如下所示。
常见的硬件设备及其文件名称
硬件设备 | 文件名称 |
---|---|
IDE设备 | /dev/hd[a-d] |
SCSI/SATA/U盘 | /dev/sd[a-p] |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
磁带机 | /dev/st0或/dev/ht0 |
由于现在的IDE设备已经很少见了,所以一般的硬盘设备都会是以“/dev/sd”开头的。而一台主机上可以有多块硬盘,因此系统采用a~p来代表16块不同的硬盘(默认从a开始分配),而且硬盘的分区编号也很有讲究:
主分区或扩展分区的编号从1开始,到4结束;
逻辑分区从编号5开始。
国内很多Linux培训讲师以及很多知名Linux图书在讲到设备和分区名称时,总会讲错两个知识点。第一个知识点是设备名称的理解错误。很多培训讲师和Linux技术图书中会提到,比如/dev/sda表示主板上第一个插槽上的存储设备,学员或读者在实践操作的时候会发现果然如此,因此也就对这条理论知识更加深信不疑。但真相不是这样的,/dev目录中sda设备之所以是a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序,因此才会被命名为/dev/sda。大家以后在使用iSCSI网络存储设备时就会发现,明明主板上第二个插槽是空着的,但系统却能识别到/dev/sdb这个设备就是这个道理。
第二个知识点是对分区名称的理解错误。很多Linux培训讲师会告诉学员,分区的编号代表分区的个数。比如sda3表示这是设备上的第三个分区,而学员在做实验的时候确实也会得出这样的结果,但是这个理论知识是错误的,因为分区的数字编码不一定是强制顺延下来的,也有可能是手工指定的。因此sda3只能表示是编号为3的分区,而不能判断sda设备上已经存在了3个分区。
在填了这两个“坑”之后,再来分析一下/dev/sda5这个设备文件名称包含哪些信息,如图6-2所示。
首先,/dev/目录中保存的应当是硬件设备文件;其次,sd表示是存储设备;然后,a表示系统中同类接口中第一个被识别到的设备,最后,5表示这个设备是一个逻辑分区。一言以蔽之,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件”。考虑到我们的很多读者完全没有Linux基础,不太容易理解前面所说的主分区、扩展分区和逻辑分区的概念,因此接下来简单科普一下硬盘相关的知识。
正是因为计算机有了硬盘设备,我们才可以在玩游戏的过程中或游戏通关之后随时存档,而不用每次重头开始。硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表为64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。第一个扇区中的数据信息如图6-3所示。
现在,问题来了—第一个扇区最多只能创建出4个分区?于是为了解决分区个数不够的问题,可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针—一个指向另外一个分区的指针。这样一来,用户一般会选择使用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于4个)的需求。当然,就目前来讲大家只要明白为什么主分区不能超过4个就足够了。主分区、扩展分区、逻辑分区可以像图6-4那样来规划。
所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。
Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。
XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。
就像拿到了一张未裁切的完整纸张那样,我们首先要进行裁切以方便使用,然后在裁切后的纸张上画格以便能书写工整。在拿到了一块新的硬盘存储设备后,也需要先分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;您也可以选择不进行分区,但是必须对硬盘进行格式化处理。接下来刘遄老师再向大家简单地科普一下硬盘在格式化后发生的事情。再次强调,不用刻意去记住,只要能看懂就行了。
日常在硬盘需要保存的数据实在太多了,因此Linux系统中有一个名为super block的“硬盘地图”。Linux并不是把文件内容直接写入到这个“硬盘地图”里面,而是在里面记录着整个文件系统的信息。因为如果把所有的文件内容都写入到这里面,它的体积将变得非常大,而且文件内容的查询与写入速度也会变得很慢。Linux只是把每个文件的权限与属性记录在inode中,而且每个文件占用一个独立的inode表格,该表格的大小默认为128字节,里面记录着如下信息:
该文件的访问权限(read、write、execute);
该文件的所有者与所属组(owner、group);
该文件的大小(size);
该文件的创建或内容修改时间(ctime);
该文件的最后一次访问时间(atime);
该文件的修改时间(mtime);
文件的特殊权限(SUID、SGID、SBIT);
该文件的真实数据地址(point)。
而文件的实际内容则保存在block块中(大小可以是1KB、2KB或4KB),一个inode的默认大小仅为128B(Ext3),记录一个block则消耗4B。当文件的inode被写满后,Linux系统会自动分配出一个block块,专门用于像inode那样记录其他block块的信息,这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了。对于存储文件内容的block块,有下面两种常见情况(以4KB的block大小为例进行说明)。
情况1:文件很小(1KB),但依然会占用一个block,因此会潜在地浪费3KB。
情况2:文件很大(5KB),那么会占用两个block(5KB-4KB后剩下的1KB也要占用一个block)。
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。图6-5所示为VFS的架构示意图。从中可见,实际文件系统在VFS下隐藏了自己的特性和细节,这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以随意使用各种命令在任何文件系统中进行各种操作了(比如使用cp命令来复制文件)。
在Linux系统中,管理硬盘设备最常用的方法就当属fdisk命令了。fdisk命令用于管理磁盘分区,格式为“fdisk [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。不过与前面讲解的直接写到命令后面的参数不同,这条命令的参数是交互式的,因此在管理硬盘设备时特别方便,可以根据需求动态调整。
参数 | 作用 |
---|---|
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区表信息 |
w | 保存并退出 |
q | 不保存直接退出 |
[root@localhost ~]# fdisk -l
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000c928b
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 411647 204800 83 Linux
/dev/sda2 411648 4605951 2097152 82 Linux swap / Solaris
/dev/sda3 4605952 41943039 18668544 83 Linux
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3ca78df9
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 8e Linux LVM
/dev/sdb2 2099200 4196351 1048576 8e Linux LVM
/dev/sdb3 4196352 6293503 1048576 8e Linux LVM
[root@localhost ~]#
第1步:我们首先使用fdisk命令来尝试管理/dev/sdb硬盘设备。在看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:
第2步:输入参数n尝试添加新的分区。系统会要求您是选择继续输入参数p来创建主分区,还是输入参数e来创建扩展分区。这里输入参数p来创建一个主分区:
第3步:在确认创建一个主分区后,系统要求您先输入主分区的编号。主分区的编号范围是1~4,因此这里输入默认的1就可以了。接下来系统会提示定义起始的扇区位置,这不需要改动,我们敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入+1G即可创建出一个容量为1GB的硬盘分区。
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
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +1G
Partition 1 of type Linux and of size 1 GiB is set
第4步:再次使用参数p来查看硬盘设备中的分区信息。果然就能看到一个名称为/dev/sdb1、起始扇区位置为2048、结束扇区位置为4196351的主分区了。这时候千万不要直接关闭窗口,而应该敲击参数w后回车,这样分区信息才是真正的写入成功啦。
第5步:在上述步骤执行完毕之后,Linux系统会自动把这个硬盘主分区抽象成/dev/sdb1设备文件。我们可以使用file命令查看该文件的属性,但是刘遄老师在讲课和工作中发现,有些时候系统并没有自动把分区信息同步给Linux内核,而且这种情况似乎还比较常见(但不能算作是严重的bug)。我们可以输入partprobe命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个杀手锏百试百灵,一定会有用的。
[root@linuxprobe ]# file /dev/sdb1
/dev/sdb1: cannot open (No such file or directory)
[root@linuxprobe ]# partprobe
[root@linuxprobe ]# partprobe
[root@linuxprobe ]# file /dev/sdb1
/dev/sdb1: block special
详细信息描述
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3ca78df9
设备 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-20971519,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):+1G
分区 1 已设置为 Linux 类型,大小设为 1 GiB
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3ca78df9
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3ca78df9
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 8e Linux LVM
t 更改类型, 8e 代表lvm
[root@linuxprobe /]# fdisk /dev/sdb
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): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0xcdd05104
Device Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
如果硬件存储设备没有进行格式化,则Linux系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在Linux系统中用于格式化操作的命令是mkfs。这条命令很有意思,因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果:
[root@linuxprobe ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
对!这个mkfs命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。例如要格式分区为XFS的文件系统,则命令应为mkfs.ext4 /dev/sdb1。
[root@linuxprobe dev]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=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: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
我们在用惯了Windows系统后总觉得一切都是理所当然的,平时把U盘插入到电脑后也从来没有考虑过Windows系统做了哪些事情,才使得我们可以访问这个U盘的。接下来我们会逐一学习在Linux系统中挂载和卸载存储设备的方法,以便大家更好地了解Linux系统添加硬件设备的工作原理和流程。前面讲到,在拿到一块全新的硬盘存储设备后要先分区,然后格式化,最后才能挂载并正常使用。“分区”和“格式化”大家以前经常听到,但“挂载”又是什么呢?在这里给您一个最简单、最贴切的解释—当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。
mount命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。mount命令中可用的参数及作用如表6-3所示。挂载是在使用硬件设备前所执行的最后一步操作。只需使用mount命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了。对于比较新的Linux系统来讲,一般不需要使用-t参数来指定文件系统的类型,Linux系统会自动进行判断。而mount 中的-a参数则厉害了,它会在执行后自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。
参数 | 作用 |
---|---|
-a | 挂载所有在/etc/fstab中定义的文件系统 |
-t | 指定文件系统的类型 |
终于完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用mount命令将存储设备与挂载点进行关联;最后使用df -h命令来查看挂载状态和硬盘使用量信息。
[root@linuxprobe /]# mkdir -p java
[root@linuxprobe /]# mount /dev/sdb1 /java/
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
/dev/sdb1 976M 2.6M 907M 1% /java
卸载挂载点
$ umount /dev/hda1
$ umount /java
参数可以是设备文件或安装点
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
虽然按照上面的方法执行mount命令后就能立即使用文件系统了,但系统在重启后挂载就会失效,也就是说我们需要每次开机后都手动挂载一下。这肯定不是我们想要的效果,如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”(各字段的意义见表6-4)写入到/etc/fstab文件中。这个文件中包含着挂载所需的诸多信息项目,一旦配置好之后就能一劳永逸了。
用于挂载信息的指定填写格式中,各字段所表示的意义
字段 | 意义 |
---|---|
设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
如果想将文件系统为ext4的硬件设备/dev/sdb2在开机后自动挂载到/backup目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab文件中写入下面的信息,这样在系统重启后也会成功挂载。
[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults 0 0
前面学习的硬盘设备管理技术虽然能够有效地提高硬盘设备的读写速度以及数据的安全性,但是在硬盘分好区或者部署为RAID磁盘阵列之后,再想修改硬盘分区大小就不容易了。换句话说,当用户想要随着实际需求的变化调整硬盘分区的大小时,会受到硬盘“灵活性”的限制。这时就需要用到另外一项非常普及的硬盘设备资源管理技术了—LVM(逻辑卷管理器)。LVM可以允许用户对硬盘资源进行动态调整。
逻辑卷管理器是Linux系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘分区的动态调整。LVM的技术架构如图所示。
为了帮助大家理解,刘遄老师来举一个吃货的例子。比如小明家里想吃馒头但是面粉不够了,于是妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,准备蒸馒头吃。首先需要把这些面粉(物理卷[PV,Physical Volume])揉成一个大面团(卷组[VG,Volume Group]),然后再把这个大面团分割成一个个小馒头(逻辑卷[LV,Logical Volume]),而且每个小馒头的重量必须是每勺面粉(基本单元[PE,Physical Extent])的倍数。
物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列,这都可以。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是LVM的核心理念。
一般而言,在生产环境中无法精确地评估每个硬盘分区在日后的使用情况,因此会导致原先分配的硬盘分区不够用。比如,伴随着业务量的增加,用于存放交易记录的数据库目录的体积也随之增加;因为分析并记录用户的行为从而导致日志目录的体积不断变大,这些都会导致原有的硬盘分区在使用上捉襟见肘。而且,还存在对较大的硬盘分区进行精简缩容的情况。
我们可以通过部署LVM来解决上述问题。部署LVM时,需要逐个配置物理卷、卷组和逻辑卷。常用的部署命令如表7-2所示。
命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
扫描 | pvscan | vgscan | lvscan |
建立 | pvcreate | vgcreate | lvcreate |
显示 | pvdisplay | vgdisplay | lvdisplay |
删除 | pvremove | vgremove | lvremove |
扩展 | vgextend | lvextend | |
缩小 | vgreduce | lvreduce |
让新sdb的主分区1支持LVM技术。
若是创建物理卷失败,有可能磁盘挂载了(umount /mnt)
[root@linuxprobe /]# pvscan
PV /dev/sda2 VG rhel_linuxprobe lvm2 [19.51 GiB / 0 free]
Total: 1 [19.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 0 [0 ]
[root@linuxprobe /]# pvcreate /dev/sdb1
WARNING: ext4 signature detected on /dev/sdb1 at offset 1080. Wipe it? [y/n] y
Wiping ext4 signature on /dev/sdb1.
Physical volume "/dev/sdb1" successfully created
[root@linuxprobe /]# pvscan
PV /dev/sda2 VG rhel_linuxprobe lvm2 [19.51 GiB / 0 free]
PV /dev/sdb1 lvm2 [1.00 GiB]
Total: 2 [20.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 1 [1.00 GiB]
[root@linuxprobe /]# pvremove /dev/sdb1
Labels on physical volume "/dev/sdb1" successfully wiped
pvdisplay和pvs命令
[root@linuxprobe /]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[root@linuxprobe /]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel_linuxprobe lvm2 a-- 19.51g 0
/dev/sdb1 lvm2 a-- 1.00g 1.00g
[root@linuxprobe /]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name rhel_linuxprobe
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4994
Free PE 0
Allocated PE 4994
PV UUID vgri2e-8lV9-46Lw-F6tk-D9hQ-JkrR-c4xzP1
"/dev/sdb1" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 1.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 2Zej1y-de1v-SfhX-5jId-qNiX-RngU-6Qu69I
把名字为/dev/sdb1的物理卷加入到卷组中,并且卷组命名为javavg
[root@linuxprobe /]# vgcreate javavg /dev/sdb1
Volume group "javavg" successfully created
[root@linuxprobe /]# vgs
VG #PV #LV #SN Attr VSize VFree
javavg 1 0 0 wz--n- 1020.00m 1020.00m
rhel_linuxprobe 1 2 0 wz--n- 19.51g 0
[root@linuxprobe /]# vgdisplay javavg
--- Volume group ---
VG Name javavg
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 1020.00 MiB
PE Size 4.00 MiB
Total PE 255
Alloc PE / Size 0 / 0
Free PE / Size 255 / 1020.00 MiB
VG UUID 45kAcN-flU1-0n2a-BylI-Xrn2-vDTi-CEzc0T
vgdisplay和vgs命令
[root@linuxprobe /]# vgs
VG #PV #LV #SN Attr VSize VFree
javavg 1 0 0 wz--n- 1020.00m 1020.00m
rhel_linuxprobe 1 2 0 wz--n- 19.51g 0
[root@linuxprobe /]# vgdisplay javavg
--- Volume group ---
VG Name javavg
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 1020.00 MiB
PE Size 4.00 MiB
Total PE 255
Alloc PE / Size 0 / 0
Free PE / Size 255 / 1020.00 MiB
VG UUID 45kAcN-flU1-0n2a-BylI-Xrn2-vDTi-CEzc0T
删除逻辑卷的时候可以只写卷组的名称,不需要设备的绝对路径
删除名字为storage的卷组
[root@linuxprobe /]# vgremove storage
Volume group "storage" successfully removed
[root@linuxprobe /]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name rhel_linuxprobe
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4994
Free PE 0
Allocated PE 4994
PV UUID vgri2e-8lV9-46Lw-F6tk-D9hQ-JkrR-c4xzP1
"/dev/sdb1" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 1.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 8o6Fvh-SOI3-U1Q2-gRFZ-eof4-XgOC-jt33th
lvcreate命令,创建逻辑卷
[root@linuxprobe /]# lvcreate -L 900M -n javalv javavg
Logical volume "javalv" created
[root@linuxprobe /]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
javalv javavg -wi-a----- 900.00m
root rhel_linuxprobe -wi-ao---- 17.51g
swap rhel_linuxprobe -wi-ao---- 2.00g
[root@linuxprobe /]# lvdisplay
--- Logical volume ---
LV Path /dev/rhel_linuxprobe/swap
LV Name swap
VG Name rhel_linuxprobe
LV UUID hzHRjg-GD1i-0mff-K3QN-AlaN-dsSv-cId1zL
LV Write Access read/write
LV Creation host, time localhost, 2019-09-18 08:16:52 +0800
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Logical volume ---
LV Path /dev/rhel_linuxprobe/root
LV Name root
VG Name rhel_linuxprobe
LV UUID h7VYfL-xiF5-Wt2w-HaB9-Qfpp-7MM9-38xOSs
LV Write Access read/write
LV Creation host, time localhost, 2019-09-18 08:16:53 +0800
LV Status available
# open 1
LV Size 17.51 GiB
Current LE 4482
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
--- Logical volume ---
LV Path /dev/javavg/javalv
LV Name javalv
VG Name javavg
LV UUID ZebZis-KjJi-2GUx-3e5Q-f2Gl-L0Tp-JVVZ1d
LV Write Access read/write
LV Creation host, time linuxprobe.com, 2020-06-07 16:36:05 +0800
LV Status available
# open 0
LV Size 900.00 MiB
Current LE 225
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
mkfs.ext4 /dev/javavg/javalv
若格式化xfs文件系统,在后续的扩容或缩容会受到一定的影响
[root@linuxprobe /]# mkfs.ext4 /dev/javavg/javalv
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
57600 inodes, 230400 blocks
11520 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=236978176
8 block groups
32768 blocks per group, 32768 fragments per group
7200 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# mkfs.ext4 /dev/vg1/lv1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=33685504
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
lvdisplay和lvs命令
[root@linuxprobe /]# lvdisplay /dev/javavg/javalv
--- Logical volume ---
LV Path /dev/javavg/javalv
LV Name javalv
VG Name javavg
LV UUID ZebZis-KjJi-2GUx-3e5Q-f2Gl-L0Tp-JVVZ1d
LV Write Access read/write
LV Creation host, time linuxprobe.com, 2020-06-07 16:36:05 +0800
LV Status available
# open 0
LV Size 900.00 MiB
Current LE 225
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
[root@linuxprobe /]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
javalv javavg -wi-a----- 900.00m
root rhel_linuxprobe -wi-ao---- 17.51g
swap rhel_linuxprobe -wi-ao---- 2.00g
删除逻辑卷的时候需要执行逻辑卷路径
lvremove /dev/javavg/javalv
[root@linuxprobe /]# lvremove /dev/javavg/javalv
Do you really want to remove active logical volume javalv? [y/n]: y
Logical volume "javalv" successfully removed
[root@linuxprobe /]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
root rhel_linuxprobe -wi-ao---- 17.51g
swap rhel_linuxprobe -wi-ao---- 2.00g
mount命令,挂载磁盘
[root@linuxprobe /]# mount /dev/javavg/javalv /java
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
/dev/mapper/javavg-javalv 93M 1.6M 85M 2% /java
这里会发现,明明mount的是/dev/javavg/javalv 这个文件,显示的却是/dev/mapper/javavg-javalv这个文件,下面会看到它们指向的是同一个文件 /dm-2 文件
[root@linuxprobe /]# ls -l /dev/javavg/javalv
lrwxrwxrwx. 1 root root 7 Jun 7 16:49 /dev/javavg/javalv -> ../dm-2
[root@linuxprobe /]# ls -l /dev/mapper/javavg-javalv
lrwxrwxrwx. 1 root root 7 Jun 7 16:49 /dev/mapper/javavg-javalv -> ../dm-2
虽然按照上面的方法执行mount命令后就能立即使用文件系统了,但是系统在重启后挂载就会失效,也就是说我们需要每次开机后都手动挂载一下。如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式"设备文件,挂载目录,文件类型,权限选项,是否备份,是否自检"(各字段的意义见表)写入到/etc/fstab文件中。这个文件包含着挂载所需要的诸多信息项目,一点配置好之后就能一劳永逸了。
如果想将文件系统为ext4的逻辑卷在开机后自动挂载所在目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab文件中写入如下信息,这样在系统重新启动后也会挂载成功。
[root@linuxprobe /]# cd java
[root@linuxprobe java]# mkdir -p test
[root@linuxprobe java]# cd test
[root@linuxprobe test]# echo "hello world" >> test1.txt
[root@linuxprobe test]# cat test1.txt
hello world
[root@linuxprobe test]#
[root@linuxprobe test]# du -sh /java
17K /java
[root@linuxprobe test]# du -sh /java/test/test1.txt
2.0K /java/test/test1.txt
df -h
[root@linuxprobe test]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
/dev/mapper/javavg-javalv 93M 1.6M 85M 2% /java
[root@linuxprobe ~]# umount /java
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
[root@linuxprobe /]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
javalv javavg -wi-ao---- 100.00m
root rhel_linuxprobe -wi-ao---- 17.51g
swap rhel_linuxprobe -wi-ao---- 2.00g
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
/dev/mapper/javavg-javalv 93M 1.6M 85M 2% /java
[root@linuxprobe /]# umount /java
[root@linuxprobe /]# lvextend -L 900M /dev/javavg/javalv
Extending logical volume javalv to 900.00 MiB
Logical volume javalv successfully resized
[root@linuxprobe /]# e2fsck -f /dev/javavg/javalv
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/javavg/javalv: 13/25688 files (7.7% non-contiguous), 8899/102400 blocks
[root@linuxprobe /]# resize2fs /dev/javavg/javalv
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/javavg/javalv to 921600 (1k) blocks.
The filesystem on /dev/javavg/javalv is now 921600 blocks long.
[root@linuxprobe /]# !mount
mount /dev/javavg/javalv /java
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
/dev/mapper/javavg-javalv 869M 2.5M 817M 1% /java
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
/dev/mapper/javavg-javalv 869M 2.5M 817M 1% /java
[root@linuxprobe /]#
[root@linuxprobe /]#
[root@linuxprobe /]#
[root@linuxprobe /]# clear
[root@linuxprobe /]# umount /java
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
[root@linuxprobe /]# e2fsck -f /dev/javavg/javalv
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/javavg/javalv: 13/223288 files (7.7% non-contiguous), 34831/921600 blocks
[root@linuxprobe /]# resize2fs /dev/javavg/javalv 100M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/javavg/javalv to 102400 (1k) blocks.
The filesystem on /dev/javavg/javalv is now 102400 blocks long.
[root@linuxprobe /]# lvreduce -L 100M /dev/javavg/javalv
WARNING: Reducing active logical volume to 100.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce javalv? [y/n]: y
Reducing logical volume javalv to 100.00 MiB
Logical volume javalv successfully resized
[root@linuxprobe /]# !mount
mount /dev/javavg/javalv /java
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_linuxprobe-root 18G 6.2G 12G 35% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 92K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /run/media/linuxprobe/RHEL-7.0 Server.x86_64
/dev/mapper/javavg-javalv 93M 1.6M 85M 2% /java
xfs文件系统扩容
xfs文件系统不支持缩容,只能扩容
在xfs文件系统扩容的时候,不需要卸载,可直接扩容
xfs文件系统扩容,几大步骤:
首先卸载,格式化成xfs文件系统,然后再次挂载
设置逻辑卷的大小,lvresize -L 300M /dev/vg1/lv1
xfs文件系统执行这条命令执行xfs_growfs /dev/vg1/lv1,便可看到扩容成功
[root@hf-01 ~]# !umount 先取消挂载
umount /mnt/
[root@hf-01 ~]# mkfs.xfs -f /dev/vg1/lv1 格式化成xfs文件系统
meta-data=/dev/vg1/lv1 isize=256 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@hf-01 ~]# !mount 再次挂载
mount /dev/vg1/lv1 /mnt/
[root@hf-01 ~]# ls /mnt/ 这里会看到之前的文件目录不存在了
[root@hf-01 ~]# touch /mnt/233.txt
[root@hf-01 ~]# echo "aaa" > !$
echo "aaa" > /mnt/233.txt
[root@hf-01 ~]# cat !$
cat /mnt/233.txt
aaa
[root@hf-01 ~]# lvs 查看逻辑卷大小
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 vg1 -wi-ao---- 100.00m
[root@hf-01 ~]# lvresize -L 300M /dev/vg1/lv1 扩容到300M(这里不需要先卸载,直接扩容)
Size of logical volume vg1/lv1 changed from 100.00 MiB (25 extents) to 300.00 MiB (75 extents).
Logical volume vg1/lv1 successfully resized.
[root@hf-01 ~]# lvs 会发现逻辑卷扩容到300M
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 vg1 -wi-ao---- 300.00m
[root@hf-01 ~]# df -h 但是查看的时候,看看到还是100M(还需执行命令)
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 18G 2.4G 16G 14% /
devtmpfs 489M 0 489M 0% /dev
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 494M 6.7M 487M 2% /run
tmpfs 494M 0 494M 0% /sys/fs/cgroup
/dev/sda1 197M 75M 123M 38% /boot
/dev/mapper/vg1-lv1 97M 5.2M 92M 6% /mnt
[root@hf-01 ~]# xfs_growfs /dev/vg1/lv1 执行这条运行,xfs文件系统才是成功扩容
meta-data=/dev/mapper/vg1-lv1 isize=256 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 25600 to 76800
[root@hf-01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 18G 2.4G 16G 14% /
devtmpfs 489M 0 489M 0% /dev
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 494M 6.7M 487M 2% /run
tmpfs 494M 0 494M 0% /sys/fs/cgroup
/dev/sda1 197M 75M 123M 38% /boot
/dev/mapper/vg1-lv1 297M 5.5M 292M 2% /mnt