磁盘类型和相关术语学习笔记

2023-11-18

磁盘类型和相关术语


在 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 小,则指定更小的块大小。

查看和管理分区信息
  1. blkid 可以查看块设备的属性信息

    blkid [option]...[device]
    

    常用选项:

    • -U UUID # 根据指定的 UUID 来查看对应的设备
    • -L LABEL # 根据指定的 LABEL 来查看对应的设备
  2. e2label: 管理 ext 系列文件系统的标签

    e2label DEVICE [LABEL]
    
  3. findfs:查找分区

findfs [options] LABEL=<label>
findfs [options] UUID=<uuid>
  1. tune2fs: 重新设定 ext 系列文件系统可调整的参数值

    常用选项:

    -l         # 查看指定文件系统超级块(super block)信息
    -L 'LABEL' # 修改卷标
    -m #       # 修改预留给管理员的空间百分比
    -j         # 将 ext2 升级为 ext3
    -O         # 文件系统属性启用或禁用,例如,'-O ^has_journal'
    -o         # 调整文件系统的默认挂载选项,例如,'-o ^acl'
    -U UUID    # 修改 UUID 的值
    
  2. dumpe2fs:显示 ext 文件系统信息,将磁盘块分组管理

    常用选项:

    -h # 查看超级块信息,不显示分组信息

  3. xfs_ifo:显示挂载或已挂载的 xfs 文件系统信息

    xfs_ifo mountpoint | devname
    

在 CentOS 6 上默认创建文件系统时,有些特性没有指定,例如,acl 默认没有。

文件系统检测和修复

文件系统故障常发生于死机或者非正常关机之后,文件系统被标记为 “no clean”。

注意:一定不要在挂载状态下执行以下命令进行修复。

  1. fsck:File System Check。注意文件类型要与实际的文件系统一致。

    fsck.FS_TYPE
    fsck -t FS_TYPE
    

    常用选项:

    -a           # 自动修复
    -r           # 交互式修复错误
    
  2. e2fsck:ext 系列文件专用的检测修复工具

    -y          # 自动回答为 yes
    -f          # 强制修复
    -p          # 自动进行安全的修复文件系统问题
    
  3. xfs_repair:xfs 文件系统专用的检测修复工具

    -f          # 修复文件
    -n          # 只检查
    -d          # 允许修复只读的挂载设备,在单用户下修复 '/' 时使用,然后使用 reboot
    

    单用户说明设备不会有其他人使用。并且根目录 / 不能取消挂载。

挂载

分区创建文件系统后需要挂载才能访问。与 windows 不一样的是,Linux 只有一个根,因此需要挂载。

挂载点(mountpoint)就是一个目录,但是如果该目录已有文件在其中,如果进行了挂载,挂载后这些文件就看不到了,只有在取消挂载后才会出现。

同一个设备可以挂载在不同的目录,好像是一个房间有几个门一样,可以使用 mount 命令可见这两个挂载,在 df, lsblk 中不可见第二个挂载。

如果一个挂载点挂载了两个设备,则这个挂载点只能访问第二个挂载的设备。虽然在 mount 命令中可以看到两次挂载。此时,如果把第二个挂载取消,这时第一个挂载就能起作用。

mount 命令

mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint
  1. device:指明要挂载的设备
  • 设备文件:例如,/dev/sda5
  • 卷标 :-L 'LABEL'
  • UUID :-U UUID
  • 伪文件系统名称:proc, sysfs, devtmpfs, configfs
  1. mountpoint:挂载点即目录必须事先存在,建议使用空目录

  2. 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 项内容。

  1. 挂载的设备或伪文件系统

    设备文件可以使用,便签 LABEL="",UUID UUID=""
    伪文件系统名称:proc, sysfs

  2. 挂载点:必须事先存在的目录

  3. 文件系统类型:ext4, xfs, iso9660, nfs, none

  4. 挂载选项:defaults, acl, bind

  5. 转储频率:0 表示不做备份, 1 表示每天转储, 2 表示隔天转储

  6. 该选项用于 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) 不建议开启休眠
交换分区实现原理
  1. 创建交换分区或者文件
  2. 使用 mkswap 写入特殊的签名
  3. /etc/fstab 文件中添加适当的配置
  4. 使用 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
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

磁盘类型和相关术语学习笔记 的相关文章

  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数

