文章目录
- 挂载磁盘分区
- 卸载磁盘分区
- fstrim
- 检测 SSD 是否支持 TRIM
- 检查磁盘状态
- 判断磁盘是SSD还是HDD
挂载磁盘分区
文件系统一般都存在于磁盘上,挂载磁盘分区也可以说是挂载文件系统,卸载磁盘分区也可以说是卸载文件系统。
mount命令将格式化好的磁盘分区挂载到一个目录上
mount /dev/sda3(要挂载的分区) /mnt(挂载点)
常用参数:
不带参数的mount命令会显示所有已挂载的文件系统。
-t 指定文件系统的类型
-o 指定挂载选项
ro,rw 以只读或读写形式挂载,默认是rw
sync 代表不使用缓存,而是对所有操作直接写入磁盘(防止断电等异常情况引起数据丢失)
async 代表使用缓存,默认是async
noatime 代表每次访问文件时不更新文件的访问时间(accesstime)
atime 代表每次访问文件时更新文件的访问时间
remount 重新挂载文件系统
自动挂载:配置文件/etc/fstab用来定义需要自动挂载的文件系统,fstab中每一行代表一个挂载配置,格式如下:
/dev/sdb3 /mnt ext4 defaults 0 0 (之间用Tab隔开进行对齐)
需要挂载的设备 挂载点 文件系统 挂载选项 dump,fsck相关选项
要挂载的设备也可以使用LABEL进行识别,使用LABEL=xxx
取代/dev/sdb3
Linux下用e2label命令来设定分区的label,其用法很简单:(查看或修改我们的卷标)
e2label 分区 [新label]
如果后面指定新label则为分区设定新label;如果后面不指定label,则显示分区的当前label。
mount –a
命令会挂载所有fstab中定义的自动挂载项。
卸载磁盘分区
umount命令解挂文件系统。
umount [-ahnrvV][-t <文件系统类型>][文件系统]
umount可卸除目前挂在Linux目录中的文件系统。
线上在用的nfs访问时出了问题,导致/data1目录ls都无法进行输出,需要进行卸载掉 。而直接卸载时由于目录正被其他进程占用 ,无法直接umount,这里就结合fuser进行umount卸载。
1、直接卸载
[root@localhost /]# umount /data1/img
umount: /data1/img: device is busy
umount: /data1/img: device is busy
2、提示被占用,使用强制卸载
[root@localhost /]# umount -f /data1/img
umount2: Device or resource busy
umount: /data1/img: device is busy
umount2: Device or resource busy
umount: /data1/img: device is busy
注:使用-f 参数进行强制卸载时一般建议等一会儿再进行下面的操作,一些情况下处理需要1-2分钟的时间。
3、使用umount -f,问题依旧。使用fuser命令,先确认有那些进程在占用该目录
[root@localhost /]# fuser -cu /data1/img
/data1/img: 1757c(mysql)
也可以使用命令lsof查看正在被使用的文件。
上面查看发现是pid为1757的mysql用户起的进程在占用该目录。
4、确认mysql所起的进程可以kill 后,可以直接使用fuser 的k参数进行kill (也可以手动停掉1757进程再卸载)
[root@localhost /]# fuser -ck /data1/img
/data1/img: 1757c
注:这里k 就是kill的意思,注意没进行确认前要谨慎使用该参数。
fstrim
fstrim命令来自于英文词组“filesystem trim”的缩写,其功能是回收文件系统中未使用的块资源。
fstrim命令对固态硬盘和精简配置的存储设备意义较大,有一定提高驱动器读写效率,延长使用寿命的作用,当然设备一定要已支持TRIM才行
在使用SSD时,不能像传统的磁盘那样进行数据碎片整理,否则会使固态硬盘的寿命缩短。同时,由于SSD只能写入整块数据,如果写入比块小,则需要写入整个块,这就会导致浪费大量的存储空间。
使用Linux fstrim命令可以自动清除无用的数据块,从而提高固态硬盘的使用效率。
在使用 systemd 的 Linux 发行版中,一般都自带了 fstrim.timer 和 fstrim.service,启用后会定期一周执行一次 fstrim。
语法格式:fstrim [参数]
常用参数:
-a 回收所有已挂载文件系统上的未使用空间
-o 设置文件系统上搜索空闲块的起点
-l 设置在多大范围内搜索空闲块
-v 输出回收过程中的详细信息
由于fstrim命令的执行需要进行数据块清理,因此执行时间可能会比较长。在使用fstrim命令时,可以使用计划任务功能来实现自动运行fstrim命令。将命令添加到计划任务中,系统就可以定期自动执行fstrim命令。
- 注意事项
在使用fstrim命令时,需要注意以下几点:
(1)确认SSD支持fstrim命令
fstrim命令只能在支持TRIM命令的SSD上使用。如果SSD不支持TRIM技术,执行fstrim命令将会有损SSD的寿命和数据完整性。
(2)定期运行fstrim命令
建议定期运行fstrim命令来释放磁盘空间。一般情况下,建议每周运行一次。
(3)确认挂载点
在执行fstrim命令之前,需要确认SSD的挂载点是否正确。如果挂载点错误,可能会导致错误的数据块被清理,从而损坏SSD的数据。
(4)备份重要数据
在执行fstrim命令之前,需要备份重要数据。虽然执行fstrim命令不会删除文件,但也有可能导致数据丢失。
检测 SSD 是否支持 TRIM
可以通过 /sys/block 下的信息来判断 SSD 支持 TRIM, discard_granularity 非 0 表示支持。
cat /sys/block/nvme0n1/queue/discard_granularity
512
也可以直接使用 lsblk 来检测,DISC-GRAN (discard granularity) 和 DISC-MAX (discard max bytes) 列非 0 表示该 SSD 支持 TRIM 功能。
lsblk --discard
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda 0 4K 2G 0
└─sda1 0 4K 2G 0
nvme0n1 0 512B 2T 0
├─nvme0n1p1 0 512B 2T 0
├─nvme0n1p2 0 512B 2T 0
└─nvme0n1p3 0 512B 2T 0
lsblk --discard
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda 0 0B 0B 0
├─sda1 0 0B 0B 0
├─sda2 0 0B 0B 0
└─sda3 0 0B 0B 0
sdb 0 0B 0B 0
└─sdb1 0 0B 0B 0
sr0 0 0B 0B 0
loop0 0 4K 4G 1
网上也有文章介绍通过 hdparm 来检测,
sudo hdparm -I /dev/sda | grep TRIM
* Data Set Management TRIM supported (limit 10 blocks)
* Deterministic read data after TRIM
sudo hdparm -I /dev/sda | grep TRIM
SG_IO: bad/missing sense data, sb[]: f0 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
对于 ext4 文件系统,可以在/etc/fstab里添加 discard 参数来启用 TRIM,添加前请确认你的 SSD 支持 TRIM。
/dev/sdb1 /data1 ext4 defaults,noatime,discard 0 0
util-linux 中自带了 fstrim 工具(Discard unused blocks on a mounted filesystem.),平常用 -a 选项(-a, --all trim all mounted filesystems that are supported)比较多,可以自动检测硬盘是否支持 trim 功能,并在已挂载文件系统上执行 trim
检查磁盘状态
主要命令:fdisk, lsscsi, mount, df, lsblk
查看磁盘分区等信息:
$ fdisk -l
$ lsscsi # lsscsi包
$ mount
$ df -ah
$ lsblk -f
以上命令有多种选项,选择适当的选项可以定制输出信息。
判断磁盘是SSD还是HDD
判断cat /sys/block/*/queue/rotational
的返回值(其中*为你的硬盘设备名称,例如sda等等),如果返回1则表示磁盘可旋转,那么就是HDD了;反之,如果返回0,则表示磁盘不可以旋转,那么就有可能是SSD了。
$ cat /sys/block/sda/queue/rotational
1
$ cat /sys/block/nvme0n1/queue/rotational
0
这种方法有个问题,那就是/sys/block/下面不只有硬盘,还可能有别的块设备,它们都在干扰你的判断。
- 使用lsblk命令进行判断,参数-d表示仅显示设备本身(不显示其上分区),参数-o表示仅显示特定的列。
$ lsblk -d -o name,rota
NAME ROTA
sda 1
nvme0n1 0
ROTA是1的表示可以旋转,反之则不能旋转。
- 可以使用第三方工具判断,比如smartctl,这些工具的结果展示比较直观,但是需要单独安装。
$ sudo smartctl -a /dev/sda | grep -i rotation
Rotation Rate: 5400 rpm
$ sudo smartctl -a /dev/nvme0n1 | grep -i rotation
机械磁盘HDD
smartctl -a /dev/sda # smartmontools包
固态磁盘SSD
smartctl -a /dev/nvme0
针对nvme磁盘,可以使用以下nvme-cli包中的命令:
- nvme list:显示系统中所有nvme设备的信息,包括设备名称、大小、固件版本等。
- nvme id-ctrl:显示nvme设备的详细信息,包括该设备的厂商、型号、序列号、容量等。
- nvme smart-log:显示nvme设备的SMART信息,包括该设备的使用状况、错误计数、温度等。
# nvme list
Node SN Model Namespace Usage Format FW Rev
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1 L9MLCHC21287268 ACR512GMLCH-E3C-2 1 512.11 GB / 512.11 GB 512 B + 0 B EDFM60.0
# nvme id-ctrl /dev/nvme0n1
NVME Identify Controller:
vid : 0x1987
ssvid : 0x1987
sn : L9MLCHC21287268
mn : ACR512GMLCH-E3C-2
fr : EDFM60.0
rab : 1
ieee : 6479a7
cmic : 0
mdts : 6
cntlid : 1
ver : 10300
rtd3r : 124f80
rtd3e : 2191c0
oaes : 0
ctratt : 0
rrls : 0
oacs : 0x17
acl : 0
aerl : 3
frmw : 0x12
lpa : 0xe
elpe : 15
npss : 4
avscc : 0x1
apsta : 0x1
wctemp : 343
cctemp : 363
mtfa : 100
hmpre : 139672
hmmin : 546
tnvmcap : 512110190592
unvmcap : 0
rpmbs : 0
edstt : 30
dsto : 1
fwug : 4
kas : 1
hctma : 0x1
mntmt : 273
mxtmt : 343
sanicap : 0x6
hmminds : 0
hmmaxd : 0
nsetidmax : 0
anatt : 0
anacap : 0
anagrpmax : 0
nanagrpid : 0
sqes : 0x66
cqes : 0x44
maxcmd : 0
nn : 1
oncs : 0x5e
fuses : 0
fna : 0x1
vwc : 0x1
awun : 255
awupf : 0
nvscc : 1
nwpc : 0
acwu : 0
sgls : 0
mnan : 0
subnqn :
ioccsz : 0
iorcsz : 0
icdoff : 0
ctrattr : 0
msdbd : 0
ps 0 : mp:3.50W operational enlat:0 exlat:0 rrt:0 rrl:0
rwt:0 rwl:0 idle_power:- active_power:-
ps 1 : mp:1.90W operational enlat:0 exlat:0 rrt:1 rrl:1
rwt:1 rwl:1 idle_power:- active_power:-
ps 2 : mp:1.50W operational enlat:0 exlat:0 rrt:2 rrl:2
rwt:2 rwl:2 idle_power:- active_power:-
ps 3 : mp:0.0700W non-operational enlat:5000 exlat:1900 rrt:3 rrl:3
rwt:3 rwl:3 idle_power:- active_power:-
ps 4 : mp:0.0020W non-operational enlat:13000 exlat:100000 rrt:4 rrl:4
rwt:4 rwl:4 idle_power:- active_power:-
# nvme smart-log /dev/nvme0n1
Smart Log for NVME device:nvme0n1 namespace-id:ffffffff
critical_warning : 0
temperature : 40 C
available_spare : 100%
available_spare_threshold : 5%
percentage_used : 35%
data_units_read : 27,587,533
data_units_written : 125,249,587
host_read_commands : 486,510,750
host_write_commands : 9,583,798,391
controller_busy_time : 8,831,533,374
power_cycles : 199
power_on_hours : 24,531
unsafe_shutdowns : 119
media_errors : 0
num_err_log_entries : 10,905
Warning Temperature Time : 5469
Critical Composite Temperature Time : 0
Thermal Management T1 Trans Count : 30
Thermal Management T2 Trans Count : 13
Thermal Management T1 Total Time : 223518
Thermal Management T2 Total Time : 149572