块设备:block 存取单位“块” 磁盘
字符设备:char 存取单位“字符” 键盘
设备文件:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信
只有元数据,没有数据
设备号码
主设备 :major number 标识设备类型
次设备:minor number 标识同一类型下的不同设备
硬盘接口类型:数据交换能力
并口:
IDE :33MB/S (接口速率)
SCSI :640MB/S
串口:
SATA:6Gbps
SAS:6Gbps
USB : 480MB/s
磁盘设备的设备文件命名:
IDE: /dev/hd
SCSI,SATA,SAS,USB :/dev/sd
不同设备:a-z
/dev/sda ,/dev/sdb....
同一哦设备上的不同分区:1,2,3....
/dev/sda1 , /dev/sda5
1.磁盘的基础知识
1.1机械硬盘(HDD:Hard Disk Drive)
机械硬盘由多块盘片组成,它们都绕着主轴旋转。每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小。在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据。
所有的盘片都是同时同步转动,所有的磁头也是同步移动。
磁盘在物理上划分了扇区、磁道和柱面。如果划分了分区,则分区是逻辑上柱面的分隔边界。
读写磁头在停止状态下,在盘片旋转时磁头扫过的一圈轨迹称为磁道,所有的磁道都是同心圆。从盘片外圈开始向内数,磁道号从0开始逐数增加。
每个磁道以512字节等分为多个弧段。所以外圈磁道的扇区数较多,内圈磁道的扇区数较少,有些硬盘参数上写的磁道扇区数通常用一个范围来标识,如373-768表示最外圈磁道有768个扇区,最内圈有373个扇区,这就可以计算出每个磁道的字节数。
每个扇区512字节,扇区是磁盘控制器的最小读写单元。
盘片同步旋转,转动一个角度,外圈比内圈的线速度更快,磁头能够扫过的扇区数更多,因此读写越外圈磁道中的数据比越内圈更快。
向磁盘写数据是从外圈柱面向内圈柱面写的,只有写完一个柱面才写下一个柱面。因此磁盘用过一段时间后存储东西的速度会有所减慢就是因为外圈柱面已经用掉了。
1.2分区
分区是为了在逻辑上将某些柱面隔开形成边界。它是以柱面为单位来划分的,首先划分外圈柱面,然后不断向内划分。
由于读写越外圈磁道中的数据比越内圈更快,所以第一个分区在读写性能上比后面的分区更好。在Windows操作系统上,C盘的速度是最快的,越后面的区越慢就是这个原因。
在磁盘数据量非常大的情况下,划分分区的好处是扫描块位图等更快速:不用再扫描整块磁盘的块位图,只需扫描对应分区的块位图。
1.3 MBR分区方法
MBR:主引导记录(Master Boot Record),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区.由于这一扇区承担有不同于磁盘上其他普通存储空间的特殊管理职能,作为管理整个磁盘空间的一个特殊空间,它不属于磁盘上的任何分区,因而分区空间内的格式化命令不能清除主引导记录的任何信息。主引导扇区由三个部分组成(共占用512个字节):
- 主引导程序即主引导记录(MBR)(bootloader,占446个字节):可在FDISK程序中找到,它用于硬盘启动时将系统控制转给用户指定的并在分区表中登记了的某个操作系统。
- 磁盘分区表项(DPT,Disk Partition Table):由四个分区表项构成(每16个字节标识一个分区)。
- 结束标志(占2个字节):AA55
在Linux中,MBR格式的磁盘主分区号从1-4,扩展分区号从2-4,逻辑分区5+;
MBR最大支持2T(32位表示扇区,2^32*512)。
hexdump -C /dev/sda -n512 # 查看sda硬盘的前512个字节
dd if=/dev/sda of=/data/MBR_bak bs=1 count=512 # 备份sda这块银盘的前512字节至/data/MBR_bak文件
1.4 GPT分区
GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)
2.分区命令:
小技巧: 对于在vmare 下直接添加的硬盘,在不重启机器的情况下通过fdisk -l或lsblk都无法识别刚刚新加的硬盘,我们可以通过这条命令来识别刚刚添加的硬盘;
第一步:
ls /sys/class/scsi_host/
host0host1host2
第二步:
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan
第三步:
lsblk
fdisk -l # 即可看到刚刚添加的硬盘
2.1 fdisk 针对MBR分区
fdisk - manipulate disk partition table : 对于一块硬盘来讲,最多只能管理15个分区
如果一个存储设备已经分过区,那么它可能是mbr格式的,也可能是gpt格式的,如果已经是mbr格式的,则只能继续使用fdisk进行分区,
如果已经是gpt格式的,则只能使用gdisk进行分区。
使用fdisk分区,它只能实现MBR格式的分区
fdisk [选项] device
[root@CentOS7 ~]#fdisk /dev/sda
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command. # 改变将只保存在内存中,直到你作出决定
Command (m for help): m # m获取帮助
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition # 删除分区
g create a new empty GPT partition table # 创建一个新的GPT分区表
G create an IRIX (SGI) partition table
l list known partition types # 罗列各种分区类型(82 代表swap)
m print this menu # 显示帮助信息
n add a new partition # 添加一个新分区
o create a new empty DOS partition table
p print the partition table # 显示现有分区信息
q quit without saving changes # 仅退出,不保存
s create a new empty Sun disklabel
t change a partition's system id # 修改分区id
u change display/entry units
v verify the partition table
w write table to disk and exit # 保存并退出
x extra functionality (experts only) # 额外功能(仅限专家)
2.1.1、新建逻辑分区:(同样的操作可新建主分区)
[root@CentOS7 ~]#fdisk /dev/sda
Command (m for help): n # 新建分区
All primary partitions are in use
Adding logical partition 7 # 此处显示所有的主分区都在使用中,只能添加逻辑分区7
First sector (220209152-419430399, default 220209152): +5G # 一般直接回车,表示新建的分区从磁盘220209152-419430399哪个data block开始
Partition 7 of type Linux and of size 5 GiB is set
Command (m for help): w
The partition table has been altered!
通过fdisk -l
命令查看分区已经建好
分区结束,w保存退出。如果不保存,则按q退出。
因为上面的fdisk操作是在内存中执行的,w保存退出后,
2.1.2、系统内核是否已经识别新的分区:cat /proc/partition
2.1.3、所以要通过命令让内核识别分区,才能进行格式化:
CentOS 5:partprobe [device]
CentOS 6,7:
partx, kpartx
partx -a [device]-n M:N :指明从哪个分区编号到哪个分区结束
kpartx -af [device]
注意:如果是删除分区,我们也要同步,命令为:
partx -d --nr 1-2 /dev/sdb 表示同步删除/dev/sdb里的1-2分区
注意:一般分区完结尾出现“Syncing disks.” 则已经同步完成,不再需要执行partprobe
。
补充:
在用shell写脚本的过程中,如何新建分区:
echo -e "n\np\n\n\n+1G\nw\n" | fdisk /dev/sdc # 利用echo管道 在sdc建立一个1G的主分区;
# 第二种方法;
fdisk /dev/sdc << EOF #利用多行重定向输入
2.2 parted 分区工具
parted - a partition manipulation program
parted [options] [device [command [options...]...]]
parted支持mbr格式和gpt格式的磁盘分区。它的强大在于可以一步到位而不需要不断的交互式输入
parted [options] [device [command [options...]...]]
# option:
-l lists partition layout on all block devices ,显示全部块设备
# command [options...]...
print Display the partition table.
mkpart part-type [fs-type] start end
# Make a part-type partition for filesystem fs-type (if specified), beginning at start and ending at end (by default in megabytes). fs-type can be one of "btrfs", "ext2", "ext3", "ext4", "fat16", "fat32", "hfs", "hfs+", "linux-swap", "ntfs", "reiserfs", or "xfs". part-type should be one of "primary", "logical", or "extended".
示例:
parted /dev/sdc mkpart extended ext4 9666 12000 #表示将
3.文件系统,格式化
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统;
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等;
各种类型的文件系统:
Linux文件系统:ext2(Extended file system), ext3, ext4, xfs(SGI), 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:未经处理或者未经格式化产生的文件系统
文件系统的组成部分:
内核中的模块:ext4,xfs , vfat
用户空间的管理工具: mkfs ,ext4,mkfs , xfs , mkfs
格式化的过程就是创建文件系统的过程,可以使用mkfs(make filesystem)工具进行格式化,也可以使用该工具家族的其他工具如mkfs.ext4/mkfs.xfs等专门针对文件系统的工具。
查看当前系统支持的文件系统:cat /proc/filesystems
补充:
- buffer:缓冲器,在将数据写入磁盘前,数据是存放在buffer上的,然后再写入磁盘;buffer决定写入速度
- cache:缓存,cpu读取磁盘的数据是从cache中读取的,也就是说cache性能越好,读取磁盘数据越快;
3.1 mkfs命令
mkfs - build a Linux filesystem
该命令在制作ext系统文件格式时调用的是mke2fs
命令
mkfs [options] [-t type] [fs-options] device [size]
创建文件系统:
mkfs 命令:
(1) mkfs.FS_TYPE /dev/DEVICE
FS_TYPE : ext4 , xfs ,brtfs , vfat
e.g mkfs.ext4 /dev/sda5
(2) mkfs -t FS_TYPE -f -L /dev/device
-L 'Lable' : 指定卷标名
要查看支持的文件系统类型,只需简单的输入mkfs然后按两下tab键,就可以列出各文件系统对应的格式化命令,这些就是支持的文件系统类型:
CentOS 6:
[root@CentOS6 ~]#mkfs
mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.msdos mkfs.vfat
# # #
CentOS 7:
[root@CentOS7 ~]#mkfs
mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs
也可以直接
mkfs -t FS_TYPE /device # 确定格式化的文件类型
blkid 分区名称 : 显示该分区属性信息 (如果输入命名没有反应,说明没有还没有做文件系统)
3.2 mke2fs工具
mke2fs,是ext系列文件系统专用管理工具。该工具创建文件系统时,会从/etc/mke2fs.conf配置中读取默认的配置项。
mke2fs - create an ext2/ext3/ext4 filesystem
mke2fs [ -c | -l filename ] [ -b block-size ] [ -D ] [ -f fragment-size ] [ -g blocks-per-group ] [ -G number-of-groups ] [ -i bytes-per-inode ] [ -I inode-size ] [ -j ] [ -J journal-options ] [ -N number-of-inodes ] [ -n ] [ -m reserved-blocks-percentage ] [ -o creator-os ] [ -O feature[,...] ] [ -q ] [ -r fs-revision-level ] [ -E extended-options ] [ -v ] [ -F ] [ -L volume-label ] [ -M last-mounted-directory ] [ -S ] [ -t fs-type ] [ -T usage-type ] [ -U UUID ] [ -V ] device [ blocks-count ]
mke2fs -O journal_dev [ -b block-size ] [ -L volume-label ] [ -n ] [ -q ] [ -v ] external-journal [ blocks-count ]
###
# option:
-t fs-type # 指定要创建的文件系统类型(ext2,ext3 ext4),若不指定,则从/etc/mke2fs.conf中获取默认的文件系统类型。
-b block-size # 指定每个block的大小,有效值有1024、2048和4096,单位是字节。
-I inode-size # 指定inode大小,单位为字节。一般128或256字节
-i bytes-per-inode # 指定每多少个字节就为其分配一个inode号。值越大,说明一个文件系统中分配的inode号越少,更适用于存储大量大文件,值越小,inode号越多,更适用于存储大量小文件。
该值不能小于一个block的大小,因为这样会造成inode多余。注意,创建文件系统后该值就不能再改变了。
-c # 创建文件系统前先检查设备是否有bad blocks。
-f fragment-size # 指定fragments的大小,单位字节。
-g blocks-per-group # 指定每个块组中的block数量。不建议修改此项。
-G number-of-groups # 该选项用于ext4文件系统(严格地说是启用了flex_bg特性),指定虚拟块组(即一个extent)中包含的块组个数,必须为2的幂次方。对于ext4文件系统来说,使用extent的功能能极大提升其性能。
-j # 创建带有日志功能的文件系统,即ext3。如果要指定关于日志方面的设置,在-j的基础上再使用-J指定,不过一般默认即可,具体可指定的选项看man文档。
-L new-volume-label # 指定卷标名称,名称不得超出16字节。一般设定为挂载点的名字
-m reserved-blocks-percentage # 指定文件系统保留block数量的比例,保留一部分block,可以降低物理碎片。默认比例为5%。
-N number-of-inodes # 强制指定该文件系统应该分配多少个inode号,它会覆盖通过计算得出inode数量的结果(根据block大小、数量和每多少字节分配一个inode得出Inode数量),但是不建议这么做。
-q # 安静模式,可用于脚本中
-S # 重建superblock和group descriptions。在所有的superblock和备份的superblock都损坏时有用。它会重新初始化superblock和group descriptions,但不会改变inode table、bmap和imap(若真的改变,该分区数据就全丢了,还不如重新格式化)。在重建superblock后,应该执行e2fsck来保证文件系统的一致性。但要注意,应该完全正确地指定block的大小,其改选项并不能完全保证数据不丢失。
-v # 输出详细执行过程
-O FEATURE[,...] # 启用指定特性
-O ^FEATURE # 关闭指定特性
以上mke2fs命令常用选项有:
-b :每个block大小
-L :创建卷标
-i :每多少个block分配一个inode
-t :创建的文件类型
-m :预留块数量
示例:
CentOS 6:
[root@CentOS7 ~]#mke2fs -t ext4 -b 4096 -L hahahaha /dev/sda6
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=hahahaha
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
CentOS 6
[root@CentOS6 ~]#mke2fs -t ext4 -b 4096 -L mydata /dev/sda6
mke2fs 1.41.12 (17-May-2010)
Filesystem label=mydata
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
328656 inodes, 1312604 blocks
65630 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1346371584
41 block groups
32768 blocks per group, 32768 fragments per group
8016 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
3.3 e2label 查看、设置卷标
查看:e2label device
设定:e2label device LABEL
> tune2fs -L NEWLABEL /device 也可以修改卷标
注意:此命令只针对ext文件系统做卷标,且只有格式化后才能设置卷标
3.4 tune2fs 工具
查看或修改ext系列文件系统的某些属性
tune2fs - adjust tunable filesystem parameters on ext2/ext3/ext4 filesystems
tune2fs [OPTIONS] device
# option:
-l # 查看指定文件系统超级块的内容:super block
-j:ext2 --> ext3; (ext2不带日志系统,ext3带日志系统)
-L LABEL:修改卷标;
-m # 调整预留空间百分比;
-U UUID: 修改UUID号
tune2fs -U `uuidgen` # 以随机生成的uuid作为修改的uuid号
-O [^]FEATHER:开启或关闭某种特性:
acl :开启acl功能
^acl:关闭acl功能
(acl(access control list,访问控制列表)功能详见文件权限管理)
tune2fs -l /dev/sda1 # 查看该分区超级块内容
Default mount options: user_xattr acl # 其中的这一项含有acl表示开了acl功能
tune2fs -o ^acl /dev/sda1 # 表示关闭acl功能
4.查看文件系统状态信息
4.1 lsbik
lsblk - list block devices 列出设备及其状态(主要列出非空设备)
lsblk [options] [device...]
lsblk -f
查看到文件系统类型,和文件系统的uuid和挂载点
4.2 blkid :块设备属性信息查看
blkid - locate/print block device attributes 定位/输出设备属性信息
blkid -L LABEL:根据指定LABEL来定位对应的设备
blkid -U UUID:根据指定的UUID来定位对应的设备
4.3 du
du - estimate file space usage 评估某目录总体空间占用情况
du [OPTION]... [FILE]...
du [OPTION]... --files0-from=F
# option:
-a, --all:列出目录中所有文件的统计信息,默认只会列出目录中子目录的统计信息,而不列出文件的统计信息
-h, --human-readable:人性化显示大小
-0, --null:以空字符结尾,即"\0"而非换行的"\n"
-S, --separate-dirs:不包含子目录的大小
-s, --summarize:对目录做总的统计,不列出目录内文件的大小信息
-c,--total:对给出的文件或目录做总计。在统计非同一个目录文件大小时非常有用。见下文例子。
-d,--max-depth:指定显示时的目录深度,默认会递归显示所有层次(centos7)
--max-depth=N:只列出给定层次的目录统计,如果N=0,则等价于"-s"(centos6)
-x, --one-file-system:忽略不同文件系统上的文件,不对它们进行统计
-X, --exclude-from=FILE:从文件中读取要排除的文件
--exclude=PATTERN:指定要忽略不统计的文件
注意区分du /etc
和du -a /etc
[root@CentOS7 ~]#du -a /etc |wc -l
3505 # 递归显示全部的文件的统计信息
[root@CentOS7 ~]#du /etc |wc -l
734 # 只显示目录的信息
[root@CentOS7 ~]#find /etc -type d | wc -l
734
注意:du -d1 /etc
和du --max-depth=1 /etc
效果相同du -exclude=FILE /usr
的用法:
[root@CentOS6 ~]#du -h --max-depth=1 --exclude=/usr/lib64 /usr
136K /usr/local
310M /usr/lib
7.6M /usr/include
12K /usr/src
1.8G /usr/share
4.0K /usr/games
32M /usr/sbin
36M /usr/libexec
4.0K /usr/etc
269M /usr/bin
2.5G /usr
结合find使用
[root@xuexi ~]# find /boot/ -type f -name "*.img" -print0 | xargs -0 du -ch
28K /boot/grub2/i386-pc/core.img
4.0K /boot/grub2/i386-pc/boot.img
592K /boot/initrd-plymouth.img
44M /boot/initramfs-0-rescue-d13bce5e247540a5b5886f2bf8aabb35.img
17M /boot/initramfs-3.10.0-327.el7.x86_64.img
16M /boot/initramfs-3.10.0-327.el7.x86_64kdump.img
76M total
4.4 df
df - report file system disk space usage 显示文件系统空间使用情况
df [OPTION]... [FILE]...
# option
-h:人性化转换大小的显示单位
-i:统计inode使用情况而非空间使用情况
-l, --local:只列出本地文件系统的使用情况,不列出网络文件系统信息
-T, --print-type:同时输出文件系统类型
-t, --type=TYPE:只列出给定文件系统的统计信息
-x, --exclude-type=TYPE:指定不显示的文件系统类型的统计信息
-P :以Posix兼容的格式输出(同一行输出格式)
注意:df是读取每个文件系统的superblock信息,所以评估速度非常快。由于是读取superblock,所以如果目录下挂载了另一个文件系统,是不会将此挂载的文件系统计入目录大小的。
4.5 dumpe2fs
dumpe2fs - dump ext2/ext3/ext4 filesystem information
dumpe2fs prints the super block and blocks group information for the filesystem present on device.
显示ext系列文件系统的super block 和block groups信息
[root@CentOS7 ~]#dumpe2fs -h /dev/sda6 查看超级块信息
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: hahahaha
Last mounted on: <not available>
Filesystem UUID: 8525fe09-c310-4a16-9f38-23ff43051e80
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 327680
Block count: 1310720
Reserved block count: 65536
Free blocks: 1252258
Free inodes: 327669
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 639
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Sat Nov 24 16:00:45 2018
Last mount time: n/a
Last write time: Sat Nov 24 16:00:46 2018
Mount count: 0
Maximum mount count: -1
Last checked: Sat Nov 24 16:00:45 2018
Check interval: 0 (<none>)
Lifetime writes: 131 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: f4ca6814-6107-4432-a987-4bc22801a5b9
Journal backup: inode blocks
Journal features: (none)
Journal size: 128M
Journal length: 32768
Journal sequence: 0x00000001
Journal start: 0
4.6 findfs 查找分区
findfs [options] LABEL=<label>
findfs [options] UUID=<uuid>
示例:
findfs `grep /data /etc/fstab | cut -d" " -f1`
5.文件系统检测与修复
注意:一定不要在挂载状态下修复
fsck: File System Check
fsck.FS_TYPE == fsck -t FS_TYPE
-p: 自动修复错误
-r: 交互式修复错误
注:FS_TYPE一定要与分区上已有文件类型相同
e2fsck:ext系列文件专用的检测修复工具
-y:自动回答为yes
-f:强制修复