随机推荐

  • double类型精度丢失问题以及解决方法

    double类型精度丢失问题 1 加法运算 public static void main String args double number1 1 double number2 20 2 double number3 300 03 dou
  • arcgis for android 学习 - (5) 在地图指定位置添加“标记“,并尝试选中它

    我做一个例子 1 首先显示一个地图 2 点击 添加要素 按钮后再次点击地图 将会在地图上添加 红色的位置标记 3 再次点击按钮后 这时 就可以点击刚刚添加的 红色的位置标记 就可以查看到 该标记关联到得属性值 布局
  • NO.17 浅谈共识机制(POW、POS、DPOS、PBFT、POP)

    区块链是一种去中心化的分布式账本 可以简单理解为分布在全球各个节点的分布式数据库 数据库由区块按时间顺序相连而成 区块中记录的是数笔交易 为了能支持这一套系统的运行 需要各节点矿工的参与 他们参与的主要原因是因为有奖励 奖励可以去交易所换成
  • kafka消费者客户端线程安全以及多线程实现并发读取消息

    kafka的生产者客户端Producer是线程安全的 但是消费者客户端是非线程安全的 每次操作时都会调用accqure方法用来确定当前只有一个线程操作 如果有多个线程在操作 会抛出CME异常 针对这种情况 为了能够多线程更快速的读取消息 可
  • 【Python 1-17】Python手把手教程之——文件的读写以及I/O操作

    作者 弗拉德 来源 弗拉德 公众号 fulade me 从文件中读取数据 文本文件可存储的数据量很多 每当需要分析或修改存储在文件中的信息时 读取文件都很有用 对数据分析应用程序来说尤其 如此 例如 你可以编写一个这样的程序 读取一个文本文
  • 研发人员欠缺的“不要脸”文化

    一直感觉研发人员相对市场人员确实缺少点什么 今天听到一个原华为的人说华为的文化中有一个 不要脸 文化 讲的就是研发人员要特别注意的事项 特别说明 不要脸 三个字 据说是任正非认为这样好记 才取得名字 这三点是 抬头看路 找人问路 请人带路
  • 由先序中序,或后序中序,可以唯一确定二叉树;完全二叉树的顺序存储,c/c++描述

    这是课本里的 两个定理 由先序 根左右 后序 左右根 可以确定根节点是哪个 由中序 左根右 可以确定左子树和右子树的范围 所以我们也找到了二叉树的左子树和右子树的先序 或后序 和中序排列 由归纳法 可得出这个构造二叉树链表的方法 对于完全二
  • loadrunner负载生成器;

    负载生成器 Load Generators 是脚本生成的负载引擎 相当于加压机 主要功能是生成虚拟用户进行负载 在默认的情况下使用本地的负载生成器来运行脚本 但是每生成一个虚拟用户 需要话费负载生成器大约2M 3M的内存空间 通常运行CON
  • java8有哪些jvm参数

    Java8中的JVM参数有很多种 这里列出一些常用的 server 指定JVM运行在服务器模式 在服务器环境下性能会更好 Xmx 设置JVM最大可用内存 Xms 设置JVM初始内存 XX PermSize 设置持久代 Perm Gen 的初
  • Python常用库大全

    作者 史豹 链接 https www zhihu com question 20501628 answer 223340838 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 环境管理 管理 Python 版
  • Visual Studio 2017 远程调试器(MSVSMON.EXE) 找不到连接

    Visual Studio 2017 远程调试器 MSVSMON EXE 找不到连接 用的是wifi上网 而远程主机是有线连接 经过几个小时的排查 终于发现不在一个网段内 把wifi改成有线 确保和远程主机在一个网段内 就可以联上了
  • 【node】12、Koa实现简单爬虫案例

    效果图如下 首先我们新建文件夹 进入终端 初始化node项目 npm init y 安装koa搭建服务模块 npm install koa 安装superagent发送请求模块 npm install superagent 安装cheeri
  • 有关Proteus安装时的一些报错

    在安装Proteus的之后 使用的时候经常会出现 已使用符号sMKRORIGIN但未在库中找到 或者许多找不到文件在哪里的一些许多错误 我也是经常遇到 然后也是一点一点找资料解决 有时候这种方法能够解决 有时候又不能解决 确实很让人头疼 所
  • java: MySQL Metadata

    https www baeldung com jdbc database metadata https docs oracle com en java javase 11 docs api java sql java sql Databas
  • ant design pro v5 配置拦截器,header

    ant design pro v5 配置拦截器 header 1 资料文档 https umijs org zh CN plugins plugin request requestinterceptors 2 编写app tsx 我这里是自
  • 创建一个空的Git仓库,然后本地代码推上去

    这篇文章说的是如何将本地代码库推送到远端空的代码仓库 如需了解如何从远端代码仓库克隆代码到本地 看这里 1 创建代码仓库 2 终端进入本地代码库文件夹内 3 将本地和远端联系起来 并给远端起个名字 git remote add myOwnC
  • Hudi和Kudu的比较

    与Kudu相比 Kudu是一个支持OLTP workload的数据存储系统 而Hudi的设计目标是基于Hadoop兼容的文件系统 如HDFS S3等 重度依赖Spark的数据处理能力来实现增量处理和丰富的查询能力 Hudi支持Increme
  • 微信小程序WE分析----事件分析

    目录 web分析 小程序 事件分析概述 1 新增事件管理 事件参数说明 1 填写事件配置 2 小程序添加上报代码 将上报代码添加到小程序中 3 测试事件数据上报 测试事件上报的数据是否正确 属性管理 字典管理 新增事件分析 创建事件分析 添
  • Web自动化之Selenium常用操作

    本文总结使用selenium进行web UI自动化时 会用到的一些常用操作 定位元素 driver find element by xpath 1 绝对路径 2 元素属性 3 层级和属性结合 4 使用逻辑运算符 driver find el
  • 磁盘类型和相关术语学习笔记

    磁盘类型和相关术语 在 Linux 中一切皆文件 但是类型不同 例如使用 ls l 对于设备文件和普通文件有一部分内容是不同的 即普通文件有大小 而设备文件有主设备号和次设备号 没有大小 ll 1 txt dev sda dev sda1