1, 磁盘结构
设备文件: 关联至一个设备驱动程序, 进而能够与之对应硬件设备进行通信
I/O Ports:I/O 设备地址
一切皆文件: open(),read(),write(),close()
设备类型:
块设备: block, 存取单位 "块", 磁盘, 支持缓存
字符设备: char, 存取单位 "字符", 键盘
设备号码:
主设备号: major number, 标识设备类型
次设备号: minor number, 表示同一类型下的不同设备
磁盘设备的设备文件命名:/dev/dev_file
SCSI,SATA,SAS,IDE,USB:/dev/sd
虚拟磁盘:/dev/vd(kvm 技术),/dev/xvd(xen 技术)
不同磁盘标识: a-z,aa,bb...
/dev/sda,/dev/sdb...
同一设备上的不同分区: 1,2...
/dev/sda1,/dev/sda5
硬盘存储术语:
head: 磁头
track: 磁道
cylinder: 柱面
sector: 扇区
# cat /sys/block/sda/queue/rotational # 1 为机械硬盘, 0 为固态硬盘(针对于直接在物理机上装的 Linux 可以测, 虚拟机没用)
硬盘存放单位: CHS(磁盘三围)
每个盘片对应一个磁头(head), 每个盘片被化成多个同心圆(track/cylinder), 每个同心圆被切断成多个扇区(sector). 磁盘存储最小单位是 sector
采用 24bit 位寻址, 其中前 10 位表示 cylinder(柱面), 中间 8 位表示 head(磁头), 后面 6 位表示 sector(扇区), 最大寻址空间 8GB.
LBA ( logical block addressing )
LBA 是一个整数, 通过转换成 CHS 格式完成磁盘具体寻址.
ATA-1 规范中定义了 28 位寻址模式, 以每扇区 512 位组来计算, ATA-1 所定义的 28 位 LBA 上限达到 128 GiB.2002 年 ATA-6 规范采用 48 位 LBA, 同样以每扇区 512 位组计算容量上限可达 128 Petabytes.
由于 CHS 寻址方式的寻址空间在大概 8GB 以内, 所以在磁盘容量小于大概 8GB 时, 可以使用 CHS 寻址方式或是 LBA 寻址方式, 在磁盘容量大于大概 8GB 时, 则只能使用 LBA 寻址方式.
2, MBR 和 GPT 分区管理
2.1 为什么分区 优化 I/O 性能, 实现磁盘空间配额限制, 提高修复速度, 隔离系统和程序, 安装多个 OS, 采用不同文件系统
2.2 分区
两种分区方式: MBR,GPT
1> MBR:Master Boot Record 主引导记录, 1982 年, 使用 32 位表示扇区数, 分区不超过 2T
如何分区: 按柱面
0 磁道 0 扇区: 512bytes, 不属于任何分区(存取分区元数据)
446bytes:boot loader(主引导程序)
64bytes: 分区表, 其中每 16bytes 标识一个分区
2bytes:55AA(标记位), 没有 55AA 标记位, 认为没有分区
MBR 分区中一块硬盘最多有 4 个主分区, 也可以 3 主分区 + 1 扩展(N 个逻辑分区)
# hexdump -C -n 512 /dev/sda # 查看 sda 硬盘的前 512 字节
MBR 分区结构:
硬盘主引导记录 MBR 由 4 个部分组成:
主引 | 导程序, 偏移地址 0000H--0088H , 它负责从活动分区中装载, 并运行系统引导程序;
出错信息数据区, 偏移地址 0089H--00E1H 为出错信息, 00E2H--01BDH 全为 0 字节;
分区表 (DPT,Disk Partitioln Table) 含 4 个分区项, 偏移地址 01BEH--01FDH, 每个分区表项长 16 个字节, 共 64 字节为分区项 1, 分区项 2, 分区项 3, 分区项 4;
结束标志字, 偏移地址 01FE--01FF 的 2 个字节值为结束标志 55AA.
备份分区表:
- # hexdump -C -n 512 /dev/sda # 查看 sda 硬盘的前 512 字节
- # dd if=/dev/sda of=/data/dpt bs=1 count=66 skip=446 # 备份分区表(skip 表示跳过 if,seek 跳过 of)
- # hexdump -C /data/dpt # 查看备份分区表
- # dd if=/dev/zero of=/dev/sda bs=1 count=2 seek=510 # 将 55aa 位清空, 模拟破坏分区表
- # hexdump -C -n 512 /dev/sda # 查看 sda 硬盘的前 512 字节, 发现已经更改
- # fdisk -l /dev/sda # 查看硬盘分区信息
- # lsblk # 查看内存分区表
- dd if=/data/dpt of=/dev/sda bs=1 count=2 skip=64 seek=510 # 恢复 55aa 位
2> GPT 分区:
GPT:GUID ( Globals Unique Identifiers ) partition table 支持 128 个分区, 使用 64 位, 支持 8Z ( 512Byte/block ) 64Z ( 4096Byte/block )
使用 128 位 UUID(Universally Unique Identifier)表示磁盘和分区 GPT 分区表, 自动备份在头和尾两份, 并有 CRC 校验位 uuidgen, 生成 UUID.
UEFI (Unified Extensible Firmware Interface 统一可扩展固件接口)硬件支持 GPT, 使操作系统启动.
BIOS+MBR 和 UEFI+GPT:
2.3 管理分区
列出块设备: lsblk
创建分区使用:
fdisk 创建 MBR 分区
gdisk 创建 GPT 分区
parted 高级分区操作
重新设置内存中的内核分区表版本
Partprobe
添加硬盘, 创建分区:
不重启电脑识别新添加的硬盘(echo '- - -'> /sys/class/scsi_host/host2/scan)
- [root@centos6 ~]# lsblk
- NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
- sr0 11:0 1 4.2G 0 rom
- sda 8:0 0 20G 0 disk
- [root@centos6 ~]# echo '- - -'> /sys/class/scsi_host/host2/scan # 触发磁盘扫描
- [root@centos6 ~]# lsblk # 列出所有可用块设备的信息
- NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
- sr0 11:0 1 4.2G 0 rom
- sda 8:0 0 20G 0 disk
- sdb 8:16 0 20G 0 disk
parted 命令: parted 的操作都是实时生效的, 小心使用
用法: parted [选项]...[设备 [命令 [参数]...]]
- parted /dev/sdb mklabel gpt|msdos # 创建 GPT 或 MBR 分区
- parted /dev/sdb print # 打印分区表
- parted /dev/sdb mkpart primary 1 200(默认 M) # mkpart: 分区; primary: 全是主分区; 起始点和结束点(默认 M)
- parted /dev/sdb rm 1 # 删除分区
- parted -l # 列出分区信息
分区工具 fdisk 和 gdisk
分别为 MBR 和 GPT 格式的分区工具
# 子命令:
p 列出分区列表
t 更改分区类型(默认 83,swap 82)
n 创建新分区
d 删除分区
v 校验分区
u 转换单位 fdisk -u=cylinders /dev/sdb(更改为以扇区分区)
w 保存并退出
q 不保存退出
- # 查看分区的方式:
- cat /proc/partitions
- lsblk
- fdisk -l /dev/sdb # 看到的是真正硬盘的分区表, 其他三项看的是内存
- ll /dev/sdb*
划分分区, 更改分区要同步信息到硬盘:(新硬盘分区不会有, 旧硬盘更改分区注意 warning)
- centos6:
- partx -a /dev/sda # 增加分区
- partx -d --nr 6 /dev/sda # 删除分区
- centos5,7:
- partprobe
使用 dd 命令克隆分区表(只能克隆主分区, 扩展分区, 逻辑分区不能克隆)
使用 dd 命令清空硬盘标记位
数字越小, 在越外圈, 可以提高优化!
3, 管理文件系统
3.1 文件系统
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构, 即在存储设备上组织文件的方法. 操作系统中负责管理和存储文件信息的软件结构称为文件管理系统, 简称文件系统.
从系统角度来看, 文件系统是对文件存储设备的空间进行组织和分配, 负责文件存储并对存入的文件进行保护和检索的系统. 具体地说, 它负责为用户建立文件, 存入, 读出, 修改, 转储文件, 控制文件的存取, 安全控制, 日志, 压缩, 加密等.
3.2 Linux 文件系统类型:
支持的文件系统:
- /lib/modules/`uname -r`/kernel/fs
- df -T # 查看文件系统类型
ext2: 适用于那些分区容量不是太大, 更新也不频繁的情况, 例如 /boot 分区;
ext3: 是 ext2 的改进版本, 其支持日志功能, 能够帮助系统从非正常关机导致的异常中恢复. 它通常被用作通用的文件系统;
ext4: 是 ext 文件系统的最新版. 提供了很多新的特性, 包括纳秒级时间戳, 创建和使用巨型文件(16TB), 最大 1EB 的文件系统, 以及速度的提升;
SGI 的 xfs: 支持最大 8EB 的文件系统.
其他文件系统: btrfs ( Oracle ),reiserfs,jfs ( AIX ),swap
光盘: iso9660
- Windows:FAT32,exFAT,NTFS
- Unix:FFS ( fast ),UFS ( unix ),JFS2
网络文件系统: NFS,CIFS
集群文件系统: GFS2,OCFS2 ( oracle )
分布式文件系统: fastdfs,ceph,moosefs,mogilefs,glusterfs,Lustre
RAW: 未经处理或者未经格式化产生的文件系统
3.3 创建文件系统
文件系统分类:
根据是否支持 "journal" 日志功能:
日志型文件系统: ext3,ext4,xfs...
非日志型文件系统: ext2,vfat
文件系统的组成部分:
内核中的模块: ext4,xfs,vfat
用户空间的管理工具: mkfs.ext4,mkfs.xfs,mkfs.vfat
Linux 的虚拟文件系统: VFS
间接的访问各个文件系统
查看支持的文件系统: cat /proc/filesystems
创建文件系统:
mkfs 命令:
mkfs.[ext3|ext4|xfs...] /dev/device
例:
- mkfs.xfs /dev/sdb1 # 将 / dev/sdb1 创建为 xfs 的文件系统格式
- mkfs -t [ext3|ext4|xfs...] /dev/device
- -L 'LABEL' # 设定卷标名
- blkid /dev/device # 查看文件系统类型
创建 ext 文件系统:
mke2fs:ext 系列文件系统专用管理工具
-t [ext2|ext3|ext4] 指定文件系统类型
-b [1024|2048|4096] 指定块大小为 1K,2K,4K
每创建一个文件不论大小以块为单位分配
-L 'LABEL' 设置卷标名
-f 重新格式化
-j 相当于 -t ext3
mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i 为数据空间中每多少个字节创建一个 inode, 不应该小于 block 大小
-N 指定分区中创建多少个 inode
-I 一个 inode 记录占用的磁盘空间大小, 128-4096
-m 指定为管理员预留的空间, 默认为 5%
-O FEATURE 启用指定特性
-O ^FEATURE 关闭指定特性
把连续的块组合成组, 每个组有自己节点表
- findfs UUID=XXX
- findfs LABEL=XXX
- fsck.FS_TYPE
- fsck -t FS_TYPE
- /etc/mtab # 挂载信息实时更新
- mount -L 'LACEL' /mnt/sdb1 # 以卷标的方式挂载
- mount -U 'UUID' # 以 UUID 挂载
- losetup -a # 显示 loop 设备分配
- ls /dev/loop* # 显示 loop 设备
- # yum install psmisc -y # 安装 fuser
- # fuser -v /mnt/sdb1 # 查看谁正在使用该文件夹, 请进一步了解 fuser 命令的用法
- /mnt/sdb1: root kernel mount /mnt/sdb1
- root 1245 ..c.. bash
- # fuser -km /mnt/sdb1 # 强制杀掉该目录使用的用户进程
- # findmnt /mnt/sdb1 # df 显示不了隐藏的挂载, 使用 findmnt 查询该目录是否为挂载点
- # 查看正在访问指定文件系统的进程:
- # lsof /boot # 也能看到是否有人使用该目录(挂载点)
- # fuser -v /mnt/sdb1 # 也可以
- # 终止所有正在指定的文件系统的进程:
- # fuser -km /mnt/sdb1
- 4.swapon -a # 使 swap 格式配置文件生效
- 5.swapon -s # 相当于 cat /proc/swaps, 查看 swap 分区信息
- swapoff /dev/sdc1 # 关闭 swapon -a 开启
- free -h # 查看内存和 swap 信息
- # cp /dev/cdrom /root/CentOS.iso
- # mkisofs -r -o /root/etc.iso /etc # / 将 / etc 目录打包成 iso 文件
- # lsusb # 查看 USB 设备是否识别
- # lsmod # 查看正在使用的内核
- -h human-readable
- -i inodes instead of blocks
- du [OPTION]... DIR
- -h human-readble
- -s summary
- -max-depth=# 指定最大目录层级
- echo {
- 0..9
- } | tr -d ' '> /test/f1.txt
- echo {
- a..z
- } | tr -d ' '> /test/f2.txt
- dd if=/test/f1.txt of=/test/f2.txt bs=1 skip=2 seek=3 count=4
- cat /test/f2.txt
- abc2345 # 默认截断之后的数, 要想不截断使用 conv
- echo {
- a..z
- } | tr -d ' '> /test/f2.txt
- dd if=/test/f1.txt of=/test/f2.txt bs=1 skip=2 seek=3 count=4 conv=notrunc
- cat /test/f2.txt
- abc2345hijklmnopqrstuvwxyz
- # 使用 dd 命令备份 MBR 分区表:
- # dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
- # 破坏 MBR 中的 bootloader
- # dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
- # 备份:
- # dd if=/dev/sdx of=/dev/sdy # 将本地的 / dev/sdx 整盘备份到 / dev/sdy
- # dd if=/dev/sdx of=/path/to/image # 将 / dev/sdx 全盘数据备份到指定路径的 image 文件
- # dd if=/dev/sdx | gzip> /path/to/image.gz # 备份 / dev/sdx 全盘数据, 并利用 gzip 压缩, 保存到指定路径
- # 恢复:
- # dd if=/path/to/image of=/dev/sdx # 将备份文件恢复到指定盘
- # gzip -dc /path/to/image.gz | dd of=/dev/sdx # 将压缩的备份文件恢复到指定盘
- # 拷贝内存资料到硬盘
- # dd if= /dev/mem of=/root/mem.bin bs= 1024 # 将内存里的数据拷贝到 root 目录下的 mem.bin 文件
- # 从光盘拷贝 iso 镜像
- dd if= /dev/cdrom of=/root/cd.iso # 拷贝光盘数据到 root 文件夹下, 并保存为 cd.iso 文件
- # 销毁磁盘数据
- dd if=/dev/urandom of=/dev/sda1
来源: https://www.cnblogs.com/zyybky/p/12797430.html