![d45c5bb8f8d91bcfecf4a892ec42a2c9.gif](https://i-blog.csdnimg.cn/blog_migrate/7ef50a4e50b77ef632439578d9e5fc9a.gif)
一、磁盘知识
![766c6a55578f2ce3c50796e04938969d.png](https://i-blog.csdnimg.cn/blog_migrate/225a5160f377e858d75e1597ba4e9b57.jpeg)
(图片来源博客源尖尖毛草博客)
传统的机配磁盘由盘片、机械臂、马达构成。一块磁盘会有多个盘片。
磁道:盘片上一圈圈灰色同心圆。
扇区:磁道上一段圆弧,盘片上最小的物理存储单位,主要有512B和4KB两种格式。
![8a3bfab4faae23a088576fb4d5fdd524.png](https://i-blog.csdnimg.cn/blog_migrate/6f439d759f881a9d5a88fd318d97555c.jpeg)
(图片来源:博客园尖尖毛草博客)
柱面:扇区组成一个圆,上图中蓝色部分。一个盘片上下两面都可读写,使用两个磁头读写。
计算存储容量=存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数磁道扇区柱面三个参数计算存储容量 = 存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数磁道 扇区 柱面 三个参数计算存储容量=存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数磁道扇区柱面三个参数
老式磁盘中,每个磁道的扇区数是相等的,所以越往圆心存储密度越高。现代磁盘改为等密度结构,外围磁道的扇区数量大于内圈磁道,寻址方式也改为以扇区为单位的线性寻址。为了与老式3D寻址兼容,现代磁盘控制器使用地址翻译器把3D寻址参数转为线性参数。
二、在深度系统中打开分区编辑器查看磁盘信息:
![3354e6c027d0b894e8d98e5b44daa4ba.png](https://i-blog.csdnimg.cn/blog_migrate/0c789e58af63ed86274478d4df941ba3.jpeg)
![2ab0dbb2ea6856f7123d64a607874cc8.png](https://i-blog.csdnimg.cn/blog_migrate/3206dad74870a15f101508d5eb9b9bf5.jpeg)
三、分区表
早期的分区以柱面为最小分区单位;现在的分区通常使用扇区为最小分区单位。每个扇区有一个自己的号码。磁盘分区表主要有MBR和GPT两种格式,GPT格式可以支持2T以上容量。
主分区:一块硬盘取多4个主分区。主分区激活就可以用来启动。
扩展分区:早期设计的硬盘只能分4个分区。后来建了sda4做为扩展分区,称为逻辑分区。
逻辑分区可以有很多个。
Linux限制,一块硬盘主分区+扩展分区 最多只有4个。计算机的分区多于4个余下空间不能使用。
1. 下面重点看看MBR分区表
早期的Linux为了兼容Windows的磁盘,使用了支持Windows的MBR。MBR全称是Master Boot Record,通常放在磁盘的第一个扇区。这个扇区通常为512字节大小,当中包括两种东西:
主引导记录:446字节
分区表:64字节,最多只能有4组记录区,每组记录区记录该区起止柱面号码。
在深度系统使用下面命令读取MBR记录:
sudo dd if=/dev/sda of=~/bootsector bs=512 count=1
使用vim -b ~/bootsector打开查看 (在vim命令模式下输入:%!xxd 显示16进制模式)
![b7841abd6f97666a7568bc6d5a27544b.png](https://i-blog.csdnimg.cn/blog_migrate/68f2db1ae20a0838b86056fe047c49e3.jpeg)
末尾的55aa是标志位,图中选中的 8020开始即第一个分区信息,
第1字节80 表示是活动分区(00表示非活动分区)
第5字节83表示分区类型是Linux分区(8e为Linux LVM分区)
如果要改动文件,可以使用
sudo dd if=~/bootsector of=/dev/sda bs=512 count=1
写回磁盘。
使用C从扇区读取文件
#include
#include
#include
#include
#include
#include
#include
static void usage(char *prog_name)
{
fprintf(stderr, "usage: %s device start count\n", prog_name);
fprintf(stderr, "example: %s /dev/sda 0 512\n", prog_name);
}
int main(int argc, char *argv[])
{char buf[4096];
int fd = 0;
int i = 0;
int j = 0;
int start = 0;
int count = 0;char *device = NULL;if(argc != 4){
usage(basename(argv[0]));exit(1);
}
device = argv[1];
start = atol(argv[2]);
count = atol(argv[3]);
// 把磁盘像文件一样打开
fd = open(device, O_RDONLY);if(-1 == fd){
fprintf(stderr, "cannot open device");exit(1);
}
// 找到起始位置if(lseek(fd, start, SEEK_SET) != start){
fprintf(stderr, "cannot seek at %d", start);exit(1);
}
// 挨个字节读出来while(count > 0){
int size = count > sizeof(buf) ? sizeof(buf) : count;read(fd, buf, size);
/* 每行显示16个字节 每两个字节间以空格分开 */for(i = 0; i < size/16; i++){
fprintf(stdout,"%08x:", i*16+start);for(j = 0; j < 16; j++){
fprintf(stdout, " %02x", (int)buf[i*16+j] & 0xFF);
}
fprintf(stdout,"\n");
fflush(stdout);
}
count -= size;
start += size;
}
}
gcc编译运行:
![ed12ad9981ab801745cb6a74bc5cd139.png](https://i-blog.csdnimg.cn/blog_migrate/d00f73b08898347521faf70327085bab.jpeg)
扩展分区
分区记录里分一个扩展分区出来,然后在扩展分区前几个扇区用来再记录逻辑分区。Linux的SATA硬盘逻辑分区可以突破63个。
2. GPT分区(GUID Partition Table)
由于 MBR分区 每个分区表只有16字节,一个分区被限制最大只能使用2.2TB的磁盘。GPT将扇区以逻辑区块(Logincal Block Address,LBA)来处理,一个LBA默认512字节,第一个LBA就是LBA0.
GPT使用了34个LBA来记录分区信息
GPT把磁盘的最后34个LBA拿来作备份。
LBA0:用来兼容MBR,存储了启动引导程序。
LBA1:GPT表头记录
LBA2-33:实际记录分区信息,每个LBA放4组分区记录,每组记录用到128字节空间。GPT分区表对单一分区容量限制达8ZB(1ZB=230TB)
GPT 没有了主分区、逻辑分区的区分 。
四、Linux的磁盘文件名
老的ide接口,使用 /dev/hd开头,现在已经很少使用;
现在物理磁盘一般模拟成 /dev/sd[a-p]格式,第一块磁盘为/dev/sda;
分区的文件名以第一块磁盘为例,为/dev/sda[1-128]。虚拟机的磁盘通常是 /dev/vd[a-p] (比如用阿里的ECS)
磁盘阵列通常是 /dev/md[0-128]
LVM是 /dev/VGNAME/LVNAME
五、Linux 常用的文件格式
Linux较早的文件系统使用的是ext2。centos6:以ext4为主 。centos7:以xfs为主,大文件系统,日志型 ,文件可以修复。执行命令:cat /etc/fstab
![8f884ce4a457d2e5b468c7abc495dfe5.gif](https://i-blog.csdnimg.cn/blog_migrate/01023ae60ef7a8a1e55bdf88a4712aef.gif)
编辑:王烁晗
审核:李慧颖
来源:今日头条 科普中国
声明:仅作学习交流,非商业用途,侵删。