1.存储基本知识
1.1 磁盘接口类型
并行接口 : 指采用并行传输方式来传输数据的接口标准。
特点 : 数据的各位同时进行传送 , 传输速度快 , 但当传输距离较远、位数又多时 , 就导致通信线路复杂且成本提高。
主要类型 :
IDE,133MB/s;SCSI,640MB/s
串行接口 : 指数据一位一位地顺序传送的接口标准。
特点 : 通信线路简单, 只要一对传输线就可以实现双向通信 , 从而大大降低了成本 ,特别适用于远距离通信 ,但传送速度较慢。
主要类型 :
SATA,6Gbps;SAS,6Gbps;USB,480MB
具体硬盘接口知识参考一下链接: 硬盘接口知多少
1.2 硬盘类型
1.2.1 设备类型
机械硬盘
机械硬盘(
HDD) :Hard Disk Drive, 即是传统普通硬盘 , 主要由 : 盘片 、磁头、盘片转轴及控制电机、磁头控制器、数据转换器、接口、缓存等几个部分组成。机械硬盘中所有的盘片都装在一个旋转轴上 , 每张盘片之间是平行的 , 在每个盘片的存储面上有一个磁头 , 磁头与盘片之间的距离比头发丝的直径还小 , 所有的磁头联在一个磁头控制器上 , 由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向运动 , 加上盘片每分钟几千转的高速旋转 , 磁头就可以定位在盘片的指定位置上进行数据的读写操作。数据通过磁头由电磁流来改变极性方式被电磁流写到磁盘上 , 也可以通过相反方式读取。硬盘为精密设备 , 进入硬盘的空气必须过滤固态硬盘
固态硬盘(
SSD) :Solid State Drive, 用固态电子存储芯片阵列而制成的硬盘 , 由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同 , 在产品外形和尺寸上也与普通硬盘一致对比
相较于
HDD,SSD在防震抗摔、传输速率、功耗、重量、噪音上有明显优势 ,SSD传输速率性能是HDD的2倍相较于
SSD,HDD在价格、容量、使用寿命上占有绝对优势硬盘有价 , 数据无价 , 目前
SSD不能完全取代HHD
1.2.2 设备文件
Linux操作系统中 , 各种设备驱动(device driver)通过设备控制器(device controller) 来管理各种设备(device) , 其关系如下图所示

这些设备之中,
受同一个
devicedriver管理的设备都有相同的majornumber, 这个数字可以看作设备的类别号码 , 被内核用于识别一类设备受同一个
devicedriver管理的同一类设备中的每一个设备都有不同的minornumber, 这个数字可以看作设备编号 , 被设备驱动用来识别每个设备
设备驱动主要有三大类 :
面向包的网络设备驱动(
package oriented network device driver)面向块的存储设备驱动(
block oriented storage device driver) , 提供缓冲式(buffered)的设备访问。面向字节的字符设备驱动(
byte oriented char device driver) , 有时也称为裸设备(raw devices) , 提供非缓冲的直接的设备访问(unbuffered direct access) , 比如串口设备 ,摄像头 , 声音设备等。实际上 ,除了网络设备和存储设备以外的其它设备都是某种字符设备。
除此以外 , 还有一类设备 , 称为伪设备(pseudo device) , 它们是软件设备。Linux 上的 device 不一定要有硬件设备 , 比如/dev/null, /dev/zero 等。
关于字符设备和块设备的更多区别:
块设备只能以块为单位接受输入和返回输出 , 而字符设备则以字节为单位。大多数设备是字符设备 ,因为它们不需要缓冲而且不以固定块大小进行操作。
块设备对于
I/O请求有对应的缓冲区 , 因此它们可以选择以什么顺序进行响应 ,字符设备无须缓冲且被直接读写。对于存储设备而言调 读写的顺序作用巨大, 因为在读写连续的扇区比分离的扇区更快。字符设备只能被顺序读写 ,而块设备可以随机访问。虽然块设备可随机访问 ,但是对于磁盘这类机械设备而言 , 顺序地组织块设备的访问可以提高性能。
在linux中默认的存储设备的文件置于目录/dev/ 下面 , 且目前所有的存储设备的名称均为sd*。
磁盘常见的前缀标识:
fd: 软驱hd:IDE磁盘sd: SCSI 磁盘tty:terminalsvd:virtio磁盘
不同磁盘标识 :
a-z,aa,ab… 例如 :/dev/sda,/dev/sdb, ...同一设备上的不同分区:
1,2, ... 例如 :/dev/sda1,/dev/sda5
1.2.3 硬盘存储术语

head: 磁头track: 磁道cylinder:柱面sector:扇区CHS(Cylinder-Head-Sector) :磁盘的分区方式 , 采用24bit位寻址 , 其中前10位表示cylinder,中间8位表示head,后6位表示sector,最大寻址空间8GB。LBA(Logical block addressing) :LBA是一个整数 , 通过转换成CHS格式完成磁盘具体寻址 , 同时LBA采用48个bit位寻址 , 最大寻址空间128PB。由于CHS寻址方式的寻址空间在大概8GB以内 , 所以在磁盘容量小于大概8GB时 , 可以使用CHS寻址方式或是LBA寻址方式 ; 在磁盘容量大于大概8GB时 , 则只能使用LBA寻址方式
一个扇区有512字节
每个磁道共有6个位标识扇区 , 因此每个磁道有2^6(64)个扇区,除去起始位用到一个扇区之外 , 其他还有63个扇区
每个磁盘中用10个位来存磁盘 , 从
0-->1023共有1024个磁道对于磁头(
head) 有8个位 , 一共支持(2^8)256个磁头一个磁盘最多支持的容量:
512\*63\*1024\*256/1024/1024 =8G
2 磁盘分区
2.1 MBR 和 GPT
2.1.1 MBR(Master Boot Record)主引导扇区
主引导记录(Master Boot Record , 缩写 : MBR) , 又叫做主引导扇区 , 是计算机开机后访问硬盘时所必须要读取的首个扇区 , 它在硬盘上的三维地址为(柱面 , 磁头 , 扇区 ) = (0 , 0 , 1)。在深入讨论主引导扇区内部结构的时候 ,有时也将其开头的446字节内容特指为“主引导记录”(MBR) , 其后是4个16字节的"磁盘分区表"(DPT) , 以及2字节的结束标志(55AA)。因此 , 在使用"主引导记录"(MBR)这个术语的时候 , 需要根据具体情况判断其到底是指整个主引导扇区 , 还是主引导扇区的前446字节。
硬盘主引导记录MBR由4个部分组成:
主引导程序(偏移地址
0000H--0088H) , 它负责从活动分 区中装载 , 并运行系统引导程序。出错信息数据区 , 偏移地址
0089H--00E1H为出错信息 ,00E2H--01BDH全为0字节。分区表(
DPT,Disk Partition Table)含4个分区项 , 偏移地址01BEH--01FDH, 每个分区表项长16个字节 , 共64字节为 分区项1、分区项2、分区项3、分区项4结束标志字 , 偏移地址
01FE--01FF的2个字节值为结束标志55AA
启动代码 : 引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如
GNU GRUB)。它不依赖任何操作系统 , 而且启动代码也是可以改变的 , 从而能够实现多系统引导。硬盘分区表(
DPT) : 如上图所示 ,64位分区表中 , 共4个分区 , 每个分区占16位第
1个字节 : 引导标志(80表示活动分区 ,00表示非活动分区)2-4个字节 :2: 磁头号3字节前6位 : 扇区号3字节后2位 ,4字节 : 柱面号
5: 分区类型(0表示分区未使用)6-8个字节6: 磁头号(分区结束CHS)7字节前6位 : 扇区号7字节后2位 ,8字节 : 柱面号(CHS)
9-12字节 : 分区起始LBA地址13-16字节 : 分区结束LBA地址
结束标志字 : 结束标志字55 , AA(偏移1FEH-偏移1FFH)最后两个字节 , 是检验主引导记录是否有效的标志。

