Linux 磁盘与文件系统操作

文章目录

挂载磁盘分区

文件系统一般都存在于磁盘上,挂载磁盘分区也可以说是挂载文件系统,卸载磁盘分区也可以说是卸载文件系统。

mount命令将格式化好的磁盘分区挂载到一个目录上

bash 复制代码
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命令解挂文件系统。

bash 复制代码
umount [-ahnrvV][-t <文件系统类型>][文件系统]

umount可卸除目前挂在Linux目录中的文件系统。

线上在用的nfs访问时出了问题,导致/data1目录ls都无法进行输出,需要进行卸载掉 。而直接卸载时由于目录正被其他进程占用 ,无法直接umount,这里就结合fuser进行umount卸载。

1、直接卸载

bash 复制代码
[root@localhost /]# umount /data1/img
umount: /data1/img: device is busy
umount: /data1/img: device is busy

2、提示被占用,使用强制卸载

bash 复制代码
[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命令,先确认有那些进程在占用该目录

bash 复制代码
[root@localhost /]# fuser -cu /data1/img
/data1/img: 1757c(mysql)

也可以使用命令lsof查看正在被使用的文件。

上面查看发现是pid为1757的mysql用户起的进程在占用该目录。

4、确认mysql所起的进程可以kill 后,可以直接使用fuser 的k参数进行kill (也可以手动停掉1757进程再卸载)

bash 复制代码
[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命令。

  1. 注意事项

在使用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 表示支持。

bash 复制代码
cat /sys/block/nvme0n1/queue/discard_granularity 
512

也可以直接使用 lsblk 来检测,DISC-GRAN (discard granularity) 和 DISC-MAX (discard max bytes) 列非 0 表示该 SSD 支持 TRIM 功能。

bash 复制代码
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 来检测,

bash 复制代码
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

查看磁盘分区等信息:

bash 复制代码
$ fdisk -l

$ lsscsi	# lsscsi包

$ mount

$ df  -ah

$ lsblk -f

以上命令有多种选项,选择适当的选项可以定制输出信息。

判断磁盘是SSD还是HDD

判断cat /sys/block/*/queue/rotational的返回值(其中*为你的硬盘设备名称,例如sda等等),如果返回1则表示磁盘可旋转,那么就是HDD了;反之,如果返回0,则表示磁盘不可以旋转,那么就有可能是SSD了。

bash 复制代码
$ cat /sys/block/sda/queue/rotational 
1

$ cat /sys/block/nvme0n1/queue/rotational 
0

这种方法有个问题,那就是/sys/block/下面不只有硬盘,还可能有别的块设备,它们都在干扰你的判断。

  1. 使用lsblk命令进行判断,参数-d表示仅显示设备本身(不显示其上分区),参数-o表示仅显示特定的列。
bash 复制代码
$ lsblk -d -o name,rota
NAME    ROTA
sda        1
nvme0n1    0

ROTA是1的表示可以旋转,反之则不能旋转。

  1. 可以使用第三方工具判断,比如smartctl,这些工具的结果展示比较直观,但是需要单独安装。
bash 复制代码
$ sudo smartctl -a /dev/sda | grep -i rotation
Rotation Rate:    5400 rpm

$ sudo smartctl -a /dev/nvme0n1 | grep -i rotation

机械磁盘HDD

bash 复制代码
smartctl -a /dev/sda	# smartmontools包

固态磁盘SSD

bash 复制代码
smartctl -a /dev/nvme0

针对nvme磁盘,可以使用以下nvme-cli包中的命令:

  • nvme list:显示系统中所有nvme设备的信息,包括设备名称、大小、固件版本等。
  • nvme id-ctrl:显示nvme设备的详细信息,包括该设备的厂商、型号、序列号、容量等。
  • nvme smart-log:显示nvme设备的SMART信息,包括该设备的使用状况、错误计数、温度等。
bash 复制代码
# 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
相关推荐
友友马5 分钟前
『 Linux 』高级IO (三) - Epoll模型的封装与EpollEchoServer服务器
linux·服务器
福大大架构师每日一题30 分钟前
42.2 告警触发trigger模块单点问题和高可用解决方案
java·linux·服务器·prometheus
大霞上仙31 分钟前
jenkins入门13--pipeline
运维·jenkins
激进的猴哥37 分钟前
ElasticSearch7.8下载、安装教程和快照恢复
运维·jenkins
武汉万象奥科1 小时前
Linux文件系统的安全保障---Overlayroot!
java·服务器·前端
白手小弟1 小时前
nginx http反向代理
运维·nginx
old_power1 小时前
x11转发:通过ssh远程(或wsl)使用GUI程序
linux·服务器·ssh
网硕互联的小客服1 小时前
404 Not Found:请求的页面不存在或已被删除。
linux·运维·服务器·windows
dessler2 小时前
Docker-原理之写实复制(cow)
linux·运维·docker
L·S·P2 小时前
Linux 安装 meilisearch
linux·服务器·elasticsearch·搜索引擎·meilisearch