在 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/sda12 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: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: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 采用了 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 [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'
从 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 常用文件系统
Windsows 常用文件系统
Unix
网络文件系统
集群文件系统
分布式文件系统
创建文件系统的工具:
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]
常用选项:
e2label: 管理 ext 系列文件系统的标签
e2label DEVICE [LABEL]
findfs:查找分区
findfs [options] LABEL=
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 [-fnrsvw] [-t vfstype] [-o options] device mountpoint
/dev/sda5-L 'LABEL'-U UUIDproc, sysfs, devtmpfs, configfsmountpoint:挂载点即目录必须事先存在,建议使用空目录
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 # readonlyrw # 读写,默认启用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, 73729Allocating 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 以后,则没有限制,实时生成,编号自增。
取消挂载时,可使用设备,也可以使用挂载点。注意,如果在对应的设备内部,这时不能取消挂载该设备,需要离开后才能操作。如果自己不在里面,也显示 ‘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="",UUID UUID=""
伪文件系统名称: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 -htotal 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
freetotal used free shared buff/cache Available
Mem: 995748 124392 727892 7776 143464 724352
Swap: 2097148 0 2097148
<++>
上一篇:教育部新增24种本科专业,文科只有5个,学生:张雪峰诚不欺我 教育部新增24种本科专业,文科只有5个,学生:张雪峰诚不欺我
下一篇:18年产学研融合打造国产量子点液态芯片,上海交大发布这项成果 18年产学研融合打造国产量子点液态芯片,上海交大发布这项成果