Linux文件管理浅析(一) _磁盘管理基础
本文主要讨论一些磁盘管理相关的基本概念,同时也是这一系列文章的第一篇,就是下图中的最下一层的一部分。

在Linux中,SATA/USB/SCSI接口都是使用SCSI模块实现的,所以使用这些接口的硬盘在Linux中都是/dev/sd...来表示的,取SCSI Disk之意,在此基础上,不同的硬盘使用sda,sdb...表示,同一个硬盘的不同分区使用sda1,sda2,etc表示。相应的IDE接口的磁盘使用/dev/hd...表示。
MBR
Master Boot Record(主引导记录)是一种历史悠久的分区表格式, 占磁盘第一个扇区(512 = bootloader 446 +Partition Table 16*4 +Signature 2 ),一块磁盘只有一个MBR,用来安装引导加载程序,分区表等信息
BIOS根据设置找到启动介质的MBR,执行其中的BootLoader,bootloader主要工作就是根据从分区表中描述的分区中找到OS并将其加载。
不同的OS使用的MBR具体分布有所不同,但布局框架都遵循下图(wikipedia)所示的结构:
| Description | Size |
|---|---|
| Bootstrap code area | 446 |
| Partition entry No1 | 16 |
| Partition entry No2 | 16 |
| Partition entry No3 | 16 |
| Partition entry No4 | 16 |
| Boot Signature | 2 |
MBR使用32bit进行LBA寻址,而每个块的大小是512byte,所以MBR能管理的最大磁盘容量是(2^32)*512byte = 2TB,所以,如果你对一块大于2TB的磁盘进行分区的时候,不要使用MBR,而要用下面的GPT。目前,越来越多的系统使用UEFI(GPT)来替代BIOS(MBR)引导系统,Microsoft从windows8开始就支持UEFI(GPT)模式以实现更快的开机。
GPT
前文已经说过,对于512byte的一个扇区,MBR引导最大支持2TB磁盘,所以对于想要使用更大的磁盘做系统盘,GPT(GUID Partion Table)是一个更好的选择。和MBR不同,GPT使用64bit来描述LBA地址,这样一来,同样是512byte的一个扇区, GPT能表示的磁盘容量就是
...一个短期内不会达到的单盘容量,除了LBA,分区表的位宽也从MBR的2byte扩展到128byte,这样一个GPT分区表就可以管理128个分区。除了容量, GPT分区表通过使用全局唯一的ID来标识分区,避免了全盘拷贝,实现了更好的安全性。虽然GPT有这么多性能上的优势,但是出于向后兼容的考虑,对于512byte的扇区,GPT的LBA0还是放置了一个MBR分区表,GPT的简单布局如下:
| Description | Size |
|---|---|
| MBR | 512 |
| GPT Header | 512 |
| Partion Table | 16384 |
可见,GPT本身占用了LBA0~LBA33的扇区,磁盘的第一个数据存储在LBA34地址处。
Bootloader
bootloader的主要工作就是提供启动菜单+加载内核文件+转交其他loader,它会识别硬盘里的文件系统格式(要有参照分区表),且操作系统的bootloader只会认识自己分区内的可开机内核文件 + 其他分区的bootloader(boot sector),这也就是在一个磁盘中安装双系统的基础。在一个双系统的系统盘中, 典型的布局如下:

需要注意的是,windows的bootloader缺省会将自己覆盖安装在MBR以及所在分区的boot sector中,而Linux系统在安装的过程中可以指定安装的扇区,除了作为第一个操作系统的bootloader直接安装在MBR中,还可以安装在某个分区的启动扇区同时在MBR中添加选项,所以如果安装windows+linux双系统,建议先安装windows再安装linux,如果反过来的话需要使用其他工具修复Linux的bootloader。
Partition Table
MBR或GPT的一部分,MBR每个分区需要2byte描述,分区表占64byte,所以MBR直接管理的(主分区+扩展分区)最多有4个,而GPT每个分区使用128byte描述,分区表占16384byte,所以一共可以直接管理128个分区。
说到分区表,首先得先说说分区,顾名思义,分区就是将磁盘划分为多个区域,区域之间保持一定的独立性,既安全又便于管理,磁盘的物理分区有两种类型:主分区Primary Partition和扩展分区Extented Partition,无论是哪种,对于机械磁盘来讲,分区都必须以柱面的大小为单位。
磁盘头的分区表只能分出最多4个分区,所以对于更多的分区数量的需求,系统在扩展分区的头部又创建了一个分区表,这个分区表用来描述其上的逻辑分区的分布情况。扩展分区不能格式化,逻辑分区可以。
主分区被设计成具备了引导、启动、故障转储等功能的分区,安装过windows的同学可能知道, windows系统必须安装在主分区中,相比之下,Linux也可以安装在逻辑分区中。
既然分区表只是描述分区信息的表,所以即便分区表不在了,我们位于分区上的文件系统以及数据都不会丢失,但如果分区表不在了,操作系统也不知道去哪里找文件系统,所以数据也就无法读写,这里,我做了一个小测试,使用fdisk工具删除并新建一个和原来一模一样的分区表,U盘的文件可以正常的再次被识别。
初始分区

删除第一个分区

磁盘无法识别

再次新建分区

数据再次可读

