磁盘类型和相关术语
在 Linux 中一切皆文件,但是类型不同。例如使用 ls -l
对于设备文件和普通文件有一部分内容是不同的,即普通文件有大小,而设备文件有主设备号和次设备号,没有大小。
# ll 1.txt /dev/sda /dev/sda1
-rw-r--r-- 1 root root 47 Nov 30 21:22 1.txt
brw-rw---- 1 root disk 8, 0 Dec 3 10:13 /dev/sda
brw-rw---- 1 root disk 8, 1 Dec 3 10:13 /dev/sda1
如果使用 cp -a
复制一个块设备,这时两个文件的主设备号和次设备号相同,但是它们的 inode 不同,类似于文件的软连接。如果挂载复制出来的文件,可以访问到与被复制的设备的内容。
# df /dev/sda1
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 487634 142353 315585 32% /boot
# cp -a /dev/sda1 ./sda1.bak
# mount sda1.bak /mnt
# df /mnt
Filesystem 1K-blocks Used Available Use% Mounted on
/root/sda1.bak 487634 142353 315585 32% /mnt
# ll -id /mnt /dev/sda1
15113 brw-rw---- 1 root disk 8, 1 Dec 3 10:13 /dev/sda1
2 dr-xr-xr-x. 6 root root 1024 Nov 13 18:27 /mnt
使用专门的命令来创建相同的设备:
# mknod /data/sda1 b 8 1
# mount /data/sda1 /mnt/
# df /mnt
Filesystem 1K-blocks Used Available Use% Mounted on
/data/sda1 487634 142353 315585 32% /mnt
硬盘种类繁多,可能有:
/dev/sd[a-z] # SCSI、SATA、SAS、USB 等
/dev/nvme... # nvme 协议,例如 固态硬盘
/dev/vd # 虚拟硬盘
/dev/xvd
如果在虚拟机上新增了几块硬盘,可以使用以下命令来进行扫描,使系统能够设别出来。
$ echo '- - -' > /sys/class/scsi_host/host0/scan;echo '- - -' > /sys/class/scsi_host/host1/scan;echo '- - -' > /sys/class/scsi_host/host2/scan
# 最好设置成别名
# alias scandisk="echo '- - -' > /sys/class/scsi_host/host0/scan;echo '- - -' > /sys/class/scsi_host/host1/scan;echo '- - -' > /sys/class/scsi_host/host2/scan"
可以使用以下命令判断是否具有旋转特性的存储设备,值是 1 表示是机械硬盘, 值是 0 表示固态硬盘:
]# lsblk -d -o NAME,ROTA
NAME ROTA
sda 1
sr0 1
也可以使用以下命令查看:
]# ls /sys/block # 列出当前的硬件设备
sda sr0
]# cat /sys/block/sda/queue/rotational
1
]# cat /sys/block/sr0/queue/rotational
1
]# cat /sys/block/*/query/rotational
磁盘分区
分区方式
目前有两种分区的方式:MBR、GPT。
MBR
MBR:Master Boot Record, 1982年,使用 32 位表示扇区数,分区不超过 2T。
$ echo 2^32*512/1024/1024/1024 | bc
2048
CentOS 6 版本开始按照 Sector 划分,而 CentOS 5 及之前采用柱面划分。
0 磁道 0 扇区:512 bytes
446 bytes --> boot loader
64 bytes --> 分区表,每 16 字节标识一个分区
2 bytes --> 55AA
因此,MBR 分区的硬盘最多只能有 4 个主分区,或分出其中的分区成为扩展分区。
可以使用以下命令查看十六进制的分区情况,最后部分是有关分区的数据:
# hexdump -C -n 512 /dev/sda1
硬盘的分区表数据很重要,如果不小心弄坏了,就不能启动电脑了。我们需要对分区表进行备份(Disk Partition Table):
说明:dd
命令中 skip 表示跳过源位置,seek 表示跳过目标位置
# 备份分区表
]# dd if=/dev/sda of=/data/dpt.img bs=1 count=64 skip=446
]# scp dpt.img 10.0.0.200:
# 破坏分区表
]# dd if=/dev/zero of=/data/sda bs=1 count=64 skip=446
# 使用以下命令已经看不到分区表
]# fdisk -l
如果此时进行 reboot
就无法启动 Linux 了。
我们需要使用其他启动方式,例如使用光盘启动,进入 ‘rescue mode’,选择第 3 项 ‘skip to shell’。
先要配置网络,没有网络可能得不到备份文件。
]# ifconfig ens33 10.0.0.100/24 # 或使用推荐的命令
]# ip addr add 10.0.0.100/24 dev ens33
]# scp 10.0.0.200:/root/dpt.img ./
# 恢复分区表
]# dd if=dpt.img of=/dev/sda bs=1 seek=446
]# exit
GPT
GPT:GUID (Globals Unique IDentifiers),支持128个分区表,使用 64 位,支持 8Z 空间(512Byte/block)至 64Z 空间(4096Byte/block)。
使用 128 位 UUID (Universible Firmware Interface)表示磁盘和分区。该分区表自动在头和尾进行备份,并有 CRC 校验位。
UEFI(Unified Extensible Firmware Interface)统一可扩展固件接口的硬件支持 GPT 分区。
BIOS 和 UEFI
BIOS 采用了 16 位汇编语言编写,只能运行在实模式中(内存寻址方式由 16 位段寄存器的内容乘以16 (10H) 当做段基地址,加上 16 位偏移地址形成 20 位的物理地址下,可访问的内存空间为 1MB,只支持字符操作界面。
UEFI 采用了 32 位或 64 位的 C 语言编写,突破了实模式的限制,可达最大的寻址空间,支持图形界面,使用文件方式保存信息,支持 GPT 分区启动,适合较新的系统和硬件配合使用。
管理分区
列出块设备的命令是 lsblk
。
创建分区命令:
fdisk # 管理 MBR 分区,在 CentOS 8 中也支持 GPT 分区
gdisk # 管理 GPT 分区
parted # 高级分区操作
重新设置内存中的内核分区表,使内存中的分区与 fdisk
显示的一样:
# 对于 CentOS 5,7, 8 使用
partprobe
# 以上命令对于 CentOS 6 没有效果,使用以下命令
partx -a /dev/sda
# 如果删除了 6,7, 8 三个分区,这时需要使用以下参数
partx -d --nr 6-8 /dev/sda
可以使用以下命令查看分区的情况:
fdisk l
lsblk
cat /proc/partitions
parted 命令
该命令支持可交互或非交互的方式,其操作是实时生效的,要小心使用。其使用格式为:
parted [option]... [device [cmd [param]...]...]
示例:
parted /dev/sdb mklabel gpt|msdos # msdos for MBR
parted /dev/sdb print
parted /dev/sdb mkpart primary 1 200 # 默认单位是 M
parted /dev/sdb rm 1 # 1 表示第一个分区数字
parted -l # 列出所有硬盘分区信息
dd if=/dev/zero of=/dev/sdb bs=1 count=66 seek=64 # 清除分区信息及最后两个字节 '55aa'
dd if=/dev/zero of=/dev/sdb bs=1 count=2 seek=510 # 清除分区表最后两个字节 '55aa'
fdisk
从 CentOS 8 开始也支持 GPT 分区,它是交互式操作的。操作时有对应的提示。不是实时操作的。
如果只有一块硬盘,需要安装操作系统,必须要设置主分区,如果不安装操作系统,可以创建扩展分区。但是最多只能是一个扩展分区,而主分区最多只能有4个。
如果有几个扩展的逻辑分区,中途删除一个分区,则后面的分区编号会自动填补空缺,这样说明,使用这样的设备名在编程中可能由于设备名改变造成不正确 /dev/sda5
。
如果想要使用非交互式创建分区
echo -e 'n\np\n\n\n+2G\nw\n' | fdisk /dev/sdc
文件系统
文件系统概念
操作系统负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。从系统角度看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩和加密等。
支持的文件系统:
ls /lib/modules/`uname -r`/kernel/fs
查询帮助
man 5 fs
文件系统类型
Linux 常用文件系统
- ext2:Extended file system,适用于分区容量不太大,不频繁更新的分区,例如,/boot 分区
- ext3:是 ext2 的改进版本,支持日志功能,能够帮助系统从非正常关机导致的异常中恢复
- ext4:是 ext 文件系统的最新版。提供了许多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16T),最大 1EB 的文件系统,以及提升速度
- xfs:SGI,支持最大 8EB 的文件大小
- swap:交换
- iso9660:光盘
- btrfs
- reiserfs
Windsows 常用文件系统
- FAT32
- NTFS
- exFAT
Unix
- FFS (fast fs)
- UFS (unix fs)
- JFS2
网络文件系统
- NfS
- CIFS
集群文件系统
- GFS2
- OCFS2 (oracle)
分布式文件系统
- fastdfs
- ceph
- moosefs
- mogilefs
- glusterfs
- Lustre
创建文件系统
创建文件系统的工具:
-
mkfs 命令
:可以使用以下两种形式,-L 'LABEL
表示卷标mkfs.FS_TYPE /dev/DEVICE # FS_TYPE 表示文件系统,例如 ext2,ext3,ext4等 mkfs -t FS_TYPE /dev/DEVICE # 另一种形式
-
mke2fs 命令
:ext 系列文件系统专用工具
以上命令的常用选项:
-t {ext2|ext3|ext4} # 指定文件系统类型
-b {1024|2048|4096} # 指定块大小
-L 'LABEL' # 设置卷标
-j # 相当于 '-t ext3', 'mkfs.ext3'
-i # # 指定每多少个字节创建一个 inode,不应该小于 block 大小
-N # # 指定分区中创建多少个 inode
-l # 一个 inode 记录占用磁盘空间的大小,'128~4096'
-m # # 默认 '5%',为管理人员占用总空间的比例
-O FEATURE[,...] # 启用指定的特性
-O ^FEATURE # 关闭指定的特性
```
对于 `ext4` 类型,想要查看块大小需要使用,可以在列出的数据中看到 'block size: 4096'
```bash
tune2fs -l /dev/sda1
对于 xfs
类型,想要查看块大小需要使用,可以看到 ‘bsize=4096’
xfs-info
df /dev/xxx # 用于查看文件系统占用的空间
du -s /dev/xxx # 用于查看文件所占用的空间大小
从以上可以看出,创建文件需要占用两种空间,一是 inode 元数据,另一个是文件本身实际占用的空间。如果创建的空文件,文件不占用实际空间,但是要占用 inode 空间。如果创建的文件大小比块大小,如比 4k小,也要占用这个最小空间。因此,一般需要对今后可能的文件有一个规划,如果都是小文件,比 4k 小,则指定更小的块大小。
查看和管理分区信息
-
blkid
可以查看块设备的属性信息blkid [option]...[device]
常用选项:
- -U UUID # 根据指定的 UUID 来查看对应的设备
- -L LABEL # 根据指定的 LABEL 来查看对应的设备
-
e2label
: 管理 ext 系列文件系统的标签e2label DEVICE [LABEL]
-
findfs
:查找分区
findfs [options] LABEL=<label>
findfs [options] UUID=<uuid>
-
tune2fs: 重新设定 ext 系列文件系统可调整的参数值
常用选项:
-l # 查看指定文件系统超级块(super block)信息 -L 'LABEL' # 修改卷标 -m # # 修改预留给管理员的空间百分比 -j # 将 ext2 升级为 ext3 -O # 文件系统属性启用或禁用,例如,'-O ^has_journal' -o # 调整文件系统的默认挂载选项,例如,'-o ^acl' -U UUID # 修改 UUID 的值
-
dumpe2fs
:显示 ext 文件系统信息,将磁盘块分组管理常用选项:
-h # 查看超级块信息,不显示分组信息
-
xfs_ifo
:显示挂载或已挂载的 xfs 文件系统信息xfs_ifo mountpoint | devname
在 CentOS 6 上默认创建文件系统时,有些特性没有指定,例如,acl 默认没有。
文件系统检测和修复
文件系统故障常发生于死机或者非正常关机之后,文件系统被标记为 “no clean”。
注意:一定不要在挂载状态下执行以下命令进行修复。
-
fsck
:File System Check。注意文件类型要与实际的文件系统一致。fsck.FS_TYPE fsck -t FS_TYPE
常用选项:
-a # 自动修复 -r # 交互式修复错误
-
e2fsck:ext 系列文件专用的检测修复工具
-y # 自动回答为 yes -f # 强制修复 -p # 自动进行安全的修复文件系统问题
-
xfs_repair:xfs 文件系统专用的检测修复工具
-f # 修复文件 -n # 只检查 -d # 允许修复只读的挂载设备,在单用户下修复 '/' 时使用,然后使用 reboot
单用户说明设备不会有其他人使用。并且根目录
/
不能取消挂载。
挂载
分区创建文件系统后需要挂载才能访问。与 windows 不一样的是,Linux 只有一个根,因此需要挂载。
挂载点(mountpoint)就是一个目录,但是如果该目录已有文件在其中,如果进行了挂载,挂载后这些文件就看不到了,只有在取消挂载后才会出现。
同一个设备可以挂载在不同的目录,好像是一个房间有几个门一样,可以使用 mount
命令可见这两个挂载,在 df, lsblk
中不可见第二个挂载。
如果一个挂载点挂载了两个设备,则这个挂载点只能访问第二个挂载的设备。虽然在 mount
命令中可以看到两次挂载。此时,如果把第二个挂载取消,这时第一个挂载就能起作用。
mount 命令
mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint
- device:指明要挂载的设备
- 设备文件:例如,
/dev/sda5
- 卷标 :
-L 'LABEL'
- UUID :
-U UUID
- 伪文件系统名称:
proc, sysfs, devtmpfs, configfs
-
mountpoint:挂载点即目录必须事先存在,建议使用空目录
-
mount 常用选项
-t vsftype # 指定要挂载的设备上的文件系统类型
-r # readonly,只读
-w # read and write,可读写
-n # 不更新 '/etc/mtab',使用 'mount' 查询时不可见
-a # 自动挂载所有支持自动挂载的设备(定义在 '/etc/fstab' 文件中,且指定了 'auto' 功能)
-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 # readonly
rw # 读写,默认启用
user/nouser # 是否允许普通用户挂载此设备,'/etc/fstab' 使用
acl|noacl # 启用禁用 acl 功能
loop # 启用 loop 设备
_netdev # 当网络可用时才对网络资源进行挂载,例如,NFS 文件系统
defaults # 相当于 'rw, suid, dev, exec, auto, nouser, async'
已经挂载的设备,如果想要修改某些特性,可以使用以下命令格式,不需要取消挂载后重新挂载:
mount -o remount, ro /mnt/device
把一个目录挂载到另一个目录,使用:
mkdir /mnt/etc; mount --bind /etc/ /mnt/etc
这时,这两个目录之间并没有硬链接或软链接。
loop 设备就是一个文件挂载上去
# 生成一个文件
]# dd if=/dev/zero of=/data/loop.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.902876 s, 116 MB/s
# 创建文件系统
]# mkfs.ext4 /data/disk.img
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: done
Creating filesystem with 102400 1k blocks and 25688 inodes
Filesystem UUID: 47468748-15f8-4622-9992-f71b030b0142
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
# 查看
]# blkid /data/loop.img
/data/loop.img: UUID="47468748-15f8-4622-9992-f71b030b0142" BLOCK_SIZE="1024" TYPE="ext4"
# 挂载此文件
]# mkdir /mnt/loop
]# mount /data/disk.img /mnt/loop
# 查看到以下 /dev/loop0 是新增的
# 其过程是新给文件分配一个文件名 /dev/loop0,然后再挂载
]# ll /dev/loop*
brw-rw----. 1 root disk 7, 0 Dec 7 13:57 /dev/loop0
crw-rw----. 1 root disk 10, 237 Dec 7 13:57 /dev/loop-control
]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 980940 0 980940 0% /dev
tmpfs 998404 0 998404 0% /dev/shm
tmpfs 998404 8900 989504 1% /run
tmpfs 998404 0 998404 0% /sys/fs/cgroup
/dev/sda2 102687672 2103336 95325072 3% /
/dev/sda1 588352 141492 403852 26% /boot
/dev/sda3 51343840 57752 48648264 1% /data
tmpfs 199680 0 199680 0% /run/user/0
/dev/loop0 95054 1550 86336 2% /mnt/loop
# 可以看到具体信息
]# losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 1 0 /data/loop.img 0 512
# 如果我们在这个分区中,复制或创建文件,然后可以把 '/data/loop.img'
# 拷贝到其它电脑,并挂载就可以访问这些文件了。
在 CentOS 6 中只有 8 个 loop 设备可挂载。CentOS 7 以后,则没有限制,实时生成,编号自增。
umount 命令
取消挂载时,可使用设备,也可以使用挂载点。注意,如果在对应的设备内部,这时不能取消挂载该设备,需要离开后才能操作。如果自己不在里面,也显示 ‘target is busy’,说明有其它用户在使用。
umount device|mountpoint
查看挂载情况
挂载后就可以使用以下命令进行查看
# 查看 '/etc/mtab' 文件显示当前已挂载的所有设备
mount
# 查看内核追踪到的已挂载的所有设备
cat /proc/mounts
# 查看文件系统的情况
df -T
查看目录是否为挂载点
findmnt mountpoint|device
echo $?
查看正在访问指定文件系统的进程
lsof mountpoint
fuser -v mountpoint
终止所有正在访问指定文件系统的进程
fuser -km mountpoint
持久挂载
将需要在开机时进行挂载的配置到 /etc/fstab
中,该文件的帮助,可以查询:
man 5 fstab
文件中每一行都定义一个要挂载的文件系统,其中包括 6 项内容。
-
挂载的设备或伪文件系统
设备文件可以使用,便签
LABEL=""
,UUIDUUID=""
伪文件系统名称:proc, sysfs
-
挂载点:必须事先存在的目录
-
文件系统类型:
ext4, xfs, iso9660, nfs, none
-
挂载选项:
defaults, acl, bind
-
转储频率:
0
表示不做备份,1
表示每天转储,2
表示隔天转储 -
该选项用于
fsck
检查文件系统健康时的顺序:0
表示不自检,1
表示首先自检,一般只有在 ‘rootfs’ 采用,2
表示非 ‘rootfs’ 使用
如果对该文件进行了修改,可以先进行以下命令,一方面使修改起效,也可以检查一下是否有错误。
mount -a
这个命令对于已经挂载的分区不起作用,这时可以先进行取消挂载,然后再执行该命令。
如果无法取消挂载,例如,根目录,可以使用以下选项:
mount -o remount /path/to/mountpoint
可以使用以下命令生成新的 UUID
:
uuidgen
在取消挂载后,可以使用新的 UUID
号。
tune2fs -U "`uuidgen`"
在 CentOS 7 及以上,这时由于分区的 UUID
进行了修改,而在 fstab
文件中数据没有修改,此时如果重启系统,就会出现一些警告信息。这时可以输入 root 密码进入系统,可以先对文件的相应行进行注释(这时的挂载时可读写的)。然后重启后进行修改。
在 CentOS 6 中,如果由于 fstab
配置有误,就会造成除了根目录以外的其它目录都不能正常挂载。进入系统后,通过 cat /proc/mounts
才能显示出根目录的挂载选项时只读,因此不能对文件进行修改。此时需要 mount -o remount, rw /
,然后才能修改文件,把该分区配置行的最后项设置为 0
,或者注释该行,这时重启时就不会开机检查,可以正常开机,但是不能正常挂载此分区。
可以通过以下命令找出当前的分区 UUID。
blkid
注意:对于 loop
设备的挂载的配置,不能使用 UUID
来指明文件,因为文件太多,系统开机时不会去扫描非设备文件。这时只能使用完整路径来指定对应的文件。而分区内记录着该分区的 UUID
。
dd if=/dev/zero of=/data/disk.img bs=1M count=100
mkfs -t xfs /data/disk.img
mount /data/disk.img /mnt/disk
但是在 CentOS 6 中需要指明选项才能挂载这种 loop
文件。
mount -o loop /data/disk.img /mnt/disk
因此,在CentOS 6 中的 fstab
配置文件中需要指明选项 loop
。
在挂载普通目录时,配置文件中的文件系统类型需要指定为 none
,选项指定为 bind
。
示例:对于 loop
设备和目录挂载的配置写法。
/disk.img /data/disk xfs defaults 0 0
/etc /mnt/etc none bind 0 0
# CentOS 6
/disk.img /data/disk xfs defaults,loop 0 0
处理交换文件和分区
swap
交换分区是系统 RAM
的补充,swap
分区支持虚拟内存。
注意:为了优化性能,可以将 swap
分布存放,或者使用高性能磁盘。
使用以下命令可以查看内存的使用情况,包含 swap
的情况。
# CentOS 6
free -h
total used free shared buffers cached
Mem: 979M 279M 699M 244K 18M 161M
-/+ buffers/cache: 99M 879M
Swap: 2.0G 0B 2.0G
其中 ‘shared’ 表示共享,‘buffers’ 表示缓冲区,‘cached’ 表示缓存区。缓冲区是内存的一部分,这些空间用于缓冲输入和输出的数据。缓存区主要目的是把一些数据暂时保存起来,以便更快地读取。缓冲区就好像是生活中的各种排队,缓存区就好像是一些经常使用的资料放在手边,便于使用。真正占用的空间只有 ‘99M’。
# CentOS 7, 8
free
total used free shared buff/cache Available
Mem: 995748 124392 727892 7776 143464 724352
Swap: 2097148 0 2097148
官方推荐的系统 swap 空间大小:
RAM大小 | 推荐 swap 空间 | 允许休眠 swap 空间 |
---|---|---|
< 2GB | 2倍RAM | 3倍RAM |
2 ~ 8GB | 1倍RAM | 2倍RAM |
8 ~ 64GB | 4GB~0.5倍RAM | 1.5倍RAM |
> 64GB | 独立负载(至少4GB) | 不建议开启休眠 |
交换分区实现原理
- 创建交换分区或者文件
- 使用
mkswap
写入特殊的签名 - 在
/etc/fstab
文件中添加适当的配置 - 使用
swap -
激活交换空间
启用 swap
分区:
swapon [option]... [device]
选项:
-a # 激活所有的交换分区
-s # 查看当前交换分区的情况
-p PRIORITy # 指定优先级,也可以在 '/etc/fstab' 中的第 4 列指定 'pri=value'
禁用 swap 分区:
swapoff [option]... [device]
可以使用以下命令查看交换分区的情况:
lsblk -f
如果想要增加交换分区空间,可以使用 fdisk /dev/sdc
创建新的分区,调整分区类型为 82,并使用 mkswap
创建对应的分区的文件系统,加入其中即可 swapon -a
。想要永久有效,需要在 fstab
中新增一条记录。
类似于:
vim /etc/fstab
# 修改对应的记录
UUID=3929929-cd... swap swap defaults 0 0
# 并入新增的交换分区
swapon -a
查看交换分区的情况
swapon -s
# 等价于
cat /proc/swaps
如果使用的机械硬盘,最好使用新的硬盘的第一个分区,其速度要快点。当然,最好使用固态硬盘。
也可以使用文件当成交换分区
dd if=/dev/zero of=/data/swap.img bs=1G count=1
chmod 600 /data/swap.img
mkswap /data/swap.img
swapon -a
当然,也可以在 /etc/fstab
进行配置,但是第一项需要使用完整文件名。
使用这种文件当成分区,由于访问时需要进过文件所在的分区,效率比直接使用交换分区慢。
swap 优先级
swap
的优先级取值范围为:0 ~ 32767,值越大优先级越高。
如果用户没有指定优先级,则核心自动给 swap 指定一个优先级,其值从 -1
开始,每增加一个自动分配的优先级的交换分区,其优先级减去 1
。
想要修改已经设置好的优先级,可以修改配置文件,在选项位置进行配置:
类似于:
vim /etc/fstab
# 修改对应的记录
/dev/sdc1 swap swap pri=10 0 0
# 禁用对应的分区
swapoff /dev/sdc1
# 激活所有交换分区
swapon -a
# 查看
swapon -s
swap 的使用策略
/proc/sys/swappiness
的值决定了内存被使用了一定的百分比例时,就会启用 swap 分区。
这个值在不同的版本中可能不一样,在 CentOS 8 中:
]# cat /proc/sys/swappiness
30
这个值含义是:使用内存达到 100-30=70% 时候,就开始使用交换分区。如果设置为 0,则会最大限度不使用交换分区,必要时还是要使用的。
修改的方法是:
]# echo 0 > /proc/sys/swappiness
0
一般来说,实际工作中虚拟机上的服务器不使用交换分区。
移动介质
所有的移动设备都需要经过挂载后才能使用,挂载点通常在 /media
或 /mnt
下,访问前必须要挂载,取出前,必须要卸载。
按照默认的设置,普通用户只能挂载的设备有:光盘、DVD、软盘、USB等。
使用光盘
在图形环境中,自动启动挂载于 /run/media/<user>/<label>
。
如果系统中已经安装了 autofs
包,并启用该服务,而光盘已经连接,则访问 /misc/cd
时,会自动挂载光盘,不访问时不挂载。
手工挂载使用以下命令,不同版本的光盘表示不一样,而 /dev/cdrom
是一个软连接:
mount -r /dev/cdrom /mnt
操作光盘:
eject # 弹出光盘
eject -t # 吸入光盘
# 下载的iso镜像,可以挂载后使用
mount -r xxx.iso /mnt # 如果 CentOS 6 需要加 选项 -o loop
创建 ISO 文件:
cp /dev/cdrom /data/CentOS8.iso
# 也可以
mkisofs -r -o /data/etc.iso /etc
刻录光盘:
wodim -v -eject CentOS8.iso
USB 介质
查看 USB 设备是否识别,可能需要安装 usbutils
:
lsusb
内核自动探测 SCSI 设备,一般指定成 /dev/sda#, /dev/sdb#
或类似的设备文件。在图形环境中自动挂载于 /run/media/<user>/<label>
。
手动挂载:
mount /dev/sdx# /mnt
如果在 windows 中的虚拟机上的 Linux 设别插入的优盘,可能需要在虚拟机右下角右键点击相应的图标。但是默认 Linux 不能设别 ‘NTFS’ 格式,如果想要通用,可以把优盘格式化为 ‘vfat’,可能需要安装 ‘dosfstools’ 包。
如果想要取出优盘,可以使用以下命令,确保数据都写入:
dnf -y install dosfstools
mkfs.vfat /dev/sdd1
mount /dev/sdd1 /mnt
# 取出前确保缓存数据写入
sync
sync
umount /mnt
硬件使用会留下日志:
tail -f /var/log/messages
dmesg
磁盘常见工具
文件系统空间占用信息的查看工具 df
df [option]... [FILE]...
常见选项:
-H # 以 10 为单位
-T # 文件系统类型
-h # 更友好的大小
-i # 显示 inode 信息
-p # 以 posix 兼容的格式输出,显示更整齐,特别是有些行比较长时
也可以使用
lsblk -f
查看目录占用空间信息 du
du [option]... DIR
常用选项:
-h # 更友好的大小单位
-s # 统计值 summary
--max-depth=N # 指定最大目录层级N
工具 dd
格式:
dd if=/path/to/SRC of=/path/to/DEST bs=N1 count=N2
常用选项:
if=file # 从 'file' 中读取
of=file # 数据写到指定的文件中
ibs=size # 一次性读入 'size' 大小字节
obs=size # 一次写入 'size' 大小字节
bs=size # 指定块大小
cbs=size # 一次转化 'size' 大小字节
skip=blocks # 源文件中跳过指定额块大小
seek=blocks # 目标文件中搜索跳过的指定位置
count=Number # 复制 'Number' 个 'bs'
conv=conversion[, conversion...] # 使用指定的参数转换文件
conversion 转换参数:
ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 至 EBCDIC
lcase 转换为小写字符
ucase 转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截断输出文件
sync 把每个输入块填充到 ibs 字节中,不足部分使用空(NUL)字符补齐
fdatasync 在写完成前,物理写入输出文件
示例:
-
备份 sdx 整盘备份到 sdy:
dd if=/dev/sdx of=/dev/sdy
-
将 sdx 整盘数据备份到指定的文件中:
dd if=/dev/sdx of=/path/to/image
-
备份并压缩全盘数据
dd if=/dev/sdx | gzip > /path/to/image.gz
-
将备份文件恢复到指定磁盘
dd if=/path/to/image of=/dev/sdx gzip -dc /path/to/image.gz | dd of=/dev/sdx
-
拷贝光盘数据至指定的目录下,并保存为
cdrom.iso
文件dd if=/dev/cdrom of=/root/cdrom.iso
-
销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1 # 或者 dd if=/dev/zero of=/dev/sda1
-
通过比较执行时间,确定系统最佳的
block size
大小dd if=/dev/zero of=/root/1GB.file bs=1024 count=1000000 dd if=/dev/zero of=/root/1GB.file bs=2048 count=500000 dd if=/dev/zero of=/root/1GB.file bs=4096 count=250000
-
测试硬盘写速度
dd if=/dev/zero of=/root/1GB.file bs=1024 count=1000000
-
测试硬盘度速度
dd if=/root/1GB.file bs=64k | dd of=/dev/null