在国产深度操作系统上学习磁盘分区基础知识
sinye56 2024-11-16 00:28 42 浏览 0 评论
一、磁盘知识
(图片来源博客源尖尖毛草博客)
传统的机配磁盘由盘片、机械臂、马达构成。 一块磁盘会有多个盘片。
- 磁道:盘片上一圈圈灰色同心圆。
- 扇区:磁道上一段圆弧,盘片上最小的物理存储单位,主要有512B和4KB两种格式。
(图片来源:博客园尖尖毛草博客)
- 柱面:扇区组成一个圆,上图中蓝色部分。 一个盘片上下两面都可读写,使用两个磁头读写。
计算存储容量=存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数磁道扇区柱面三个参数计算存储容量 = 存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数磁道 扇区 柱面 三个参数计算存储容量=存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数磁道扇区柱面三个参数
老式磁盘中,每个磁道的扇区数是相等的,所以越往圆心存储密度越高。现代磁盘改为等密度结构,外围磁道的扇区数量大于内圈磁道,寻址方式也改为以扇区为单位的线性寻址。 为了与老式3D寻址兼容,现代磁盘控制器使用地址翻译器把3D寻址参数转为线性参数。
二、在深度系统中打开分区编辑器查看磁盘信息:
三、分区表
早期的分区以柱面为最小分区单位;现在的分区通常使用扇区为最小分区单位。每个扇区有一个自己的号码。磁盘分区表主要有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进制模式)
末尾的55aa是标志位,图中选中的 8020开始即第一个分区信息,
- 第1字节80 表示是活动分区(00表示非活动分区)
- 第5字节83表示分区类型是Linux分区(8e为Linux LVM分区)
如果要改动文件,可以使用
sudo dd if=~/bootsector of=/dev/sda bs=512 count=1
写回磁盘。
使用C从扇区读取文件
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <libgen.h>
#include <unistd.h>
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编译运行:
扩展分区
分区记录里分一个扩展分区出来,然后在扩展分区前几个扇区用来再记录逻辑分区。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
六、索引节点inode
每个存储设备或存储设备的分区被格式化为文件系统后有两部分:block+inode文件存储在硬盘上,最小存储单位是扇区,每个扇区可能是512Byte。但操作系统读取硬盘时,不会一个一个扇区读,而是一次性连续读多个扇区,多个扇区称为一个“块”。多个扇区组成的块,是文件存取的最小单位。“块”的大小,常见的有4B,即连续8个扇区。块用来存储数据,而inode用来存储这些数据元信息,主要包括:
- 文件大小
- 文件所属用户User ID
- 文件的Group ID
- 文件的读/写权限
- 文件的时间戳
- 链接数
- 文件数据Block的位置
inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,可以通过inode值快速找到相对应的文件。
使用stat命令可以查看文件的inode信息:
$ stat linux2-4.mov
16777220 3753644 -rw-r--r-- 1 apple staff 0 674287083 "Jul 9 23:49:23 2020" "Jul 9 23:07:22 2020" "Jul 9 23:07:23 2020" "Jul 9 23:07:08 2020" 4096 1344096 0 linux2-4.mov
硬盘在格式化的时候,操作系统会将硬盘分成两个区域:数据区、inode区。每个inode节点的大小一般为128B或256B;inode节点的数量在格式化时给定,一般是每1K或每2K设置一个inode。
如果一块1G的硬盘,每个inode节点大小为128B,每1K就设置一个inode,那inode占的空间会达到128M,占硬盘的12.8%。
df -i 命令可以查看每个硬盘分区的inode总数和已经使用的数量。
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)