上面图片显示的是磁盘中实际的样子
CHS的分区模式只有24个字节 , 计算出来之后只有只有8G, 如果分区超过8G之后 , 会直接使用LBA的分区方式。由于LBA分区只有4*8位 , 所以 MBR支持的磁盘分区最多只有2T。
2.1.2 ZBR (Zoned Bit Recording)

由于传统的磁盘在使用时处于磁盘外面的磁道扇区空间相对于离圆形内部的扇区大 , 但是承载的字节数是一样的 , 这样分配的不合理 , 导致数据分布不均。因此为了提高硬盘容量以及以及提高读写速度, 所以所以采用了ZBR技术 , 如上图所示 , 所有扇区的数据密度都是相同的。
在较旧的磁盘驱动器中 , 外轨道和内轨道具有相同的扇区数 , 因此外磁道数据密度低。这是低效率的对可用空间的利用。在使用ZBR的硬盘 , 在最外面的环带中的轨道上的数据将具有最高数据传输率。
2.1.3 GPT
全局唯一标识分区表(GUID Partition Table ,缩写 : GPT) 是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分 , 被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。设计GPT的原因是为了解决传统的MBR分区只能分2T左右的硬盘空间。 支持128个分区 , 使用64位 , 支持8Z(512Byte/block)64Z (4096Byte/block)。使用128位UUID(Universally Unique Identifier) 表示磁盘和分区GPT分区表自动备份在头和尾两份, 并有CRC校验位 。

保护MBR : 保护
MBR位于GPT磁盘的第一扇区 , 也就是0号扇区 , 有磁盘签名 ,MBR磁盘分区表和结束标志组成 , 没有引导代码。而且分区表内只有一个分区表项 , 这个表项GPT根本不用 , 只是为了让系统认为这个磁盘是合法的。GPT头
GPT头位于GPT磁盘的第二个磁盘 , 也就是1号扇区 , 该扇区是在创建GPT磁盘时生成 ,GPT头会定义分区表的起始位置 , 分区表的结束位置、每个分区表项的大小、分区表项的个数及分区表的校验和等信息。分区表
分区表位于
GPT磁盘的2-33号磁盘 , 一共占用32个扇区 , 能够容纳128个分区表项。每个分区表项大小为128字节。因为每个分区表项管理一共分区, 所以Windows系统允许GPT磁盘创建128个分区。每个分区表项中记录着分区的起始 、 结束地址 、 分区类型的GUID、分区的名字 、分区属性和分区GUID。分区区域
GPT分区区域就是用户使用的分区 , 也是用户进行数据存储的区域。分区区域的起始地址和结束地址由GPT头定义。GPT头备份
GPT头有一个备份 , 放在GPT磁盘的最后一个扇区 , 但这个GPT头备份并非完全GPT头备份 , 某些参数有些不一样。复制的时候根据实际情况更改一下即可。分区表备份
分区区域结束后就是分区表备份 , 其地址在
GPT头备份扇区中有描述。分区表备份是对分区表32个扇区的完整备份。如果分区表被破坏 , 系统会自动读取分区表备份 , 也能够保证正常识别分区。
2.1.4 BIOS+MBR && UEFI+GPT
uefi和legacy是两种不同的引导方式。
uefi是新式的BIOS , legacy是传统BIOS。你在UEFI模式下安装的系统 , 只能用UEFI模式引导;同理 , 如果你是在Legacy模式下安装的系统 , 也只能在legacy模式下进系统。uefi只支持64为系统且磁盘分区必须为gpt模式 , 传统BIOS使用Int 13中断读取磁盘 , 每次只能读64KB , 非常低效 , 而UEFI每次可以读1MB , 载入更快。此外 , Win8 , 更是进一步优化了UEFI支持 , 号称可以实现瞬时开机。
BIOS是英文"Basic Input Output System"的缩略词 , 直译过来后中文名称就是"基本输入输出系统"。其实 , 它是一组固化到计算机内主板上一个ROM芯片上的程序 , 它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序 , 它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。简单来说就是电脑开机后最先启动的一种程序 , 为操作系统的启动做准备 , 比如初始化cpu、内侧、主板等各个部分 , 然后将操作系统加载到内存启动操作系统 , 这个过程就是我们电脑从按开机键开始到最后看见桌面的整个过程。
UEFI全称“统一的可扩展固件接口”(Unified Extensible Firmware Interface) , 是一种详细描述类型接口的标准。这种接口用于操作系统自动从预启动的操作环境 , 加载到一种操作系统上。通俗的说 , UEFI是一种新的主板引导初始化的标注设置 , 具有启动速度快、安全性高和支持大容量硬盘而闻名。出现这种技术的主要作用基本上就是为了实现开机快的效果。
Legacy BIOS顾名思义就是指传统的BIOS , 其中UEFI BIOS包括UEFI引导启动和Legacy引导启动。如下图所示

由此可见 ,UEFI方式减少了BIOS的自检过程 , 因此能够缩短开机时间 , 给用户带来良好的开机体验。在目前的系统运行方式中 , 出了win8是基于UEFI方式启动外 , 其余均为Legacy方式启动。
2.2 分区管理
cenos7,图形化界面命令为gnome-disks。Centos6中图形化命令为palimpsest
2.2.1 parted
共有两种使用方式 , 一种是交互式的 , 另外一种是非交互式的方式。
语法 :
parted [options] [device [command [options...]...]]OPTIONS-h,--help: 显示此求助信息-l,--list: 列出所有设别的分区信息-s,--script: 从不提示用户-v,--version: 显示版本-m,--machine: 显示机器可分析输出
[command [options]]print:打印分区表 , 或者分区

mklabel label-type:创建新的磁盘标签 (分区表),label-type可以是:bsd,dvh,gpt,loop,mac,msdos,pc98, orsun一般的pc机都是msdos格式 , 如果分区大于2T则需要选用gpt格式的分区表。 (默认为msdos)
mkpart PART-TYPE [FS-TYPE] START END:创建新的分区。part_type:
primary,extended,logical
所有的命令可以在交互模式中直接使用 , 使用方式和非交互模式一样 , 直接输入
mkpart primary 1 500select device: 切换为对应设备
rm NUMBER:删除对应分区 ,NUMBER表示print命令中看到的数字
rescue START END: 恢复rm删掉的分区
resizepart partition end:扩展分区 , 在centos6版本这个命令时resize

