序言
在Linux系统中,磁盘管理是一个必学的知识点。正确地进行磁盘分区、格式化和挂载可以确保我们能够充分利用磁盘空间并高效地存储和访问数据。
相比于Windows系统中的简单盘符管理,Linux中的磁盘管理更加复杂且灵活。在Linux系统中,一切设备都存储在/dev目录下,如磁盘、键盘、鼠标等。因此,如果要使用磁盘,我们需要对其进行分区、格式化和挂载等操作,以便将磁盘挂载到已知的文件夹下才可以正常使用。
在实操Linux磁盘管理前,最好先了解什么是磁盘和文件系统才可以进行快速实操。
<math xmlns="http://www.w3.org/1998/Math/MathML"> 学习直通车 : \color{#f00}{学习直通车:} </math>学习直通车:设置中文命令行(设置完重启即可)
apt-get install language-pack-zh-hans
update-locale LANG=zh_CN.UTF-8
本文使用Linux发行版本为 Ubuntu 23.10 但是用其它的发行版也不会存在太大差异。
若使用Ubuntu且想SSH登录则参考这篇文章:跳转
<math xmlns="http://www.w3.org/1998/Math/MathML"> ▼正片开始▼ \color{#9932CC}{▼正片开始▼} </math>▼正片开始▼🔔
一:磁盘分区
(一):基本介绍
磁盘分区是将物理磁盘划分为逻辑部分的过程。当我们购买一个硬盘时,它通常是一个连续的存储单元,被称为未分区的空间。通过进行磁盘分区,我们可以将硬盘划分为多个逻辑部分,每个部分被称为分区。
在Linux系统中,可以使用各种工具来进行磁盘分区,如fdisk、gdisk等。通过这些工具,我们可以选择要分区的磁盘,并指定分区的大小、类型等信息。比如对/dev/sda
设备分区,每个分区都会被分配成一个唯一的设备名(如 /dev/sda1
、 /dev/sdb2
等),并可以在文件系统中进行访问和管理。
分区前要搞明白自己磁盘有多大,2T以内可以使用MBR分区也可以使用GPT分区,但是超过2T必须使用GPT分区;MBR分区表请使用fdisk分区,GPT分区表请使用gdisk分区!
markdown
磁盘分区的好处包括:
1:空间管理:通过分区,我们可以更好地组织和管理磁盘上的数据。
- 不同的分区可以用于存储不同类型的数据,例如操作系统文件、应用程序、用户数据等。
2:数据保护:如果一个分区损坏或出现故障,其他分区的数据通常不会受到影响。
- 这样我们可以更好地保护和恢复数据。
3:多系统支持:磁盘分区还可以用于安装多个操作系统。
- 每个操作系统可以被安装在不同的分区上,各自独立运行。
(二):fdisk分区工具
若你的磁盘大小在2T以内的话,是可以使用fdisk命令来进行MBR分区的哟,切记超过2T的盘千万不要使用这个fdisk命令,因为你会发现,再怎么分区都不会超过2T,那就代表你剩下的容量无法被使用到,还有就是最好可以往电脑插入另外一块盘测试。
bash
Ⅰ:安装fdisk命令(正常都有):
sudo apt-get -y install fdisk # Ubuntu安装
sudo yum -y install fdisk # Centos安装
Ⅱ:fdisk命令基础语法:
fdisk -help # 查看操作手册
fdisk -l # 查看服务器存在多少磁盘和磁盘分区(可以借助 "| grep xx" 来查询)
fdisk -l /dev/sdb # 查询"/dev/sdb"盘分区
Ⅲ:fdisk磁盘分区(首先得进入磁盘,如进入/dev/sdb设备;fdisk /dev/sdb)
d:删除分区
F:列出未分区的空闲区
l:列出已知可设置的分区类型(如扩展分区的类型就是05)
n:添加新分区
p:打印分区表
t:更改分区类型(可以通过'l'列出来的类型中选择)
v:检查分区表
i:打印某个分区的相关信息
m:打印此菜单
w:将分区表写入磁盘并退出(就是保存之前的分区操作)
q:退出而不保存更改
g:在当前磁盘上创建一个新的 GPT 分区表
G:在当前磁盘上创建一个空的 GPT (IRIX) 分区表
o:在当前磁盘上创建一个空的 DOS 分区表(MBR分区下默认就是DOS)
s:在当前磁盘上创建一个空的 Sun 分区表
<math xmlns="http://www.w3.org/1998/Math/MathML"> 基本示例 : \color{#f69}{基本示例:} </math>基本示例:
点击示例1:为"/dev/sdc"磁盘设备进行基本的分区
bash
"涉及 n 选项"
进入 '/dev/sdc' 磁盘
>> fdisk /dev/sdc
命令(输入 m 获取帮助): n # 代表创建分区
分区类型
p 主分区 (0 primary, 0 extended, 4 free)
e 扩展分区 (逻辑分区容器)
选择 (默认 p): p
分区号 (1-4, 默认 1): 1
第一个扇区 (2048-41943039, 默认 2048): 2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, 默认 41943039): +2G
创建了一个新分区 1,类型为"Linux",大小为 2 GiB。
补充:关于'+/-size{K,M,G,T,P}'的意思是,分区的大小可以不用写扇区结束大小,而是直接设置易懂的大小,
如 +2G、+512M、+128k 等等,这样就会简单点。
'注:最多四个主分区,若有多个分区需要在其中一个主分区内创建一个逻辑分区,并在这个逻辑分区内创建多个分区。'
点击示例2:删除一个分区,并且将"/dev/sdc3"更改为FAT12分区
bash
# 下面这个是我创建的几个测试分区;
# 可以看出/dev/sdc4分区为扩展分区,它的起点和末尾正好把sdc5~sdc7包裹着
# 这3个分区其实都是在sdc4的逻辑分区内创建的分区
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdc1 2048 4196351 4194304 2G 83 Linux
/dev/sdc2 4196352 12584959 8388608 4G 83 Linux
/dev/sdc3 12584960 23070719 10485760 5G 83 Linux
/dev/sdc4 23070720 62914559 39843840 19G 5 扩展
/dev/sdc5 23072768 35655679 12582912 6G 83 Linux
/dev/sdc6 35657728 44046335 8388608 4G 83 Linux
/dev/sdc7 44048384 62914559 18866176 9G 83 Linux
# 删除分区直接使用 d 选项
命令(输入 m 获取帮助): d
分区号 (1-7, 默认 7): 7 # 这里的数值1-7代表可以选择的分区
分区 7 已删除。
# 更改分区类型直接使用 t 选项
命令(输入 m 获取帮助): t
分区号 (1-6, 默认 6): 3 # 选择需要改变的分区
Hex code or alias (type L to list all): l # 输入L会打印可选分区类型,在里面查找十六进制分区序号
Hex code or alias (type L to list all): 05 # 05代表FAT12的十六进制序号
# 使用选项 t 查看还有多少空间未被分区
命令(输入 m 获取帮助): F
未分区的空间 /dev/sdc:9 GiB,9659482112 个字节,18866176 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
起点 末尾 扇区 大小
44048384 62914559 18866176 9G
点击示例3:使用 p 选项查看分区信息
bash
# 使用选项 p 查看分区信息
Disk /dev/sdc:30 GiB,32212254720 字节,62914560 个扇区
Disk model: VMware Virtual S
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x1d3d3a3d
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdc1 2048 4196351 4194304 2G 83 Linux
/dev/sdc2 4196352 12584959 8388608 4G 83 Linux
/dev/sdc3 12584960 23070719 10485760 5G 1 FAT12
/dev/sdc4 23070720 62914559 39843840 19G 5 扩展
/dev/sdc5 23072768 35655679 12582912 6G 83 Linux
/dev/sdc6 35657728 44046335 8388608 4G 83 Linux
<math xmlns="http://www.w3.org/1998/Math/MathML"> 注意事项 : \color{#f69}{注意事项:} </math>注意事项:
- 使用fdisk命令时,请小心操作,确保正确选择设备文件名。
- 在对磁盘进行分区操作前,务必备份重要数据,以防止数据丢失。
- 若出现
bash: fdisk: command not found
的错误提示,说明fdisk命令未安装。
(三):gdisk分区工具
由于fdisk命令不能很好的支持GPT分区;而MBR分区不支持大于2T的分区,对于超过2T的硬盘分区来说只能使用GPT分区,所以就要使用gdisk命令;gdisk也可以处理MBR分区的硬盘,甭管硬盘多大,都可以分区。
bash
Ⅰ:安装gdisk命令(正常都有):
sudo apt-get -y install gdisk # Ubuntu安装
sudo yum -y install gdisk # Centos安装
Ⅱ:gdisk命令基础语法:
gdisk 设备名称
示例:gdisk /dev/sdf
# 对'/dev/sdf'磁盘分区,注意设备后面没有数字,有数字的是已分区的,(使用lsblk查看磁盘)
Ⅲ:gdisk磁盘分区(首先得进入磁盘后才可以执行这些选项)
b:将GPT数据备份到文件
c:更改分区的名称
d:删除一个分区
i:显示分区的详细信息
l:列出已知的分区类型
n:增加一个分区
o:创建新的空GUID分区表(GPT)
p:打印分区表
q:不保存退出
r:恢复和转换选项(仅限专家)
s:对分区排序
t:更改分区类型
v:验证磁盘
w:将分区表写入磁盘并退出(就是保存之前的分区操作)
x:额外功能(仅限专家)
?:打印菜单
<math xmlns="http://www.w3.org/1998/Math/MathML"> 基本示例 : \color{#f69}{基本示例:} </math>基本示例:
点开示例1:进入"/dev/sdf"分区的磁盘并新增分区
bash
"【进入需要分区的磁盘】"
>> gdisk /dev/sdf
GPT fdisk (gdisk) version 1.0.9
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
'扫描到了GPT分区表,若GPT: not present时可以使用 o 选项重置一下'
Found valid GPT with protective MBR; using GPT.
"【新增分区 n选项】"
>> Command (? for help): n
'分区编号(1-128,默认为1);这里最多创建128个分区'
Partition number (1-128, default 1):
'设置开始扇区'
First sector (34-8589934558, default = 2048) or {+-}size{KMGTP}: 2048
'设置结束扇区(我们不需要自己去计算扇区号码,通过+容量的这个方式)'
'通过+容量方式,其实gdisk主动去帮你算出最接近你需要的容量的扇区号码。'
Last sector (2048-8589934558, default = 8589932543) or {+-}size{KMGTP}: +1G
'当前分区类型为8300(Linux文件系统),具体可以通过L选项查询'
Current type is 8300 (Linux filesystem)
'自己设置想要的十六进制代码或GUID类型(默认8300,可以使用L查询)'
Hex code or GUID (L to show codes, Enter = 8300):8300
'已将分区类型更改为"Linux文件系统"'
Changed type of partition to 'Linux filesystem'
'##### 特殊说明 #####'
1:在Last sector那行绝对不要使用默认值!默认值会将所有的容量用光!因为默认选择最大的扇区号码!
我们可以通过+G、+M、+K、+T等方式设置,所以我加上+1G代表分1GB空间的分区,
不需要计算sector的数量,gdisk会根据你填写的数值。
2:Linux一般分区类型都是8200/8300/8e00等三种格式Windows几乎都用0700这样;如果忘记这些,
可以在gdisk内按下L来显示类型;如下面几个常用的:
8200(交换分区) 8300(普通Linux文件系统) 8e00(扩展LVM逻辑卷)
点开示例2:分区的查询
bash
"【输出目前磁盘的状态 p选项】"
>> Command (? for help): p
'磁盘文件名:扇区总数,磁盘容量'
Disk /dev/sdf: 8589934592 sectors, 4.0 TiB
'当前是虚拟机的磁盘(其实并不是真实的4T物理磁盘)'
Model: VMware Virtual S
'一个扇区大小512字节'
Sector size (logical/physical): 512/512 bytes
'磁盘的GPT标识'
Disk identifier (GUID): D3DD6483-3414-4722-BAE4-8A4B608172E7
'分区表最多可容纳128个条目'
Partition table holds up to 128 entries
'主分区表从扇区2开始,到扇区33结束'
Main partition table begins at sector 2 and ends at sector 33
'第一可用扇区为34,最后可用扇区为8589934558'
First usable sector is 34, last usable sector is 8589934558
'分区将在2048个扇区边界上对齐'
Partitions will be aligned on 2048-sector boundaries
'总可用空间为8589934525个扇区(4.0 TiB)'
Total free space is 8589934525 sectors (4.0 TiB)
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB 8300 Linux filesystem
2 2099200 6293503 2.0 GiB 0700 Microsoft basic data
下半部的分区表信息主要在列出每个分区槽的个别信息,具体如下:
Number: 分区槽编号,1号指的是/dev/sdf1
Start (sector): 每一个分区槽的开始扇区号码位置
End (sector): 每一个分区的结束扇区号码位置,与start之间可以算出分区槽的总容量
Size: 分区槽的容量了
Code: 分区槽内的可能的文件系统类型。Linux为8300, swap为8200。
'注:不过这个类型只是一个提示而已,不见得真的代表此分区槽内的文件系统!'
Name: 文件系统的名称等等。
从上表我们可以发现几件事情:
整个磁盘还可以进行额外的分区,因为最大扇区为8589934525,但只使用到6293503号而已。
分区槽的设计中,新分区通常选用上一个分区的结束扇区号码数加1作为起始扇区号码!
点开示例3:删除和保存
bash
"【分区删除】"
>> Command (? for help): d
Partition number (1-2): 1 # 可选2个已经分区好的删除,删除后使用 p 选项查看
"【分区保存】"
>> Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N):y
OK; writing new GUID partition table (GPT) to /dev/sdf.
The operation has completed successfully.
(四):观察磁盘分区状态
1:lsblk命令
lsblk命令其实是列出系统上的所有磁盘列表(全称:List Block Device)
bash
"语法:"
>> lsblk [-选项参数] [设备]
选项与参数:
-d:仅列出磁盘本身,并不会列出该磁盘的分区数据
-f:同时列出该磁盘内的文件系统名称
-i:使用ASCII的线段输出,不要使用复杂的编码(在某些环境下很有用)
-m:同时输出该装置在/dev底下的权限数据(rwx的数据)
-p:列出该装置的完整文件名!而不是仅列出最后的名字而己。
-t:列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
"示例1:列出本系统下的所有磁盘与磁盘内的分区信息"
>> lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
└─sda2 8:2 0 20G 0 part /var/snap/firefox/common/host-hunspell
/ # 被挂载到根目录
sdb 8:16 0 20G 0 disk # 可以看出sdb盘被分成了2个分区(用了7G分区)
├─sdb1 8:17 0 5G 0 part
└─sdb2 8:18 0 2G 0 part
sdc 8:32 0 60G 0 disk # 一个完整未被分区的磁盘60G
sdd 8:48 0 30G 0 disk
sde 8:64 0 40G 0 disk
sdf 8:80 0 4T 0 disk
└─sdf2 8:82 0 2G 0 part
sr0 11:0 1 1024M 0 rom
"目录介绍:"
NAME: 就是设备的文件名。会省略/dev等前导目录!
MAJ:MIN: 其实核心认识的设备都是透过这两个代码来熟悉的!分别是主要:次要装置代码!
RM: 是否为可卸除装置(removable device),如光盘、USB磁盘等等
SIZE: 磁盘或者分区容量
RO: 是否为只读设备的意思
TYPE: 是磁盘(disk)、分区槽(partition) 还是只读存储器(rom)等输出
MOUTPOINT: 挂载点!
2:blkid命令
blkid命令是列出设备的UUID等参数(全称:Block Id);虽然lsblk已经可以使用-f来列出文件系统与设备的UUID数据,不过直接使用blkid来找出装置的UUID更方便;UUID是全局唯一标识符,Linux会将系统内所有的装置都给予一个独一无二的标识符,这个标识符就可以拿来作为挂载或者是使用这个设置或文件系统之用了。
3:parted命令
parted命令是列出磁盘的分区表类型与分区类型(这里暂且不说它的分区)
bash
语法:
>> parted 设备名称 print
示例(列出/dev/sdb1磁盘信息):
>> parted /dev/sdb1 print
型号:VMware, VMware Virtual S (scsi) '磁盘的模块名称(厂商)'
磁盘 /dev/sdb: 21.5GB '磁盘的总容量'
扇区大小 (逻辑/物理):512B/512B '磁盘的每个逻辑/物理扇区容量'
分区表:msdos '分区表格式(MBR/GPT),此时msdos可以认为MBR'
磁盘标志:
编号 起始点 结束点 大小 类型 文件系统 标志
1 1049kB 5370MB 5369MB primary ext3
2 5370MB 7517MB 2147MB primary ext3
3 7517MB 9665MB 2147MB primary ext3
4 9665MB 21.5GB 11.8GB extended
5 9666MB 12.9GB 3221MB logical ext2
6 12.9GB 14.0GB 1074MB logical ext3
7 14.0GB 17.2GB 3221MB logical
8 17.2GB 19.3GB 2147MB logical
9 19.3GB 21.5GB 2141MB logical
二:分区格式化(配置文件系统)
(一):基本介绍
格式化是在对磁盘进行分区后,对某个分区进行格式化操作后以准备存储数据。格式化会清空该分区中的所有数据,并在磁盘上创建一个新的文件系统,以便操作系统可以正确地读取和写入数据。分区格式化的本质就是需要在分区上创建一个文件系统;而文件系统是组织和访问数据的方式,包括文件和目录的结构,数据的存储和检索,以及权限、属性和元数据的管理。一般文件系统的类型如Windows支持NTFS和FAT32,而Linux支持ext4和XFS等;我们需要按照实际需求而创建不同的文件系统。
格式其实就是创建文件系统(make filesystem),所以说创建系统的命令也就是mkfs
,它只是一个综合指令;当我们创建ext4文件系统时则需要写成 mkfs -t ext4 设备号
,其实本质上是调用mkfs.ext4
命令,我们也可以直接写成 mkfs.ext4 设备号
(推荐) 来直接创建。
bash
'查看系统可以支持创建的文件系统命令:'
>> mkfs [tab键] [tab键] #按2次tab键就可出来
mkfs mkfs.bfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4
mkfs.fat mkfs.minix mkfs.msdos mkfs.ntfs mkfs.vfat
'上面打印的就是可以创建的文件系统,可以使用 mkfs -t 的方式,也可以直接使用 mkfs.xxx的方式'
'也可以通过如下命令查询:'
>> ll /sbin/mkfs.*
-rwxr-xr-x 1 root root 22912 10月 6 05:27 /sbin/mkfs.bfs*
-rwxr-xr-x 1 root root 35144 10月 6 05:27 /sbin/mkfs.cramfs*
lrwxrwxrwx 1 root root 6 7月 27 02:26 /sbin/mkfs.ext2 -> mke2fs*
lrwxrwxrwx 1 root root 6 7月 27 02:26 /sbin/mkfs.ext3 -> mke2fs*
lrwxrwxrwx 1 root root 6 7月 27 02:26 /sbin/mkfs.ext4 -> mke2fs*
-rwxr-xr-x 1 root root 52048 3月 23 2022 /sbin/mkfs.fat*
-rwxr-xr-x 1 root root 43408 10月 6 05:27 /sbin/mkfs.minix*
lrwxrwxrwx 1 root root 8 3月 23 2022 /sbin/mkfs.msdos -> mkfs.fat*
lrwxrwxrwx 1 root root 6 2月 15 2023 /sbin/mkfs.ntfs -> mkntfs*
lrwxrwxrwx 1 root root 8 3月 23 2022 /sbin/mkfs.vfat -> mkfs.fat*
'其实我们可以发现如mkfs.ext2命令是软链接到mke2fs命令上,mkfs.ntfs命令是软链接到mkntfs'
'比如:mke2fs就相当于使用的mkfs.ext2'
通过上面可以知道mkfs
和mke2fs
都是用于创建文件系统的命令,具体看下面说明。
(二):mkfs创建文件系统
mkfs
它是一个通用的命令,用于创建各种不同类型的文件系统,可以根据指定的文件系统类型来创建。它可以创建的文件系统有ext2、ext3、ext4、bfs、ntfs等。mkfs命令提供了更广泛的选项和功能,适用于不同操作系统和场景。但是一般不推荐直接使用mkfs -t 文件系统
命令,而是使用如mkfs.ext4
等命令文件。
1:mkfs.ext2~4命令
bash
'mkfs.ext2、mkfs.ext3、mkfs.ext4语法:'
[-c|-l 文件名] [-b 块大小] [-C 簇大小] [-i 每inode的字节数] [-I inode大小] [-J 日志选项]
[-G 弹性组大小] [-N inode数] [-d 根目录] [-m 保留块所占百分比] [-o 创始系统名]
[-g 每组的块数] [-L 卷标] [-M 上一次挂载点] [-O 特性[,...]] [-r 文件系统版本]
[-E 扩展选项[,...]] [-t 文件系统类型] [-T 用法类型] [-U UUID] [-e 错误行为][-z 撤销文件]
[-jnqvDFKSV] 设备 [块数]
参数详细介绍:
-c:在制作文件系统前先检查是否有坏块
-b:设置文件系统内的逻辑块(block)大小,(如1k,2k,4k;不过Linux最大为4K)
-L:设置文件系统卷标Label(后面可以使用卷标挂载这个磁盘分区)
-j:创建ext3日志文件系统,mkfs.ext3自带了该选项;
-m:保留块所占百分比,它是预留给管理员磁盘块(参数为数值,不要加%)
-i:指定每一个inode的字节数,但是必须是block大小单位的整数倍
-U:设置磁盘分区内文件系统的UUID(必须写标准UUID)
'下面命令基本使用说明:'
1:虽然使用mkfs.ext2非日志系统,但是加上 -j 就会强制变为ext3文件系统
2:mkfs.ext2就相当于mkfs -t ext2
'命令:'
>> mkfs.ext2 -b 2k -L demoTest -j /dev/vdb1
mke2fs 1.46.5 (30-Dec-2021)
/dev/vdb1 有一个 ext3 文件系统
创建于 Fri Jan 19 23:41:00 2024
无论如何也要继续?(y,N) y
创建含有 1048576 个块(每块 2k)和 131072 个 inode 的文件系统
文件系统 UUID:a94d46ba-4f33-4ab3-9cd4-cfee31e78367
超级块的备份存储于下列块:
16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816
正在分配组表: 完成
正在写入 inode表: 完成
创建日志(16384 个块): 完成
写入超级块和文件系统账户统计信息: 已完成
>> blkid /dev/vdb1 # 查看刚才创建的文件系统
/dev/vdb1: LABEL="demoTest" UUID="a94d46ba-4f33-4ab3-9cd4-cfee31e78367"
SEC_TYPE="ext2" BLOCK_SIZE="2048" TYPE="ext3" PARTUUID="1c2f79e7-01"
(三):mke2fs创建文件系统
mke2fs
是mkfs的一个特定实现,专门提供了一些特定于ext文件系统的一个专门的工具。是mkfs.ext2,mkfs.ext3,mkfs.ext4的衍生命令,其用法也是和这些命令一样。
bash
'若直接使用mke2fs则默认是创建ext2文件系统'
说明:
对/dev/vdb2创建一个ext类型的文件系统,并指定为ext3日志文件系统,
并且他的逻辑块Block大小为2K,Inode字节数大小4K,保留块占比5%
'命令:'
>> mke2fs -j -b 2048 -m 5 -i 4096 /dev/vdb2
mke2fs 1.46.5 (30-Dec-2021)
/dev/vdb2 有一个 ext3 文件系统
创建于 Fri Jan 19 23:41:22 2024
无论如何也要继续?(y,N) y
创建含有 524288 个块(每块 2k)和 262144 个 inode 的文件系统
文件系统 UUID:456fbfb6-cbab-45c3-a0a9-36e89ee755f1
超级块的备份存储于下列块:
16384, 49152, 81920, 114688, 147456, 409600, 442368
正在分配组表: 完成
正在写入 inode表: 完成
创建日志(16384 个块): 完成
写入超级块和文件系统账户统计信息: 已完成
'发现我没有使用-L设置卷标,其实后期也是可以设置的:'
'e2label'命令设置卷标,如下:
e2label /dev/vdb2 查看卷标
e2label /dev/vdb2 demoLabel 设置卷标
(四):查看或调整文件系统信息
1:tune2fs命令
bash
1:查看指定设备的文件系统详细信息:
tune2fs -l /dev/sdb
2:设置强制检查前,文件系统还可以挂载的最大次数:
tune2fs -c 15 /dev/sdb
3:设置10天后将自动检查文件系统:
tune2fs -i 10d /dev/sdb
4:设置3周后将自动检查文件系统:
tune2fs -i 3w /dev/sdb
5:设置6个月后将自动检查文件系统:
tune2fs -i 6m /dev/sdb
6:添加日志功能,将ext2转换成ext3文件系统:
tune2fs -j /dev/sdb
7:设置指定的磁盘分区文件系统保留空间为40000个磁盘块:
tune2fs -r 40000 /dev/sdb
2:dumpe2fs命令
这个命令是一个用于显示ext2、ext3、ext4文件系统详细信息的命令行工具。它可以显示文件系统的超级块、块组描述符、inode表、目录结构、块位图、inode位图等信息。
bash
语法:
dumpe2fs [-bfghimxV] [-o superblock=<超级块编号>] [-o blocksize=<块大小>] 设备
选项详细说明:
-b:显示文件系统中保留的损坏块。
-f:强制执行。
-g:简洁显示块组描述符列表(如:63:1032192:-1:-1:786447:786463:790304)。
-h:只显示超级块信息,而不显示任何块组描述符详细信息。
-i:显示从e2image获得的文件系统信息,使用设备作为image文件的路径名。
-x:以十六进制显示文件系统信息
-V:显示命令版本信息,并且退出
-o superblock=superblock:检查文件系统时,使用指定大小的超级块。
'此选项通常不需要,除非文件系统向导正在检查严重损坏的文件系统的剩余部分。'
-o blocksize=blocksize:检查文件系统时,指定块大小。
'此选项通常不需要,除非文件系统向导正在检查严重损坏的文件系统的剩余部分。'
设备参数:
指定要显示信息的文件系统所在的设备。
示例:
dumpe2fs /dev/sda2
Inode count: 1310720 文件系统inode号数量
Block count: 5242112 文件系统block块总数
Reserved block count: 262105 保留的block块数量
Free blocks: 2735814 空闲的block块数量
Free inodes: 1144046 空闲的inode号数量
First block: 0 第一个block块号
Block size: 4096 block块大小4KB
Fragment size: 4096 碎片大小
Reserved GDT blocks: 1024 保留GDP的块总数
Blocks per group: 32768 每个块组的block块数量
Inodes per group: 8192 每个块组的inode号数量
Inode blocks per group: 512 每个块组inode占用的block块数量
Flex block group size: 16 inode表大小
First inode: 11 文件系统的第一个inode号
Inode size: 256 每个inode的大小为256字节
.....省略部分
组 159:(块 5210112-5242111) 校验和 0xd815 [INODE_UNINIT, ITABLE_ZEROED]
块位图位于 4718607 (bg #144 + 15),校验和 0xa8269ef3
inode 位图位于 4718623 (bg #144 + 31),校验和 0x00000000
inode 表位于 4726304-4726815 (bg #144 + 7712)
32000 个可用块,8192 个可用 inode,0 个目录 ,8192 个未使用的 inode
可用块数: 5210112-5242111
可用 inode 数: 1302529-1310720
后面省略...
三:挂载与卸载
(一):基本介绍
将存储设备(如硬盘、分区、网络存储等)与文件系统关联起来,并通过挂载的方式挂载到任意根目录内的挂载点上,这样文件系统就能够访问我们挂载的存储设备上数据了。在计算机中,存储设备通常被划分为多个分区或卷。每个分区都可以包含一个独立的文件系统。然而这些文件系统并不会自动在文件系统层次结构中可用,需要通过挂载将其与特定的目录关联起来。具体来说挂载涉及以下概念:
- 存储设备: 可以是物理磁盘、分区、USB驱动器、网络存储等。每个存储设备都有一个唯一的设备名称,例如/dev/sda、/dev/sdb1等。
- 文件系统: 存储设备上的数据组织和管理方式,例如ext4、NTFS、FAT32等。每个文件系统都有自己的特性和属性。
- 挂载点: 是文件系统在文件系统层次结构中的位置,也是存储设备连接的目标。它是一个现有的空目录,用于访问存储设备上的文件和文件夹。
- 挂载命令: 用于将存储设备与指定的挂载点关联起来的命令。在Linux中使用mount命令执行挂载操作。
通过挂载,文件系统的目录结构和文件可以在挂载点处访问,并与其它文件系统协同工作。例如将USB闪存驱动器挂载到/mnt目录下,可以通过/mnt目录来浏览和操作闪存驱动器中的文件。需要注意的是,只有具备足够权限的用户(通常是root或使用sudo)才能执行挂载操作。此外挂载是一种临时操作,系统重启后需要重新挂载设备,除非将其添加到/etc/fstab
文件中以实现自动挂载。
<math xmlns="http://www.w3.org/1998/Math/MathML"> 挂载前需要注意如下几点: \color{#04f}{挂载前需要注意如下几点:} </math>挂载前需要注意如下几点:
- 一个文件系统不应该被重复挂载在不同的挂载点(目录)中。
- 单一目录不应该重复挂载多个文件系统。
- 要作为挂载点的目录,理论上应该都是空目录才是。
尤其后两点!如果挂载的挂载点内目录不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时地消失。举个例子,假设你的/home原本与根目录(/)在同一个文件系统中,底下原本就有/home/test与/home/vbird两个目录。然后你想要加入新的磁盘,并且直接挂载到了/home底下,那么当你挂载上新的分区槽时,则/home目录显示的是新分区槽内的资料,至于原先的test与vbird这两个目录就会暂时的被隐藏掉了,注意是隐藏而不是覆盖! 等到新分区槽被卸除之后,则/home原本的内容就会再次地跑出来。
<math xmlns="http://www.w3.org/1998/Math/MathML"> 常用磁盘挂载的步骤: \color{#04f}{常用磁盘挂载的步骤:} </math>常用磁盘挂载的步骤:
- 确认磁盘或分区:使用工具如
lsblk
或fdisk -l
来确定要挂载的磁盘或分区的设备名称;例如 /dev/sda、 /dev/sdb1等。 - 创建挂载点:选择一个空目录作为挂载点。可使用
mkdir
命令创建目录,如mkdir /mnt/mydisk。 - 执行挂载:使用
mount
命令将磁盘或分区挂载到目标目录上(待挂载的设备上需要存在文件系统才可被挂载)。 - 访问磁盘内容:现在就可以通过挂载点路径(此处为/mnt/mydisk)来访问磁盘上的文件和文件夹。
- 自动挂载:若希望在每次系统启动时自动挂载磁盘,您可以将相应的挂载信息添加到/etc/fstab文件中。
- 执行卸载:可以使用umount命令来卸载挂载的磁盘或分区。
(二):挂载设备
bash
用法规范:
mount [-lhV]
mount -a [选项]
mount [选项] [--source] <源> | [--target] <挂载点>
mount [选项] <设备> <挂载点>
mount <操作> <挂载点> [<目标>]
常用选项:
-l:列出当前系统中已挂载的文件系统,而不显示未挂载的文件系统。
-h:查看帮助文档
-V:查看版本号
-a:自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有"自动挂载"功能)
-t:指定要挂载的设备上的文件系统类型;
-r:以只读方式挂载文件系统(同-o ro)
-w:以读写方式挂载文件系统(默认,同-o rw)
-v:打印当前进行的操作(如挂载中执行:mount:/dev/vdb1 已挂臷到 /mnt/game)
-n:不更新/etc/mtab
-o:--options <列表>:挂载选项列表,以英文逗号分隔
挂载的source设备:
<设备>:按路径指定设备,例如/dev/sda5
<文件>:设备文件,
-L 'LABEL':以卷标指定挂载设备;例如 -L 'MYDATA'
-U 'UUID':以UUID指定要挂载的设备;例如 -U '0c50523c-xxx-a126711d406e'
补充:-o选项后可写的列表
sync:同步模式;
async:异步模式(默认);
atime/noatime:更新访问时间/不更新访问时间。
访问分区文件时,是否更新文件的访问时间,默认为更新(若不更新则文件访问和速率更快)
auto/noauto:自动挂载/手动挂载;是否支持自动挂载(默认自动挂载)
mount- a命令执行时,是否会自动安装/etc/fstab文件内容挂载
exec/noexec:执行/不执行;设定是否允许在文件系统中执行可执行文件(默认是exec允许)
remount:重新挂载已经挂载的文件系统,一般用于指定修改特殊权限
rw/ro:读写/只读,文件系统挂载时,是否具有读写权限(默认rw)
suid/nosuid:具有/不具有;设定文件系统是否具有SUID和SGID的特殊权限(默认是具有)
user/nouser:是否允许普通用户挂载此设备
diratime/nodiratime:目录的访问时间戳
dev/nodev:是否支持在此文件系统上使用设备文件
usrquota:写入代表文件系统支持用户磁盘配额,默认不支持
grpquota:写入代表文件系统支持组磁盘配额,默认不支持
acl:启用此文件系统上的acl功能
defaults:默认,默认-o后面会有这么多选项:rw, suid, dev, exec, auto, nouser, and async
device:指明要挂载的设备;
(1) 设备文件:例如/dev/sda5
(2) 卷标:-L 'LABEL', 例如 -L 'MYDATA'
(3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
dir:挂载点
事先存在;建议使用空目录;进程正在使用中的设备无法被卸载;
<math xmlns="http://www.w3.org/1998/Math/MathML"> 基本示例 : \color{#f69}{基本示例:} </math>基本示例:
点开示例1:挂载设备/dev/vdb1到挂载点/mnt/game下
bash
准备:
通过前面2章创建一个分区并对分区创建文件系统,这里创建了/dev/vdb1的文件系统
创建挂载点,这里通过mkdir /mnt/game 创建了一个空目录挂载点
示例方法:
把/dev/vdb1挂载到/mnt/game;并且设置这个设备为只读操作;挂载时打印当前进行的操作;
并设置挂载是设备文件系统类型;并设置-o选项为不更新访问时间和同步模式;
挂载命令:
>> mount -vrt ext2 -o sync,noatime /dev/vdb1 /mnt/game
打印:mount:/dev/vdb1 已挂臷到 /mnt/game。
查看挂载:
>> df -h
文件系统 大小 已用 可用 已用% 挂载点
tmpfs 341M 1.1M 339M 1% /run
/dev/vda2 59G 4.4G 53G 8% /
....
/dev/vdb1 1007M 28K 956M 1% /mnt/game
校验是否只读挂载:
>> touch /mnt/game/abc.txt
touch: 无法 touch '/mnt/game/abc.txt': 只读文件系统
'补充:最常用的方式'
>> mount -v /dev/vdb1 /mnt/game
这样就完成了一个平常最基本的挂载(没有啥乱七八糟的参数,最多一个-v日志)
点开示例1:使用LABEL或UUID当挂载的设备挂载到/mnt/videos下
bash
准备:
通过前面2章创建一个分区并对分区创建文件系统,这里创建了/dev/vdb2的文件系统
创建挂载点,这里通过mkdir /mnt/videos 创建了一个空目录挂载点
挂载命令:
查看/dev/vdb2的LABEL值(创建文件系统时可创建LABEL):
>> blkid /dev/vdb*
打印:/dev/vdb2: LABEL="shebeiB" UUID="eaaxxx28e2" ...
>> mount -v -L shebeiB /mnt/videos
打印:mount:/dev/vdb2 已挂臷到 /mnt/videos
使用UUID当挂载的设备:
>> mount -v -U eaab835f-073a-4b98-ba44-68c8e49228e2 /mnt/videos
打印:mount:/dev/vdb2 已挂臷到 /mnt/videos
挂载后的设备可以通过df -h
或 mount -l
来查看是否被挂载
(三):卸载设备
直接将已挂载的文件系统给它卸载掉!卸除之后可以使用df或mount命令看看是否还存在目录树中。
bash
语法:
umount [-hV]
umount -a [选项]
umount [选项] <源> | <目录>
参数说明:
-a:自动卸载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有"自动挂载"功能)
-f:强制卸除!可用在类似网络文件系统(NFS)无法读取到的情况下
-n:不写更新/etc/mtab情况下卸载
-l:立即断开文件系统,清理以后执行
-R:递归卸载目录及其子对象
-r:若卸载失败,尝试以只读方式重新挂臷
-t:制文件系统集合
-v:打印当前进行的操作
-h:查看帮助文档
-V:查看版本号
注意:
1:先找一下已经挂载的文件系统;umount(卸除)后面接设备或挂载点都可以;
2:卸载时不要再待卸载的目录内,否则无法卸载;若其它人在线则可以通过如下方式解决:
'报错解决:umount: /mnt/game: target is busy.'
查看被占用的目录,并强制解锁这个目录(就是让那个占用的人下线)
假设我有个/mnt/game被占用无法卸载
>> fuser -cu /mnt/game
/mnt/game: 919540c(tom) # 发现tom用户正在使用
>> fuser -k /mnt/game # 强行解锁这个目录
使用示例:
# 使用设备文件名强制卸载
>> umount -f /dev/vdb1
# 使用挂载点来卸载
>> umount /mnt/game
(四):自动挂载设备
手动处理mount不是很人性化,我们总是需要让系统自动在开机时进行挂载的!这样免得我们每次开机都要挂载一遍;所以这一小节将介绍 /etc/fstab这个文件;我们只需要修改一下/etc/fstab即可,不过在开始前说一些系统挂载的限制:
- 根目录(/)是必须挂载的,而且一定要先于其它mount point(挂载点)被挂载进来。
- 其它mount point(挂载点)必须为任意已建立的目录,但一定要遵守必须的系统目录架构原则(FHS)
- 所有mount point(挂载点)在同一时间之内,只能挂载一次。
- 所有partition(分区)在同一时间之内,只能挂载一次。.
- 如若进行卸除,您必须先将工作目录移到mount point(及其子目录)之外。
查看挂载配置文件cat /etc/fstab
的内容
bash
具体选项:
<file system> <mount point> <type> <options> <dump> <pass>
'[设备、标签、UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]'
命令查询(看下面挂载了(/)目录是ext4的):
root@VM-12-4-ubuntu:/mnt# cat /etc/fstab
...
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/vda2 during curtin installation
/dev/disk/by-uuid/7bccaefa-b039-4ff6-bd32-22dde0066c0b / ext4 defaults 0 1
其实/etc/fstab(filesystem table)就是将我们利用mount指令进行挂载时的所有选项与参数写入到了这个文件了。除此之外/etc/fstab还加入了dump选项来备份用指令的支持!还有一个fsck选项用来做开机时是否进行文件系统检验功能;这个文件的内容共有六个字段,详细介绍如下:
bash
'第一栏:磁盘装置文件名、UUID、LABEL name(<file system>)'
这个字段可以填写的数据主要有三种:
1:文件系统或磁盘的设备文件名;如/dev/vda2等
2:文件系统的UUID名称;如UID=xxx
3:文件系统的LABEL名称;如LABEL=xxx
因为每个文件系统都可能有上面的三种参数值,使用哪个都行,
通过修改这个配置文件挂载的话推荐使用UUID,具体的UUID通过blkid查询
'第二栏:挂载点(mount point)'
就是一个在根目录里的任意空文件夹,后面需要为这个空文件夹挂载设备。
'第三栏:磁盘分区槽内的文件系统(type)'
在手动挂载时可以让系统自动测试挂载,所以不必写mount -t xxx;
但在这个文件中我们必须要手动写入文件系统才行!如下:
1:普通设备挂载:ext2~4/xfs等文件系统类型
2:交换分区swap:swap
3:网络挂载地址linux之间:nfs,windos挂载:cifs
4:光盘 iso9660,文件 cifs
'第四栏:文件系统参数(options)'
其实options在上面的mount说过一次,当时使用的是mount -o xx,xx来指定,这里我再总结一下:
1:async/sync(异步/同步)
设定磁盘是否以异步方式运作,默认为async(推荐)
2:auto/noauto(自动挂载/非自动挂载)
当执行mount -a时,此文件系统是否会被主动测试挂载。默认为auto。
3:rw/ro(可读写/可读)
让该分区槽以可读写或者是只读的方式挂载上来,如果要分享的数据是不给用户随意变更的,
这里也能够设定为只读(ro)。这时任何用户都无法修改挂载的设备数据;(默认rw)
4:exec/noexec(可执行/不可执行)
限制此挂载的文件系统内是否可以执行可执行文件工作,如果是纯粹用来储存数据的目录,
那么可以设定为noexec会比较安全。
5:user/nouser(允许/不允许使用者挂载)
代表是否允许用户使用mount指令来挂载,一般我们当然不希望一般身份的user能使用mount,
因为太不安全了,因此这里应该要设定为nouser。
6:suid/nosuid(具有/不具有suid权限)
该文件系统是否允许SUID的存在,若不是执行文件放置的目录,也可以设定为nosuid来取消这个功能。
7:defaults
若是defaults的话就会同时具有rw, suid, dev, exec, auto, nouser, async等参数。
'第五栏:能否被dump指令备份(dump)'
dump是一个用来做为备份的指令,不过现在有太多的备份方案了,一般不要理会,直接输入0就行;默认为0
'第六栏:是否以fsck检验扇区(pass)'
早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整(clean)。不过这个方式使
用的主要是透过fsck去做的,我们现在用的xfs文件系统就没有办法适用,因为xfs会自己进行检验,不需要
额外进行这个动作,所以直接填0就好了。
<math xmlns="http://www.w3.org/1998/Math/MathML"> 基本示例 : \color{#f69}{基本示例:} </math>基本示例:
bash
准备工作:
现在有/dev/vdb1、/dev/vdb2、/dev/vdb3这三个设备到/etc/fstab文件进行配置;
配置说明:
/dev/vdb1使用设备路径挂载,挂载到/mnt/game下,并设置自动挂载,并且只可读操作;
/dev/vdb2使用LABEL方式挂载,挂载到/mnt/videos下,并设置自动挂载,并且可读写操作;
/dev/vdb3使用UID方式挂载,挂载到/mnt/music下,并设置不自动挂载,并且可读写操作;
开始干活:
# 查询是否被挂载(发现并没有)
>> df -h
文件系统 大小 已用 可用 已用% 挂载点
/dev/vda2 59G 4.5G 52G 8% /
...
tmpfs 340M 4.0K 340M 1% /run/user/0
# 查看具体的分区槽信息(就是磁盘分区并安装了文件系统)
>> blkid /dev/vdb*
# 修改配置文件(/etc/fstab)
>> vim /etc/fstab
/dev/vdb1 /mnt/game ext2 auto,ro 0 0
LABEL=shebeiB /mnt/videos ext3 auto,rw 0 0
UUID=a14f72f0-d450-473a-aaa2-4f2b811b0500 /mnt/music ext4 noauto,rw 0 0
'# 重要说明:'
在配置完如上配置后,务必确认当前这几个设备已经被卸载;
还有就是上面的配置一定要核对,若存在错误可能系统无法正常启动。
# 自动挂载(会把我们配置文件为auto的自动挂载上)
>> mount -a
>> df -h
文件系统 大小 已用 可用 已用% 挂载点
tmpfs 341M 1.1M 339M 1% /run
/dev/vda2 59G 4.5G 52G 8% /
...
tmpfs 340M 4.0K 340M 1% /run/user/0
/dev/vdb1 1007M 32K 956M 1% /mnt/game
/dev/vdb2 2.0G 92K 1.9G 1% /mnt/videos
# 其中有个vdb3不是auto,所以未被挂载
# 卸载设备并重启查看是否被挂载(后面的测试就是开机了除了vdb3,其它自动挂载)
>> umount /dev/vdb1
>> umount /dev/vdb2
(五):其它特殊设备挂载
上面我们说了常见ext类型的文件系统的挂载,但是遇到一些特殊的设备则如何进行挂载?
1:ISO镜像挂载
bash
准备工作:
准备一个.iso的文件和一个挂载点目录/mnt/guazai1,然后开干:
开始挂载ISO:
>> mount -vo loop /mnt/geodetic_coordinates.iso /mnt/guazai1
打印:mount:/dev/loop12 已挂臷到 /mnt/guazai1。
>> df -h
文件系统 大小 已用 可用 已用% 挂载点
tmpfs 388M 1.9M 386M 1% /run
/dev/sda2 20G 11G 8.5G 55% /
...
/dev/loop12 135M 135M 0 100% /mnt/guazai1
# 进入挂载点目录
>> ls -l /mnt/guazai1
总计 136741
-r-xr-xr-x 1 root root 1743984 8月 10 12:00 FangQian_4326.smwu
-r-xr-xr-x 1 root root 1744016 8月 10 12:00 FQ_2000.smwu
...
卸载ISO并查看:
>> umount -f /dev/loop12
>> df -h
文件系统 大小 已用 可用 已用% 挂载点
tmpfs 388M 1.9M 386M 1% /run
/dev/sda2 20G 11G 8.5G 55% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 8.0K 5.0M 1% /run/lock
tmpfs 388M 64K 387M 1% /run/user/123
tmpfs 388M 48K 387M 1% /run/user/0
2:挂载Windows共享文件
首先我们需要套在Windows上暴露一个共享文件,然后就需要确定Windows和Linux网络是否通畅。
bash
基本介绍:
mount -t cifs是一个Linux命令,用于挂载基于CIFS/SMB协议的共享目录。
CIFS(Common Internet File System)是一种在Windows操作系统中使用的文件共享协议,
SMB(Server Message Block)是它的前身,两者基本一致。
环境准备好以后开始:
Windows的IP是:192.168.0.144
Windows共享的文件夹://192.168.0.144/images
在Windows共享的用户名称=JavaScript;用户密码=54088
我们想把这个共享文件挂载到/mnt/guazai2(创建:mkdir /mnt/guazai2)
挂载共享文件windows分享到linux:
# 使用的文件系统类型为cifs
mount -t cifs -o username=JavaScript,password=54088 //192.168.0.144/images /mnt/guazai2
# 查看挂载信息并卸载Windows共享文件
>> df -h
文件系统 大小 已用 可用 已用% 挂载点
tmpfs 388M 1.9M 386M 1% /run
/dev/sda2 20G 10G 8.6G 54% /
...
//192.168.0.144/images 201G 3.5G 197G 2% /mnt/guazai2
>> umount //192.168.0.144/images
<math xmlns="http://www.w3.org/1998/Math/MathML"> 结尾补充: \color{#f00}{结尾补充:} </math>结尾补充:
到这里,我们已经基本掌握了分区、格式化、挂载的知识了;按照上文列出的参数需要自己大量的练习,这样就可以应对一些基本的磁盘管理的技术;虽然结尾了,但是还远远没有结束,下一章我将详细带大家了解交换分区(swap)、逻辑卷(LVM)、磁盘阵列(RAID) 等知识的分享。