Boot Sector
每个主分区或逻辑分区都有一个,可以用来引导包括但不限于操作系统等软件,当我们在一块磁盘上装多个系统的时候, 除了第一个装入的操作系统的bootloader在MBR之外,其他的系统的bootloader都是在所在分区的boot sector中
FileSystem
文件系统就是管理文件、为上层提供文件级服务的系统, 本质上, 文件系统就是一个数据结构,这个数据结构维护了文件名--物理存储地址的映射,当然,为了实现这个映射,前人已经开发了很多款不同的文件系统,包括使用文件分配表的windows早期文件系统FAT32,当下使用的NTFS,Linux中目前主流的磁盘文件系统Ext2,Ext4,或者对标Sun公司ZFS的Btrfs,除了这些基于磁盘的文件系统, 还有很多基于内存的文件系统,比如tmpfs,procfs, devpfs等,以及基于flash的文件系统cramfs,jffs2,yaffs等。存在即合理,每种文件系统都有自己适用的场合,针对每种具体文件系统的讨论,超过了本文的讨论范围,我会在以后的文章中展开讨论。
Linux文件管理浅析(一) _磁盘管理基础的更多相关文章
- Linux常用命令之文件磁盘管理
前言 本文知识点是曾经学习过程中收录整理的,方便学习使用. 一>Linux常用基本命令 Linux命令格式:command [-options] [parameter1] ... command ...
- Linux常用命令学习7---(磁盘管理df du、磁盘的分区和格式化fdisk parted)
1.磁盘管理 在服务器的维护中,我们需要关心服务器的磁盘使用了多少.还有多少的剩余空间.某个文件有多大.某个文件夹内的所有文件在一起一共占用的多少空间……问题.以便我们在合适的时机为服务器添加硬 ...
- Linux系统下常用的磁盘管理命令——du / df / fdisk / mount / xxd
之前使用虚拟机体验Linux操作系统的使用,一般使用默认的磁盘分区设置,也很少涉及磁盘管理操作,且总有删除重装作为后盾.在安装Ubuntu双系统后,在使用过程中遇到了磁盘分区不合理导致的/boot分区 ...
- 最全 Linux 磁盘管理基础知识全汇总
一.存储设备的挂载和卸载 存储设备的挂载和卸载常用操作命令:fdisk -l.df.du.mount.umount. fdisk -l 命令 1.作用 查看所有硬盘的分区信息,包括没有挂上的分区和 ...
- Linux操作_磁盘管理_增加虚拟磁盘
环境:虚拟机 VM 12,Linux版本号 CentOS 7.3 1,在当前的虚拟机选项卡点击鼠标右键,选择“设置” 2,在弹出的对话框中左侧选中“磁盘”->点击下方“添加”按钮,在弹出的“添加 ...
- Linux命令_磁盘管理_查看磁盘或目录的容量
软件环境:虚拟机VM12,Linux版本 CentOS 7.3 命令 df (disk filesystem) 用于查看已挂载磁盘的总容量.使用容量.剩余容量等,可以不加任何参数,默认以KB为单位显示 ...
- Linux 磁盘管理基础命令df,du,fdisk,mke2fs
1.df:查看已挂载磁盘的总容量,使用容量和剩余容量等,默认以KB位单位显示 文件系统 容量 已用 可用 已用百分比 挂载点 df常用选项-i,-h,-k,-m ...
- Linux系统管理_磁盘管理——敬请期待!!!
df 显示磁盘空间使用情况 -a 全部文件系统列表 -h 以方便阅读的方式显示 -T 列出文件系统类型 du 查看目录和文件的磁盘空间使用情况 -a 显示目录中所有文件大小 -h 以易读方式显示文件大 ...
- Linux学习之CentOS(十三)-----磁盘管理之 磁盘与目录的容量(转) df 与du 命令
磁盘与目录的容量 现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的. 那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个 ...
随机推荐
- OC的内存管理(一)
在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...
- Web 版 powerdesigner (Canvas) 技术分享
演示地址:http://www.netuml.com:8088 <canvas></canvas>是HTML5出现的新标签,像所有的dom对象一样它有自己本身的属性.方法和事 ...
- 成熟的C#网络通信框架介绍——ESFramework通信框架
(转自:http://www.cnblogs.com/zhuweisky/archive/2010/08/12/1798211.html) ESFramework通信框架是一套性能卓越.稳定可靠.强大 ...
- 禁止LISTCTRL表头拖动
禁止ListCtrl表头拖动(Prevent CListCtrl column resizing) /*The header control in the ListView control sends ...
- myeclipse10.7安装git插件
如果想把github上的一些开源项目导入到myeclipse中,一种方法是从github网站上将开源项目下载下来,另一种是使用myeclipse的egit插件直接从github网站上down下来,下面 ...
- C语言解析17monipdb.dat(http://www.ipip.net/)免费数据库
官方给的链接打不开,而且里面的逻辑,每次都会打开文件,所以自己做了点个修改,发上来,借大家参考: #include <stdio.h> #include <stdlib.h> ...
- Hive的分区操作~~~~~~
一.Hive分区(一).分区概念:为什么要创建分区:单个表数据量越来越大的时候,在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据, ...
- DB太大?一键帮你收缩所有DB文件大小(Shrink Files for All Databases in SQL Server)
本文介绍一个简单的SQL脚本,实现收缩整个Microsoft SQL Server实例所有非系统DB文件大小的功能. 作为一个与SQL天天打交道的程序猿,经常会遇到DB文件太大,把空间占满的情况: 而 ...
- 如何在Java中调用Python代码
有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...
- Js实现京东无延迟菜单效果(demo)
一个端午节,外面人山人海,又那么热,我认为宅在家里看看慕课网,充实自己来的实际... 这是一个js实现京东无延迟菜单效果,感觉很好,分享给大家... 1.开发基本的菜单结构 2.开发普通的二级菜单效果 ...