这样可以扩展一个分区的空间
name partition name: 为分区取名字需要注意的是
msdos模式分区时 , 不允许这个命令。unit UNIT: 在前面分区时 , 默认分区时数值的单位是M, 这个参数改变默认单位 ,kB,MB,GB,TB
check NUMBER:检查编号中所指定的文件系统是否有什么错误。(只存在于centos6)中。
其他命令在
centos7中基本已经被弃用 , 如果需要使用可以参考一下链接: http://blog.sina.com.cn/s/blog_43b39e250100nmqt.html
2.2.2 fdisk && gdisk
fdisk与gdisk 的用法基本一致 , 均是交互式的输入方式
参数
-l: 列出指定的所有分区表信息-u: 搭配-l参数列表 , 会用分区数目取代柱面数目 , 来表示每个分区的起始地址 ;-v: 显示版本信息
菜单操作说明
m: 显示菜单和帮助信息a: 活动分区标记/引导分区d: 删除分区l: 显示分区类型n: 新建分区p: 显示分区信息q: 退出不保存t: 设置分区号v: 进行分区检查w: 保存修改x: 扩展应用 , 高级功能
#使用实例:
[root@MiWiFi-R3L-srv ~]# 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): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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: 0x0000d3dc
Device Boot Start End Blocks Id System
/dev/sdb1 2048 1171875 584914 83 Linux
/dev/sdb2 1174000 11659263 5242632 83 Linux
Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
Partition number (3,4, default 3): 3
First sector (1171876-20971519, default 1173504): 11659264
Last sector, +sectors or +size{K,M,G} (11659264-20971519, default 20971519): +1G
Partition 3 of type Linux and of size 1 GiB is set
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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: 0x0000d3dc
Device Boot Start End Blocks Id System
/dev/sdb1 2048 1171875 584914 83 Linux
/dev/sdb2 1174000 11659263 5242632 83 Linux
/dev/sdb3 11659264 13756415 1048576 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@MiWiFi-R3L-srv ~]#
需要注意的是分区的时候 , 需要注意start 与end的区间 , 在创建新的区间时可能会有空间间隙 , 创建不了大的空间。另外在创建硬盘空间时 , 可能不会同步到内存中 , 需要使用以下命令。
partx,kpartx,partprobe
2.2.3 分区加载命令
2.2.3.1 partx
partx 是 Linux 下的分区工具 , 用于告诉内核重新读取磁盘分区表(在不重启系统的情况下) , 或显示分区信息。它主要操作内核分区表,而不是修改磁盘上的分区数据。
partx用法-a: 增加制定的分区或读磁盘新增的分区-d: 删除制定或所有的分区-l: 列出分区-t/--type: 指定分区类型。dos,bsd,solaris,unix, 或者gpt-n/--nr M-N:指定分区范围
使用方式:
删除分区用 :
partx -d --nr M-N /dev/DEVICE添加分区 :
partx -a /dev/DEVICE
适用于
centos6,7
2.2.3.2 kpartx
kpartx 是 Linux 下用于创建和删除设备映射(device mapper )分区表的工具。与直接操作内核分区表的 partx 不同 , kpartx 通过 Device Mapper 机制 , 为磁盘分区、镜像文件或 LVM 创建虚拟块设备节点(位于 /dev/mapper/ 下)。
kpart用法-a: 为设备创建分区映射-r: 只读模式-d: 删除分区映射-u: 更新分区映射-l: 列出分区信息(只读)-p: 指定分区号后缀(默认p, 如sdbp1)-f: 强制创建设备节点-g: 使用GUID分区表(GPT)的UUID作为设备名-v: 显示详细信息-s: 同步模式 , 等待设备节点创建完成再返回
使用示例:
#添加分区映射
# 为整个磁盘创建分区映射
kpartx -a /dev/sdb
# 生成: /dev/mapper/sdb1, /dev/mapper/sdb2...
# 处理镜像文件(需先关联 loop 设备)
losetup -f --show disk.img
kpartx -a /dev/loop0
# 生成: /dev/mapper/loop0p1, /dev/mapper/loop0p2...
# 指定后缀格式(默认 p)
kpartx -a -p _ /dev/loop0
# 生成: /dev/mapper/loop0_1, /dev/mapper/loop0_2...
#删除分区映射(-d)
# 删除指定设备的所有分区映射
kpartx -d /dev/loop0
# 删除单个分区映射
kpartx -d /dev/mapper/loop0p1
#列出分区信息
# 列出设备的分区表(不创建映射)
kpartx -l /dev/sdb
# 详细输出
kpartx -lv /dev/sdb
在linux中 , 如果映像文件(.img)含有分区表的话 , 那么用losetup这个程序来加载文件系统就有点力不从心了。因为losetup只能加载无分区的文件系统映像文件。不过有一个好东西配合losetup却可以来挂载带有分区表的映像文件。这就是kpartx了。
先创建一个1G大小的映像文件来做实验
dd bs=4096 if=/dev/zero of=~/hd.img count=262144将映像文件挂接到
loopX中去(X和Y要看你的挂接的情况而看了)losetup /dev/loopX ~/hd.img对
loopX进行分区fdisk /dev/loopX我这里分了两个区 , 每个去
512M大小Device Boot Start End Blocks Id System /dev/loopXpY 2048 1050623 524288 83 Linux /dev/loopXpY 1050624 2097151 523264 83 Linux使用
kpartd装载映像 , 使用kpartx是需要root用户的 , 因为是用root登录的 , 所以不用使用sudo。从前面的命令就可以看出来...kpartx -av ~/hd.img装载之后 , 就可以在
/dev/mapper/目录下看到两个loopXpY的文件了。接下来对
loopXpY进行格式化了。mkfs.vfat /dev/mapper/loopXpY然后挂载文件系统。
mount /dev/mapper/loop1p1 /media/hd1使用完映像文件的文件系统后 , 想退出的话 , 可以使用
kpartx -dv /dev/loopX写卸载刚才挂接的东西。然后再使用losetup -d /dev/loopX断掉和映像文件的挂接关系。
2.2.3.3 partprobe
partprobe 是 Linux 系统中用于通知内核重新读取磁盘分区表的工具。它属于 parted 软件包 , 主要解决在不重启系统的情况下 , 让内核识别分区表变更的问题。
partprobe [/dev/DEVICE]-d: 不更新内核 ;-s: 显示摘要和分区 ;-h: 显示帮助信息;-v: 显示版本信息。
centos6通知内核重新读取硬盘分区表新增分区用
partx -a /dev/DEVICE kpartx -a /dev/DEVICE -f删除分区用
partx -d --nr M-N /dev/DEVICE
CentOS 5 , 7: 使用partprobe
partprobe [/dev/DEVICE] 2.2.4 普通文件分区
使用普通文件创建文件系统 , 但是这个普通文件无法创建分区 ,理论上一个文件无法挂载在目录上 , linux系统中直接将要挂载的文件与/dev/loop#的设备相关联 , 通过对应loop设备挂载在目录上 , 在centos6中loop设备共有8个 , 如果需要更多的需要自己手动创建对应的块文件 , centos7中 需要时系统会系统创建。
dd if=/dev/zero of=partfiles bs=1M count=102
mkfs.ext4 partfiles
mount -o loop /app/partfiles /mnt loop设备简介
在类 UNIX 系统里 , loop 设备是一种伪设备(pseudo-device) , 或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。在使用之前 , 一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此 , 如果这个文件包含有一个完整的文件系统 , 那么这个文件就可以像一个磁盘设备一样被 mount 起来。
上面说的文件格式 , 我们经常见到的是 cd 或 DVD 的 ISO 光盘镜像文件或者是软盘(硬盘)的 *.img 镜像文件。通过这种 loop mount (回环mount)的方式 , 这些镜像文件就可以被 mount 到当前文件系统的一个目录下。
至此 , 顺便可以再理解一下 loop 之含义 : 对于第一层文件系统 , 它直接安装在我们计算机的物理设备之上;而对于这种被 mount 起来的镜像文件(它也包含有文件系统) , 它是建立在第一层文件系统之上 , 这样看来 , 它就像是在第一层文件系统之上再绕了一圈的文件系统 , 所以称为 loop。
创建loop设备的命令需要使用到mknod命令 。
mknod命令, 这个命令主要用于创建字符设备以及块设备
语法:
mknod [OPTION]... NAME TYPE [MAJOR MINOR]OPTIONS:-m: 文件权限-Z: 文件上下文
[root@MiWiFi-R3L-srv dev]# mknod -m 660 loop8 c 7 8
[root@MiWiFi-R3L-srv dev]# ll | grep loop
brw-rw----. 1 root disk 7, 0 Aug 9 06:20 loop0
brw-rw----. 1 root disk 7, 1 Aug 9 06:20 loop1
brw-rw----. 1 root disk 7, 2 Aug 9 06:20 loop2
brw-rw----. 1 root disk 7, 3 Aug 9 06:20 loop3
brw-rw----. 1 root disk 7, 4 Aug 9 06:20 loop4
brw-rw----. 1 root disk 7, 5 Aug 9 06:20 loop5
brw-rw----. 1 root disk 7, 6 Aug 9 06:20 loop6
brw-rw----. 1 root disk 7, 7 Aug 9 06:20 loop7
crw-rw----. 1 root root 7, 8 Aug 15 21:56 loop8
默认情况下 , 用户使用mount -o loop /filename /mnt 这样的命令时系统会默认直接将文件与对应的loop设备相互关联 , 可以使用losetup手动运行这个关联过程 。
losetup 命令详解
losetup [ -e encryption ] [ -o offset ] loop_device file
losetup [ -d ] loop_device选项:
-a:显示所有循环设备的状态。-d: 卸除设备。-e <加密选项>: 启动加密编码 。-f: 寻找第一个未使用的循环设备。-o <偏移量>: 设置数据偏移量 , 单位是字节。-r: 关联设备只读-j filename: 查看分配给file的所有loop设备
[root@MiWiFi-R3L-srv ~]# losetup /dev/loop3 floppy.img
[root@MiWiFi-R3L-srv ~]# losetup -a
/dev/loop3: [fd00]:22 (/root/floppy.img)
[root@MiWiFi-R3L-srv ~]# losetup -j floppy.img
/dev/loop3: [fd00]:22 (/root/floppy.img)
[root@MiWiFi-R3L-srv ~]# losetup -d /dev/loop3
[root@MiWiFi-R3L-srv ~]# losetup -a
[root@MiWiFi-R3L-srv ~]#
[root@MiWiFi-R3L-srv ~]# losetup -r /dev/loop3 floppy.img
[root@MiWiFi-R3L-srv ~]# mount /dev/loop3 /mnt
mount: block device /dev/loop3 is write-protected, mounting read-only
[root@MiWiFi-R3L-srv ~]# cd /mnt
[root@MiWiFi-R3L-srv mnt]# touch 1
touch: cannot touch `1': Read-only file system
[root@MiWiFi-R3L-srv ~]# losetup /dev/loop3 floppy.img
[root@MiWiFi-R3L-srv ~]# mount -o loop floppy.img /mnt
[root@MiWiFi-R3L-srv ~]# cd /mnt
[root@MiWiFi-R3L-srv mnt]# touch 1
[root@MiWiFi-R3L-srv mnt]# ll
total 13
-rw-r--r--. 1 root root 0 Aug 15 22:20 1
drwx------. 2 root root 12288 Aug 15 22:11 lost+found
可以通过设置/etc/grub.conf文件中下图所示对应位置 , 可以保证loop设备会在开机之后自动设置那么多个。

2.2.5 SWAP分区
Linux内核为了提高读写效率与速度 , 会将文件在内存中进行缓存 , 这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后 , Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后 , 你会发现可用物理内存变少。当系统的物理内存不够用的时候 , 就需要将物理内存中的一部分空间释放出来 , 以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序 , 这些被释放的空间被临时保存到Swap空间中 , 等到那些程序要运行时 , 再从Swap分区中恢复保存的数据到内存中。这样 , 系统总是在物理内存不够时 , 才进行Swap交换。
首先创建
swap时 , 首先分区类型需要设置为82(swap)。 如果直接使用文件做swap分区 , 不用指定分区类型。
swap 相关命令
mkswap:用于在一个文件或者设备上建立交换分区-c:建立交换区前 , 先检查是否有损坏的区块-U: 使用指定的UUID-L: 指定标签
swapon:用于激活Linux系统中交换空间-a:启用所有/etc/fstab中指定的swap分区-s: 查看所有的swap分区 , 相当于/proc/swaps
swapoff: 用于关闭指定的交换空间包括交换文件和交换分区)-a:关闭所有/etc/fstab中指定的swap分区
/dev/sdb2 swap swap defaults,pri=10 0 0,通过修改/etc/fstab中的swap项 , 来确定最后使用swap时的优先级。
[root@localhost proc]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 1060252 KiB
no label, UUID=4f8eda7b-0619-4d65-b3bc-b9d554596920
[root@localhost proc]# swapon /dev/sdb1
[root@localhost proc]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 55M 0 rom
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part
├─VolGroup-lv_root (dm-0) 253:0 0 17.5G 0 lvm /
└─VolGroup-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP]
sdd 8:48 0 30G 0 disk
sdb 8:16 0 10G 0 disk
└─sdb1 8:17 0 1G 0 part [SWAP]
sdc 8:32 0 20G 0 disk
sde 8:64 0 40G 0 disk
[root@localhost proc]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -1
/dev/sdb1 partition 1060252 0 -2
3. linux中涉及存储的文件
3.1 /etc/fstab
/etc/fstab (file system table)是 Linux 系统中定义磁盘分区、存储设备及其挂载点的核心配置文件。系统启动时, systemd 或 init 进程会读取此文件,自动挂载指定的文件系统。
文件中读取挂载是按照一行一行来识别的。这里每一行的格式如下:
<file system> <dir> <type> <options> <dump> <pass><file systems>: 要挂载的分区或存储设备.<dir>:<file systems>的挂载位置。<type>: 要挂载设备或是分区的文件系统类型 , 支持许多种不同的文件系统:ext2,ext3,ext4,reiserfs,xfs,jfs,smbfs,iso9660,vfat,ntfs,swap及auto。 设置成auto类型 ,mount命令会猜测使用的文件系统类型 , 对CDROM和DVD等移动设备是非常有用的。<options>: 挂载时使用的参数 , 注意有些 参数是特定文件系统才有的,这里参数与mount挂载时的参数一致。<dump>:dump工具通过它决定何时作备份.dump会检查其内容 , 并用数字来决定是否对这个文件系统进行备份。 允许的数字是0和1。0表示忽略 ,1则进行备份。大部分的用户是没有安装dump的 , 对他们而言<dump>应设为0。<pass>:fsck读取<pass>的数值来决定需要检查的文件系统的检查顺序。允许的数字是0,1, 和2。 根目录应当获得最高的优先权1, 其它所有需要被检查的设备设置为2.0表示设备不会被 fsck 所检查。
示例:
# 普通文件挂载在目录中
/app/partfile /mnt/part ext4 defaults,loop 0 0
# cdrom 挂载在目录中
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
# 目录绑在另一个目录上
/etc/sysconfig /mnt/sysconfig none bind 0 03.2 /etc/mtab
/etc/mtab 是供 mount/umount 进行读写的 , 是相对动态的。读的话 , 比如你在挂载一个文件系统时缺少一个参数 , 它就会自动去/etc/mtab 或者 /etc/fstab 里去查 , 如果找到的话 , 只要一个参数也够。写的话 , 比如你umount了一个文件系统 , umount 就会删掉/etc/mtab 里面的相关记录。
3.3 /proc/partitions
该文件中主要包括分区设备的主副设备号 , 块数 , 以及对应/dev目录下面的设备名 , 与/dev/devices 中的设备名 , 与主设备号相互对应
[root@localhost proc]# cat /proc/partitions
major minor #blocks name
8 0 20971520 sda
8 1 512000 sda1
8 2 20458496 sda2
8 48 31457280 sdd
8 16 10485760 sdb
8 17 487424 sdb1
8 32 20971520 sdc
8 64 41943040 sde
253 0 18358272 dm-0
253 1 2097152 dm-1
major number:对应设备的类型minor number:对应此设备类型的唯一标识
3.4 /proc/mounts
由于linux 内核中引入了namespace的概念 , 所以当名称空间里面挂载了不一样的设备 , 这样会使得空间里面和外面的信息发现混乱 , 所以出现了这个文件 , 这个文件本身是/proc/self/mounts 的链接文件。防止查找的时候出错
/proc/self/mountinfo,/proc/self/mountstat这两个文件同样也是和该文件一样
在内存中查看分区信息方式:
1. cat /proc/mounts
2. lsblk
3. cat /proc/partitions
4. ls /dev/sda*
在硬盘中查看分区信息
1. fdisk -l 4. 外置设备-CDROM
cdrom 在 Linux 系统中既指物理光驱设备 , 也指内核的光盘驱动子系统。/dev/cdrom 是光驱设备软链接 , 实际指向 /dev/sr0(SATA/SCSI 光驱) , 老式 IDE 光驱为 /dev/hdc。现在虚拟机、物理机光驱普遍是 sr0。
一般在使用图形化界面的时候 , 都会直接将外置设备自动挂载在/run/media/\<user\>/<label>目录下面。
光盘文件系统一般是 iso9660 , 必须挂载才能读取内容 , 光盘不能直接写。
涉及到相关的模块如下:
cdrom.ko: 提供统一IOCTL接口(如CDROMEJECT弹出、CDROMREADTOCHDR读取目录)sr_mod.ko:注册块设备 , 处理I/O请求队列isofs.ko:ISO9660文件系统(只读)udf.ko:UDF文件系统(DVD/蓝光标准 , 支持写入)
4.1 ISO 相关命令
4.1.1 genisoimage
genisoimage 是 Debian/Ubuntu 系统中 mkisofs 的开源替代实现(来自 cdrkit 项目) , 用于创建 ISO 9660 光盘镜像。它与 mkisofs 语法完全兼容 , 但许可证为 GPL , 且默认包含在大多数现代发行版中。
genisoimage主要用于把目录 / 文件生成 ISO9660 光盘镜像(.iso) , mkisofs 是它的软链接 , 参数完全一致。生成的 iso 文件可以 : mount -o loop挂载、wodim刻录到 CD/DVD。
使用以下命令安装:
# Debian/Ubuntu
apt install genisoimage
# RHEL/CentOS/Fedora
dnf install genisoimage语法 :
genisoimage [选项] -o 输出.iso 源目录/文件通用参数选项
文件系统扩展
ISO9660原生限制 : 文件名短、不支持Linux权限、Windows长文件名。生产常用组合 :
‑r ‑J, 同时兼容Linux、Windows启动盘制作
示例:
把/data/files目录打包成 iso , 兼容 Linux+Windows
genisoimage -r -J -V "MYDATA" -o mydata.iso /data/files排除某些文件, 排除所有.log文件 , 排除./tmp目录。
genisoimage -r -J -m "*.log" -x ./tmp -o data.iso /home/test制作 BIOS 可启动 ISO(传统BIOS)
genisoimage \
-r -J -V "MyInstall" \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-o myboot.iso ./iso_root可启动 Linux 安装盘(BIOS +UEFI 双模式)
genisoimage -o install.iso \
-V "LINUX_INSTALL" \
-iso-level 3 \
-r -J \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-eltorito-alt-boot \
-e EFI/boot/efi.img \
-no-emul-boot \
./staging/
大文件支持
# 必须启用 UDF , 否则单文件超过 4GB 会报错
genisoimage -o large.iso -udf -iso-level 3 ./bigfiles/4.1.2 wodim
wodim 是 Linux 传统命令行 CD/DVD 刻录工具 , 属于 cdrkit ; cdrecord 通常是它的软链接 , 参数完全一样。
前提 : 硬件必须是刻录机 ; 普通只读光驱不能写盘 ; 需要
root/sudo; 设备一般为 /dev/sr0(/dev/cdrom软链接指向sr0)。
语法 :
wodim [全局选项] dev=/dev/sr0 [轨道选项] 源文件...设备查询类参数(不执行刻录, 只查询硬件)
通用刻录控制参数
轨道写入模式参数
可擦写光盘(
CD‑RW/DVD‑RW)操作参数只对
RW可复写介质生效; 普通R一次性光盘不能擦除。
示例:
刻录ISO镜像
#完整推荐写法 : 详细输出、低速、校验、完成自动弹出
sudo wodim dev=/dev/sr0 -v speed=4 -eject -verify -data ubuntu.iso
#模拟刻录测试(不消耗光盘)
sudo wodim dev=/dev/sr0 -v speed=4 -dummy -data ubuntu.iso
# 基础刻录(自动检测最佳速度)
wodim -v dev=/dev/sr0 speed=8 image.iso
# DAO 模式刻录(确保整盘完整性)
wodim -v -dao dev=/dev/sr0 speed=8 image.iso
# 启用防欠载保护
wodim -v dev=/dev/sr0 speed=8 driveropts=burnfree image.iso
刻录音频CD
# 将多个 WAV 文件刻录为音乐 CD(DAO 模式确保音轨间无间隙)
wodim -v -dao -audio dev=/dev/sr0 speed=4 track1.wav track2.wav track3.wav
# 混合模式(数据 + 音频)
wodim -v -dao dev=/dev/sr0 -data data.iso -audio track1.wav track2.wav
多会话刻录(追加数据)
# 第一次会话
wodim -v -multi dev=/dev/sr0 session1.iso
# 获取下次刻录的偏移(msinfo 输出两个数字 : 下一会话开始地址)
wodim -msinfo dev=/dev/sr0
# 输出示例 : 0,123456
# 追加第二会话(使用 genisoimage 的 -C 参数)
genisoimage -o session2.iso -C 0,123456 -M /dev/sr0 ./newdata/
wodim -v -multi dev=/dev/sr0 session2.iso
擦除可重写光盘
# 快速擦除 CD-RW
wodim -v blank=fast dev=/dev/sr0
# 完全擦除 DVD-RW
wodim -v blank=all dev=/dev/sr0
# 擦除并弹出
wodim -v blank=fast -eject dev=/dev/sr0格式化 DVD+RW
# 首次使用 DVD+RW 需格式化(后台运行)
wodim -v -format dev=/dev/sr04.1.3 eject
eject 用于卸载并弹出光驱托架 , 也可以控制一些可移动设备 ; 底层会自动调用umount卸载文件系统 , 不建议直接物理按键弹出光盘。 设备 : /dev/cdrom、/dev/sr0 , 也支持 USB 光驱。
语法:
eject [options] [设备名|挂载点]不写设备 , 默认操作
/dev/cdrom。
5 常用工具
5.1 基础命令
5.1.1 free
free 命令用于显示 Linux 系统的物理内存(RAM)和交换分区(Swap)的使用情况,是性能监控和故障排查的基础工具。
语法 :
free [OPTIONS]OPTIONS-b: 以Byte为单位显示内存使用情况。-k: 以KB为单位显示内存使用情况。-m:以MB为单位显示内存使用情况。-g:以GB为单位显示内存使用情况。-o: 不显示缓冲区调节列。-s<间隔秒数>:持续观察内存使用状况。-c counts:与-s一起使用显示[count]次-t: 显示内存总和列。-V:显示版本信息。
执行 free 默认输出(单位 : KB)
total used free shared buff/cache available
Mem: 8167848 2345678 1234567 123456 4587603 5234567
Swap: 2097152 0 2097152Linux 会尽可能利用内存做缓存 , 所以 free 通常很小 , 这是正常现象。available 才是重点 , 表示启动新程序还能用多少内存 , 只要这个值不为 0 , 系统就不算内存不足。
说明 : 在内核中 buffer/cache 占用的是内存空间。
cache : 缓冲,当用户读一个文件之后 , 系统会将文件保存进内核中的
cache, 之后用户如果再次读取数据时 , 会直接从cache中读取文件 , 命中率越高 , 读取的速率越快buffer:缓存,用户在写完数据之后直接将数据先写进内存中的
buffer,等过一会之后再将数据写磁盘中。
这个命令与查看
/proc/meminfo类似, 该文件中同样记录了, 内存信息
5.1.2 dd
dd 是 Linux/Unix 下的底层数据复制与转换工具 , 常被称为"数据粉碎机"或"磁盘克隆器"。它直接在块级别操作 , 绕过文件系统 , 是系统管理员的利器 , 也是"危险命令"之一(误操作可瞬间抹除磁盘)。
语法 :
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST参数
of=file: 写到所命名的文件而不是到标准输出if=file: 从所命名文件读取而不是从标准输入bs=size: 指定块大小(既是是ibs也是obs)ibs=size: 一次读size个byteobs=size: 一次写size个bytecbs=size: 一次转化size个byteskip=blocks: 从开头忽略blocks个ibs大小的块seek=blocks: 从开头忽略blocks个obs大小的块count=n: 只拷贝n个记录conv=conversion[,conversion...]: 用指定的参数转换文件转换参数
ascii: 转换EBCDIC为ASCIIebcdic: 转换ASCII为EBCDIClcase: 把大写字符转换为小写字符ucase: 把小写字符转换为大写字符nocreat: 不创建输出文件noerror: 出错时不停止notrunc: 不截短输出文件sync: 把每个输入块填充到ibs个字节 , 不足部分用空(NUL)字 符补齐
示例
[root@localhost /]# echo 1234567890 > f1
[root@localhost /]# echo abcdefgh > f2
[root@localhost /]# dd if=f1 of=f2 bs=1 count=4 skip=2 seek=3
4+0 records in
4+0 records out
4 bytes (4 B) copied, 0.000705302 s, 5.7 kB/s
[root@localhost /]# cat f2
abc3456[root@localhost /]#
[root@localhost /]# dd if=f1 of=f2 bs=1 count=4 skip=2 seek=3 conv=notrunc
4+0 records in
4+0 records out
4 bytes (4 B) copied, 0.00459552 s, 0.9 kB/s
[root@localhost /]# cat f2
abc3456h
[root@localhost /]# echo abcdefgh >f2
[root@localhost /]# dd if=f1 of=f2 bs=1 count=4 skip=2 seek=3 conv=notrunc
4+0 records in
4+0 records out
4 bytes (4 B) copied, 0.00459552 s, 0.9 kB/s
[root@localhost /]# cat f2
abc3456h
[root@localhost /]#
#备份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
#将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/dev/sdy
#将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx of=/path/to/image
#备份/dev/sdx全盘数据 , 并利用gzip压缩 , 保存到指定路径
dd if=/dev/sdx | gzip >/path/to/image.gz
#将压缩的备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx
#拷贝光盘数据到root文件夹下 , 并保存为cd.iso文件
dd if=/dev/cdrom of=/root/cd.iso
#销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1 磁盘克隆与备份(完整镜像)
# 克隆整盘到镜像文件
dd if=/dev/sda of=/backup/sda.img bs=4M status=progress
# 克隆到另一块盘(目标盘需 ≥ 源盘)
dd if=/dev/sda of=/dev/sdb bs=4M conv=noerror,sync status=progress
# 仅备份前 512 字节(MBR 含分区表)
dd if=/dev/sda of=mbr.bin bs=512 count=1制作启动盘(Linux安装介质)
# 将 ISO 写入 U 盘(谨慎!会抹除 U 盘数据)
dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsync
# 写入后同步缓存, 确保可以安全拔出
sync
数据擦除(安全销毁)
# 用随机数据覆盖整个磁盘(一次)
dd if=/dev/urandom of=/dev/sdX bs=4M status=progress
# 用零填充(快速清除数据, 恢复出厂状态)
dd if=/dev/zero of=/dev/sdX bs=4M status=progress
# 仅清除分区表(前 512 字节)
dd if=/dev/zero of=/dev/sdX bs=512 count=1
坏盘数据抢救(取证/恢复)
# 跳过坏块, 尽量抢救数据(conv=noerror,sync 关键)
dd if=/dev/sda of=rescue.img bs=4M conv=noerror,sync status=progress
# 更专业的替代 : ddrescue(自动记录坏块位置, 可断点续传)
ddrescue -d /dev/sda rescue.img rescue.log
创建测试文件/交换文件
# 创建 1GB 的测试文件
dd if=/dev/zero of=testfile bs=1M count=1024
# 创建稀疏文件(瞬间创建 10GB, 实际占用 0)
dd if=/dev/zero of=sparsefile bs=1M seek=10240 count=0
5.1.3 df
显示目前在Linux系统上的文件系统的磁盘使用情况统计。查看文件系统磁盘空间占用, 显示每个分区 / 块设备总容量、已用、剩余、使用率、挂载点。
语法:
df [OPTION]... [FILE]...OPTION-a: 全部文件系统列表-h,--human-readable: 方便阅读方式显示-H: 等于“-h” , 但是计算式 ,1K=1000, 而不是1K=1024-i: 显示inode信息-k: 区块为1024字节-l: 只显示本地文件系统-m: 区块为1048576字节-
-no-sync: 忽略sync命令-P: 输出格式为POSIX--sync: 在取得磁盘信息前 , 先执行sync命令-T,--print-type: 文件系统类型-t,--type: 只显示指定类型文件系统 , 如-t iso9660
[root@localhost ~]# df -t ext4 -P
Filesystem 1024-blocks Used Available Capacity Mounted on
/dev/mapper/VolGroup-lv_root 17938864 1245060 15775892 8% /
/dev/sda1 487652 40462 421590 9% /boot
[root@localhost ~]# df -aP
Filesystem 1024-blocks Used Available Capacity Mounted on
/dev/mapper/VolGroup-lv_root 17938864 1245064 15775888 8% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
tmpfs 961036 0 961036 0% /dev/shm
/dev/sda1 487652 40462 421590 9% /boot
none 0 0 0 - /proc/sys/fs/binfmt_misc
[root@localhost ~]# df -aPi
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/VolGroup-lv_root 1148304 28113 1120191 3% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
tmpfs 240259 1 240258 1% /dev/shm
/dev/sda1 128016 39 127977 1% /boot
none 0 0 0 - /proc/sys/fs/binfmt_misc
5.1.4 du
显示目录或文件的大小
语法
du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][--help][--version][目录或文件]OPTIONS-a,--all: 目录中个别文件的大小。-b: 以byte为单位,显示目录或文件大小。-h或--human-readable: 以K,M,G为单位 , 提高信息的可读性。-H或--si: 与-h参数相同 , 但是K,M,G是以1000为换算单位。-k或--kilobytes: 以1024 bytes为单位。-m或--megabytes: 以1MB为单位。-s: 仅显示总计信息-x或--one-file-xystem: 以一开始处理时的文件系统为准 , 若遇上其它不同的文件系统目录则略过。--exclude=<目录或文件>: 略过指定的目录或文件。--max-depth=<目录层数>: 超过指定层数的目录后 , 予以忽略.
示例:
排除磁盘空间不足
# 查看当前目录各子目录大小,按大小排序
du -h --max-depth=1 | sort -hr
# 输出示例 :
# 4.2G ./videos
# 1.5G ./documents
# 200M ./pictures
# 5.9G .
找到系统中最大文件
# 统计 /var 下大于 100MB 的目录
du -h /var | awk '$1 ~ /[MG]/ && $1+0 > 100'
# 或结合 find 找大文件(更精确)
find /var -type f -size +100M -exec du -h {} \;
排除特定目录统计
# 统计 /home 但排除缓存和日志
du -h --exclude='*.cache' --exclude='*.log' --max-depth=1 /home5.1.5 lsscsi
lsscsi(list scsi devices)是一个用于列出Linux系统中SCSI设备信息的命令。你可以使用这个命令来查看系统中的SCSI设备信息 , 包括硬盘驱动器、光盘驱动器等。
lsscsi [options]其中 , [options]可以有一些选项来控制lsscsi的行为。
选项详解
-s: 显示设备的容量大小。-c: 以全称显示默认的信息。-d: 显示设备的主设备号和次设备号。-g: 显示对应的sg设备名。-H: 显示主机控制器列表。-l: 显示相关属性。-v: 显示设备属性所在目录。-x: 以16进制显示lun号。-p: 输出DIF,DIX保护类型。-P: 输出有效的保护模式信息。-i: 显示udev相关的属性。-w: 显示WWN。
使用示例
[root@centos8 ~]# lsscsi -s
[1:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0 1.07GB
[N:0:0:1] disk VMware Virtual NVMe Disk__1 /dev/nvme0n1 21.4GB
5.1.6 blkid
blkid 用于查看块设备(分区、磁盘、LVM、RAID、镜像文件等)上的文件系统标识信息, 是 Linux 上最常用的磁盘识别工具之一。它基于 libblkid 库工作, 能识别 ext4、xfs、btrfs、ntfs、vfat、swap、LVM、mdraid 等各种签名。
语法:
blkid # 扫描所有块设备, 输出全部信息 blkid [选项] [设备...] # 查询指定设备
不加任何参数直接运行 , 是日常最常见的用法:
$ blkid
/dev/sda1: UUID="3f5c8a2b-9d1e-4f7a-b2c5-8e9d0a1b2c3d" TYPE="ext4" PARTUUID="a1b2c3d4-01"
/dev/sda2: UUID="aabbccdd-1122-3344-5566-77889900aabb" TYPE="swap" PARTUUID="a1b2c3d4-02"
/dev/sdb1: LABEL="data" UUID="1234-5678" TYPE="xfs" PARTUUID="eeeeffff-1111-2222-3333-444455556666"
/dev/mapper/vg0-root: UUID="xxxx-yyyy" TYPE="ext4"常用选项
# 只取 UUID,脚本最常用 blkid -s UUID -o value /dev/sdb1 # 3f5c8a2b-9d1e-4f7a-b2c5-8e9d0a1b2c3d # 导出为 shell 变量 eval $(blkid -o export /dev/sdb1) echo $UUID $TYPE $LABEL # 同时看 UUID 和类型 blkid -s UUID -s TYPE /dev/sdb1查找设备(反向查询)
blkid -L data # 输出 /dev/sdb1 blkid -U 3f5c8a2b-xxxx # 输出设备路径 blkid -t TYPE=xfs # 列出所有 xfs 分区 blkid -t LABEL=data -l # 第一个匹配设备
5.2 挂载命令
5.2.1 mount
mount 是 Linux 中用于挂载文件系统的核心命令 , 将存储设备(磁盘、分区、ISO 镜像、网络存储等)关联到目录树中的挂载点 , 使其内容可访问。直接使用mount 命令可以通过查看/etc/mtab文件显示当前已挂载的所有设备。
语法:
mount [选项] [设备] [挂载点] mount [选项] [-o 挂载选项] 设备 挂载点 mount [-fnrsvw] [-t vfstype] [-o options] device dirdevice:指明要挂载的设备设备文件: 例如
/dev/sda5卷标:
-L 'LABEL',例如-L 'MYDATA'UUID:-U UUID,例如-U 'e1a3f485-d29d-4c97-926e-2f12f978cdbb'伪文件系统名称:
proc,sysfs,devtmpfs,configfs
dir: 挂载点 。需要事先存在 , 建议使用空目录常用选项 :
-t TYPE: 指定文件系统类型(ext4,xfs,ntfs,iso9660,nfs,cifs,tmpfs等)-r: 只读挂载-w: 读写挂载-n: 不更新/etc/mtab(追踪当前系统所有文件系统的挂载卸载,用于只读系统修复 )-a: 自动挂载/etc/fstab中所有未挂载的文件系统-L 'LABEL':以卷标指定挂载设备-U 'UUID':以UUID指定要挂载的设备-B,--bind: 绑定目录到另一个目录上
-o options: (挂载文件系统的选项) , 多个选项使用逗号分隔async: 异步模式sync: 同步模式,内存更改时 , 同时写磁盘atime/noatime: 包含目录和文件diratime/nodiratime: 目录的访问时间戳auto/noauto: 是否支持自动挂载,是否支持-a选项exec/noexec: 是否支持将文件系统上运行应用程序dev/nodev: 是否支持在此文件系统上使用设备文件suid/nosuid: 是否支持suid和sgid权限remount: 重新挂载ro: 只读rw: 读写user/nouser: 是否允许普通用户挂载此设备 ,/etc/fstab使用acl: 启用此文件系统上的acl功能loop: 使用loop设备
默认参数defaults 相当于rw, suid, dev, exec, auto, nouser, async mount 是root使用 , 如果非root用户使用在/etc/fstab 中选项中添加user选项后 , su普通用户之后直接mount /mnt/part 可以直接将对应设备挂载上去
/app/partfile /mnt/part ext4 user,rw 0 0可以通过安装autofs安装包实现自动挂载 , 该安装包共有两个配置文件/etc/auto.misc,/etc/auto.master,在用户没有进入对应目录之后 , 过10分钟之后就会卸载对应目录 , 之后需要访问目录时才会挂载对应的目录。在配置文件/etc/sysconfig/autofs中可以配置对应对应的时间。
/etc/auto.master中有挂载目录 , 以及对应目录的mount map/etc/auto.misc中有对应的mount map
[root@localhost /]# cat /etc/auto.master
#
# Sample auto.master file
# This is a 'master' automounter map and it has the following format:
# mount-point [map-type[,format]:]map [options]
# For details of the format look at auto.master(5).
#
/misc /etc/auto.misc //--/misc是定义的自动mount的挂载点 , /etc/auto.misc里定义了mount的动作(/etc/auto.misc一般为默认的mount文件 , 还可以自定义)
#
# NOTE: mounts done from a hosts map will be mounted with the
# "nosuid" and "nodev" options unless the "suid" and "dev"
# options are explicitly given.
#
/net -hosts
#
[root@localhost /]# cat /etc/auto.misc
#
# This is an automounter map and it has the following format
# key [ -mount-options-separated-by-comma ] location
# Details may be found in the autofs(5) manpage
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
# the following entries are samples to pique your imagination
#linux -ro,soft,intr ftp.example.org:/pub/linux //--将ftp.example.org的共享目录/pub/linux/自动挂载到/misc/linux/下
#boot -fstype=ext2 :/dev/hda1
#floppy -fstype=auto :/dev/fd0
#floppy -fstype=ext2 :/dev/fd0
#e2floppy -fstype=ext2 :/dev/fd0
#jaz -fstype=ext2 :/dev/sdc1
#removable -fstype=ext2 :/dev/hdd
之后重启autofs服务即可
5.2.2 findmnt
findmnt 是 Linux 下用于查询已挂载文件系统信息的强大工具 , 比传统的 mount 命令输出更结构化、更易过滤。
语法:
findmnt [选项] [设备|挂载点|标签|UUID...]选项:
-A,--all: 打印所有的文件系统
-a,--ascii: 使用ascii字符进行树格式化。
-s,--fstab: 打印出/etc/fstab中的内容
-m,--mtab: 打印出/etc/mtab的内容
-D,--df: 以类似df的方式输出 , 这个选项相当于-o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET,但不包含所有的伪文件系统 , 使用--all打印所有文件系统
-k,--kernel: 打印出/proc/self/mountinfo信息这个值是默认的。-e,--evaluate: 用于将标签(LABEL)、UUID、PARTUUID、PARTLABEL等标识符实时解析为实际的设备路径。[root@MiWiFi-R3L-srv ~]# findmnt -e LABEL="/dev/media" TARGET SOURCE FSTYPE OPTIONS /mnt /dev/sdb1 ext4 rw,relatime,seclabel,barrier=1,data=writeback-n,--noheadings: 不打印开头的行
-O,--options list: 通过挂载选项筛选文件系统。[root@MiWiFi-R3L-srv /]# findmnt -O gid=5 TARGET SOURCE FSTYPE OPTIONS /dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000-o,--output list:确定打印出来的格式SOURCE TARGET FSTYPE OPTIONS LABEL UUID PARTLABEL PARTUUID SIZE AVAIL USED FSROOT findmnt -n -o OPTIONS /dev/sda1 # 输出:rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered -r,--raw: 输出最原始的格式-S,--source: 根据挂载源查找-T,--target: 通过挂载源查找-t,--types list: 通过文件系统类型查找挂载findmnt -t nfs,nfs4,cifs-M,--mountpoint: 指定挂载点目录
示例:
输出挂载信息带容量、UUID(df风格)
findmnt --df -o TARGET,SOURCE,FSTYPE,UUID,SIZE,USEDfindfs 通过LABEL 或UUID查找对应的分区文件
[root@MiWiFi-R3L-srv /]# findfs LABEL=/dev/media
/dev/sdb1
[root@MiWii-R3L-srv /]# linux不支持嵌套挂载。
[root@MiWiFi-R3L-srv /]# mount /dev/sdb1 /mnt
[root@MiWiFi-R3L-srv mnt]# mkdir boot
[root@MiWiFi-R3L-srv mnt]# touch 1 2 3 4 5 6
[root@MiWiFi-R3L-srv mnt]# ls
1 2 3 4 5 6 boot lost+found
[root@MiWiFi-R3L-srv mnt]# mount /dev/sdb1 boot/
[root@MiWiFi-R3L-srv mnt]# cd boot/
[root@MiWiFi-R3L-srv boot]# ls
1 2 3 4 5 6 boot lost+found
[root@MiWiFi-R3L-srv boot]# cd boot/
[root@MiWiFi-R3L-srv boot]# ls
5.3 卸载命令
5.3.1 umount
umount用于卸载已挂载的文件系统 , 是mount 的逆操作。正确卸载能确保数据完整性 , 防止文件系统损坏。
语法 :
umount [选项] <挂载点 | 设备>选项 :
-a: 卸除/etc/mtab中记录的所有文件系统 ;-d: 卸载loop镜像文件时 ,自动释放loop设备-h: 显示帮助 ;-l,--lazy: 延迟卸载(懒卸载)。立刻从目录树剥离, 新进程无法访问; 已打开的文件等全部进程释放后, 内核自动完成卸载。本地磁盘busy首选-f,--force: 强制卸载。多用于NFS/CIFS网络文件系统 , 网络断连卡住时。本地硬盘慎用 , 有丢数据风险-n: 卸除时不要将信息存入/etc/mtab文件中 ;-r: 若无法成功卸除 , 则尝试以只读的方式重新挂入文件系统 ;-R,--recursive: 递归卸载 ,卸载挂载点及其下面所有嵌套子挂载(overlay、bind mount常用)-t<文件系统类型>: 仅卸除选项中所指定的文件系统 ;-v: 执行时显示详细的信息 ;-V: 显示版本信息。
示例:
# 卸载该设备全部挂载点
umount -A /dev/sdb1
#卸载所有tmpfs
umount -t tmpfs
#递归卸载(有多次嵌套挂载)
umount -R /mnt/data
#NFS网络挂载失联, 强制卸载
umount -f /mnt/nfs
5.3.2 lsof
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下 , 任何事物都以文件的形式存在 , 通过文件不仅仅可以访问常规数据 , 还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等 , 系统在后台都为该应用程序分配了一个文件描述符 , 无论这个文件的本质如何 , 该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息 , 因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
选项
-a: 列出打开文件存在的进程-c<进程名>: 列出指定进程所打开的文件。支持正则表达式(用/regex/格式)-g: 列出GID号进程详情-d<文件号>: 列出占用该文件号的进程+d<目录>: 列出目录下被打开的文件+D<目录>: 递归列出目录下被打开的文件-N<目录>: 列出使用NFS的文件-n: 不将IP转换成对应的主机名-i [4|6][PROTO][@HOST][:PORT]: 专门列出网络套接字(socket) , 用来查看TCP/UDP连接、监听端口、端口对应的进程。[46][protocol][@hostname|hostaddr][:service|port]-p <进程号>: 列出指定进程号所打开的文件-u: 列出UID号进程详情-h: 显示帮助信息-v: 显示版本信息-s [p:s]:p表示TCP或者UDP,S表示对应协议的状态
示例展示 :
[root@MiWiFi-R3L-srv fd]# lsof -sTCP:LISTEN -itcp -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1493 root 3u IPv4 11309 0t0 TCP *:ssh (LISTEN)
sshd 1493 root 4u IPv6 11315 0t0 TCP *:ssh (LISTEN)
master 1572 root 12u IPv4 11505 0t0 TCP 127.0.0.1:smtp (LISTEN)
master 1572 root 13u IPv6 11506 0t0 TCP [::1]:smtp (LISTEN)
[root@MiWiFi-R3L-srv ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1493 root 3u IPv4 11309 0t0 TCP *:ssh (LISTEN)
sshd 1493 root 4u IPv6 11315 0t0 TCP *:ssh (LISTEN)
sshd 5174 root 3r IPv4 23371 0t0 TCP 192.168.31.63:ssh->192.168.31.110:58694 (ESTABLISHED)
[root@MiWiFi-R3L-srv ~]# lsof -u ^root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qmgr 1585 postfix cwd DIR 253,0 4096 391243 /var/spool/postfix
qmgr 1585 postfix rtd DIR 253,0 4096 2 /
qmgr 1585 postfix txt REG 253,0 308104 656344 /usr/libexec/postfix/qmgr
qmgr 1585 postfix mem REG 253,0 66432 130338 /lib64/libnss_files-2.12.so
qmgr 1585 postfix mem REG 253,0 122056 130390
#精确匹配
# 精确匹配进程名(避免匹配到 nginx-worker 等)
lsof -c /^nginx$/
#正则表达式
# 匹配以 python 开头的所有进程
lsof -c /^python/
# 匹配包含 "java" 的进程名
lsof -c /java/
# 匹配特定模式(如 sshd 或 ssh-agent)
lsof -c /^ssh/
5.3.3 fuser
fuser命令用于报告进程使用的文件和网络套接字。fuser命令列出了本地进程的进程号 , 那些本地进程使用file , 参数指定的本地或远程文件。对于阻塞特别设备 , 此命令列出了使用该设备上任何文件的进程。属于 psmisc 工具包。
与 lsof 的核心差异:
输出简洁 : 默认只显示
PID, 不显示进程名、用户等详细信息
操作直接 : 内置 -k 杀进程功能 , 无需配合
kill命令
视角不同 :
lsof从"进程看文件" ,fuser从"文件看进程"
语法:
fuser [OPTIONS] 文件名/目录/挂载点 fuser [OPTIONS] -n {tcp|udp} 端口选项
-a: 显示命令行中指定的所有文件 ;-k: 杀死访问指定文件的所有进程 ;-i: 杀死进程前需要用户进行确认 ;-l: 列出所有已知信号名 ;-m: 指定一个被加载的文件系统或一个被加载的块设备 ;-n: 选择不同的名称空间 ;-u: 在每个进程后显示所属的用户名。
示例:
排查挂载点被占用(umount busy 最常用!)
# 查看占用/mnt/data挂载点的所有进程(-m扫描整个文件系统)
sudo fuser -m /mnt/data
# 带上用户
sudo fuser -mu /mnt/data
# 详细输出
sudo fuser -muv /mnt/data查看某个文件被哪个进程打开
sudo fuser /var/log/nginx/access.log
sudo fuser -uv /var/log/nginx/access.log端口占用查询(-n tcp/udp)
# 查看占用TCP 22端口的进程
sudo fuser -n tcp 22
# UDP 53端口
sudo fuser -n udp 53
# 详细模式
sudo fuser -v -n tcp 80
参考连接:
识别 Linux上的设备(磁盘)类型 - SammyLiu - 博客园 (cnblogs.com)
菜鸟好站长:理解 linux文件系统 中 inode与block 的关系
Linux上磁盘热插拔 - 骏马金龙 - 博客园 (cnblogs.com)