关键词:磁盘分区、磁盘分区工具、inode/block、块组、超级块、VFS、文件系统的类型、链接文件;
1、计算机的5大构件
1.1 控制器(Control):
是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等;
1.2 运算器(Datapath):
运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理;
1.3 存储器(Memory):
存储器的功能是存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息;
1.4 输入(Input system):
输入设备是计算机的重要组成部分,输入设备与输出设备合你为外部设备,简称外设,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。常见的输入设备有键盘、鼠标器、光电输入机、磁带机、磁盘机、光盘机等;
1.5 输出(Output system):
输出设备与输入设备同样是计算机的重要组成部分,它把外算机的中间结果或最后结果、机内的各种数据符号及文字或各种控制信号等信息输出出来。微机常用的输出设备有显示终端CRT、打印机、激光印字机、绘图仪及磁带、光盘机等;
I/O设备:Disks (持久存储数据), Ethercard ;
2、Disks接口类型:
IDE(data) : 并口,理论传输速率133MB/s;
SCSI : 并口,理论传输速率320MB/s(UltraSCSI320型号)、640MB/s(UltraSCSI640型号)
SATA : 串口,理论传输速率6gbps;
SAS : 串口,理论传输速率6gbps;
USB : 串口,理论传输速率480MB/s;
并口:同一线缆可接多块设备;
IDE : 可接2个设备,一个主设备,一个从设备;
SCSI : 宽带类型的可接 ’16-1′ 个设备;窄带类型的可接’8-1’个设备;
串口: 同一线缆只能接1个设备;
—————————
评估硬盘传输能力的指标:IOPS (io per second);
硬盘分类:机械硬盘、固态硬盘;
机械硬盘基本概念:
track : 磁道(磁道以扇区为单位进行划分);
sector : 扇区,每个扇区为512bytes;
cylinder : 柱面(分区的划分是基于柱面的);
3、Linux的设备类型
块设备(block) : 随机访问,数据交换单位是”块”;
字符设备(character) : 线性访问,数据交换单位是”字符”;
Linux的设备文件:FHS规定
/dev : 设备文件目录,关联至设备的驱动程序;是设备的访问入口;
设备号:
major : 主设备号,区分设备类型;用于标明设备所需要的驱动程序;
minor : 次设备号,区分同种设备类型下的不同设备;是特定设备的访问入口;
手动创建设备文件,使用命令:mknod;
命令说明:
mknod – make block or character special files
命令格式:
mknod [OPTION] … NAME TYPE [MAJOR MINOR]
选项:
OPTION:
-m MODE : 指定创建的设备文件的访问权限;
举例:创建一个设备文件
~]# mknod /dev/testdev c 122 2
4、设备文件名:
是由 ICANN(The Internet Corporation for Assigned Names and Numbers)互联网名称与数字地址分配机构 进行分配的;
/dev/hd : IDE设备;/dev/hd[a-z] 依次来区分同类而不同的设备;
/dev/sd : SCSI , SATA , USB , SAS ; /dev/sd[a-z] 依次来区分同类而不同的设备;
磁盘分区时候对设备的命名规则:
/dev/sda# : ‘#’ 表示阿拉伯数字,如 /dev/sda1, /dev/sda2, … ;
注意,centos 6 和 7 系统中,将硬盘设备标识为 /dev/sd[a-z]# ;
5、3种引用设备的方式
设备文件名;
卷标;
UUID;
======================
6、磁盘分区类型:MBR , GPT ;
MBR : 主引导记录,Master Boot Record ; 位于磁盘的0磁道0号扇区,0 sector;
MBR分为3个部分(512 bytes):
446bytes : bootloader , 是引导启动操作系统的一种程序;
64bytes : 文件系统分区表,每16bytes标识一个分区,一共只能有4个分区;
2bytes : MBR区域的有效性标识;55AA表示当前MBR信息有效,否则就表示无效;
磁盘分区:
可以将整块硬盘分为4个主分区;
可以将硬盘分为3个主分区和1个扩展分区,扩展分区不能直接使用,必须要在扩展分区下创建逻辑分区才能使用;
主分区和扩展分区的数字标识为:1-4;
逻辑分区的数字标识为:5+ ;
fdisk : 分区管理命令;
fdisk – manipulate disk partition table
6.1 查看磁盘的分区信息:
fdisk -l [-u] [device…] : 列出指定磁盘设备上的分区情况;
列出所有磁盘的分区信息:
———————-
[root@localhost test]# [root@localhost test]# fdisk -l Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000c32e3 Device Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 83886079 40893440 8e Linux LVM Disk /dev/mapper/centos-root: 39.7 GB, 39720058880 bytes, 77578240 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes [root@localhost test]# 备注: centos 7 系统上: start..end.. 表示扇区的起始数字; centos 6 系统上: start..end.. 表示柱面的起始数字;
列出指定的磁盘的分区信息:
———————–
~]# fdisk -l /dev/sdb
6.2 管理分区
命令: fdisk DEVICE
fdisk 提供了一个交互式接口来管理分区,它有许多子命令,分别用于不同的管理功能;所有的操作均在内存中完成,没有直接同步到磁盘;可使用w命令保存至磁盘;
fdisk常用的子命令:
n : 创建新分区;
d : 删除已有分区;
t : 修改分区类型;
l : 查看所有已知的分区类型ID号;
p : 显示现有分区信息;
w : 保存并退出;
q : 放弃修改并退出;
m : 查看帮助信息;
在已有分区,并且已经挂载其中某个分区的磁盘上创建的新分区,内核可能在创建完成后无法直接识别;
查看内核识别出的所有分区:
~]# cat /proc/partitions
通知内核强制重读磁盘分区表(系统版本不同,使用的命令也不同,命令可能需要重复执行2次):
centos 5 : partprobe [device]
centos 6/7 : partx , kpartx
partx -a [device]
kpartx -af [device]
查看内核已识别的所有分区信息:
—————————
[root@localhost test]# [root@localhost test]# cat /proc/partitions major minor #blocks name 8 0 41943040 sda 8 1 1048576 sda1 8 2 40893440 sda2 11 0 1048575 sr0 253 0 38789120 dm-0 253 1 2097152 dm-1 [root@localhost test]#
7、磁盘分区中涉及的相关逻辑概念
7.1 磁盘格式化有2种:
低级格式化:分区之前进行,用来划分磁道;
高级格式化:分区之后进行,用来创建文件系统;
7.2 磁盘分区划分为元数据区、数据区:
元数据区的每个文件存储的信息:文件大小、权限、属主属组、时间戳、数据块指针、位图索引(bitmap)…
数据区保存的信息:文件的实际内容;
文件元数据:保存在inode (index node)中;
文件数据:保存在磁盘块(block)中;
符号链接文件:存储数据指针的空间中,存储的是真实文件的访问路径;
设备文件:存储数据指针的空间中,存储的是设备号(major,minor);
位图索引(bitmap):包括inode bitmap 以及 block bitmap ;
7.3 块组(block group)
磁盘在高级格式化后,每个分区划分成多个逻辑的的单位,对用来说是透明的,主要用来存放块组 ;
每个逻辑单位就是一个块组;
每个块组里面都有元数据区和数据区;
每个块组里面都有一个块组描述符(GDT),GDT位于元数据区;
GDT保存如下信息:当前块组的块数量及编号范围、inode数量及编号等;
块组先划分块(block),然后才在block中定义元数据区和数据区;
7.4 超级块(super block)
每个分区都有一个超级块;
超级块里面定义了块组的数量及编号;
超级块保存在某个块组的元数据区的某个块上;
7.5 查看inode编号及内容
~]# ls -i 查看某个目录的所有文件的inode编号;
~]# stat FILENAME 查看某个文件的inode的信息(文件的元数据信息);
7.6 目录的元数据和数据
目录也有元数据及数据;2个数据信息也记录在block中;有单独的inode表、data block;
目录的元数据:记录此目录指向数据块的指针信息;
目录的数据:记录此目录下所有一级子目录或者文件的名字、以及对应的inode编号;
图解,查看某个文件时,在分区的inode、data block 中的查找顺序(以查看文件 /var/log/messages 为例):
buff/cache:缓存元数据及数据的信息;
[root@localhost log]# [root@localhost log]# free -m total used free shared buff/cache available Mem: 975 116 713 6 145 701 Swap: 2047 0 2047 [root@localhost log]#
8、文件系统
8.1 VFS:Virtual FileSystem,虚拟文件系统
功用:衔接2个不同的文件系统,起到中间层作用;
8.2 常见的文件系统类型
Linux的文件系统:ext2(无日志功能) , ext3 , ext4 , xfs , reiserfs , btrfs ;
光盘:iso9660 ;
网络文件系统:nfs , cifs ;
集群文件系统:gfs2 , ocfs2 ;
内核级分布式文件系统:ceph ;
windows的文件系统:vfat , ntfs ;
伪文件系统:proc , sysfs , tmpfs , hugepagefs ;
Uinx的文件系统:UFS , FFS(快速文件系统) , JFS(日志文件系统) ;
交换文件系统:swap ;
用户空间的分布式文件系统:mogilefs , moosefs , glusterfs ;
centos 6 如果要使用 ‘xfs’ 文件系统,需要额外安装相关软件包:
~]# yum install xfsprogs
9、链接文件
访问同一个文件的不同路径;
符号链接文件的inode表记录的不是块指针,而是指向另外一个文件路径;
硬链接:
>> 指向同一个inode的多个文件路径;
>> 目录不支持硬链接;
>> 不能跨文件系统;
>> 创建硬链接会增加inode的引用计数;
符号链接(也叫软连接):
>> 指向一个文件路径的另一个文件路径;
>> 符号链接与文件是2个各自独立的文件,拥有不同的inode号;
>> 支持对目录创建符号链接,可以跨文件系统;
>> 创建或删除符号链接不会增加或减少inode的引用计数;
>> 删除符号链接文件不影响原文件;但删除原文件,符号链接指定的路径及不存在,此时会变成无效链接;
创建链接文件:
~]# ln [-v] 原文件名 硬链接文件名
~]# ln -s [-v] 原文件名 软连接文件名
-v 选项:显示创建的过程;
******************************************************
举例:7.5 查看inode编号及内容;
[root@localhost ~]# [root@localhost ~]# ls -i 67146818 anaconda-ks.cfg 67588871 lucifer 67871313 test [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# ls -il total 4 67146818 -rw-------. 1 root root 1259 Dec 27 05:48 anaconda-ks.cfg 67588871 -rw-r--r-- 1 root centos 0 Mar 22 01:56 lucifer 67871313 drwxr-xr-x 2 root root 39 Mar 20 21:04 test [root@localhost ~]# [root@localhost ~]# stat lucifer File: ‘lucifer’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 67588871 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 1000/ centos) Access: 2018-03-22 01:56:13.998154102 +0800 Modify: 2018-03-22 01:56:13.998154102 +0800 Change: 2018-03-22 01:56:13.998154102 +0800 Birth: - [root@localhost ~]#
举例:6.2磁盘分区操作;
[root@localhost ~]# [root@localhost ~]# fdisk -l 查看是否有尚未分区的磁盘空间; Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000c32e3 Device Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 83886079 40893440 8e Linux LVM Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos-root: 39.7 GB, 39720058880 bytes, 77578240 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# fdisk /dev/sdb 对 /dev/sdb 磁盘进行分区操作; 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. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0xfead7da1. Command (m for help): 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 G create an IRIX (SGI) partition table l list known partition types 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 u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) Command (m for help): p 显示 /dev/sdb 磁盘是否已有分区; Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xfead7da1 Device Boot Start End Blocks Id System Command (m for help): l 显示所有已知分区的类型及对应的ID号; 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary 16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT 1e Hidden W95 FAT1 80 Old Minix Command (m for help): n 创建新分区; Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 选择创建主分区; Partition number (1-4, default 1): 1 选择主分区号; First sector (2048-41943039, default 2048): 选择新分区的起始扇区; Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +1G 指定新分区的大小; Partition 1 of type Linux and of size 1 GiB is set Command (m for help): p 显示已有的所有分区;但此时看到的信息是记录在内存中的; Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xfead7da1 Device Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 83 Linux Command (m for help): w 保存新创建分区的信息至磁盘; The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@localhost ~]# kpartx -af /dev/sdb 强制内核更新分区表; [root@localhost ~]# [root@localhost ~]# cat /proc/partitions 查看内核已识别的所有分区, /dev/sdb1 能看到,表示分区已被识别; major minor #blocks name 8 0 41943040 sda 8 1 1048576 sda1 8 2 40893440 sda2 8 16 20971520 sdb 8 17 1048576 sdb1 11 0 1048575 sr0 253 0 38789120 dm-0 253 1 2097152 dm-1 253 2 1048576 dm-2 [root@localhost ~]#