文档章节

Linux 磁盘与磁盘分区

SEOwhywhy
 SEOwhywhy
发布于 2018/12/11 09:40
字数 2806
阅读 11
收藏 0

  Linux 系统中所有的硬件设备都是通过文件的方式来表现和使用的,我们将这些文件称为设备文件,硬盘对应的设备文件一般被称为块设备文件。本文介绍磁盘设备在 Linux 系统中的表示方法以及如何创建磁盘分区。
  
  磁盘分类
  
  比较常见的磁盘类型有服务器中使用的 SCSI 硬盘和消费类市场中的 SATA 硬盘,当然还有当下大热的各种固态硬盘。
  
  SCSI 硬盘
  
  SCSI 硬盘即采用 SCSI 接口的硬盘。它由于性能好、稳定性高,因此在服务器上得到广泛应用。同时其价格也不菲,正因它的价格昂贵,所以在普通PC上很少见到它的踪迹。SCSI 硬盘使用 50 针接口,外观和普通硬盘接口有些相似(下图来自互联网):
  
  SATA 硬盘
  
  SATA(Serial ATA)口的硬盘又叫串口硬盘,Serial ATA 采用串行连接方式,串行 ATA 总线使用嵌入式时钟信号,具备了更强的纠错能力,与以往相比其最大的区别在于能对传输指令(不仅仅是数据)进行检查,如果发现错误会自动矫正,这在很大程度上提高了数据传输的可靠性。串行接口还具有结构简单、支持热插拔的优点(下图来自互联网):
  
  固态硬盘
  
  固态硬盘(Solid State Disk),一般称之为 SSD 硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。其主要特点是没有传统硬盘的机械结构,读写速度非常快(下图来自互联网):
  
  磁盘设备在 Linux 下的表示方法
  
  在 Linux 系统中磁盘设备文件的命名规则为:
  
  主设备号 + 次设备号 + 磁盘分区号
  
  对于目前常见的磁盘,一般表示为:
  
  sd[a-z]x
  
  主设备号代表设备的类型,相同的主设备号表示同类型的设备。当前常见磁盘的主设备号为 sd。
  
  次设备号代表同类设备中的序号,用 "a-z" 表示。比如 /dev/sda 表示第一块磁盘,/dev/sdb 表示第二块磁盘。
  
  x 表示磁盘分区编号。在每块磁盘上可能会划分多个分区,针对每个分区,Linux 用 /dev/sdbx 表示,这里的 x 表示第二块磁盘的第 x 个分区。
  
  如下图所示:
  
  该系统中一共有四块磁盘 /dev/sda,/dev/sdb,/dev/sdc 和 /dev/sdd。其中的 /dev/sda 上创建了三个分区,分别是 /dev/sda1,/dev/sda2,/dev/sda5;/dev/sdb 上只有一个分区 /dev/sdb1。而 /dev/sdc 和 /dev/sdd 则尚未分区(也肯能是只有一个分区,分区的名称和磁盘的名称相同)。
  
  磁盘分区
  
  创建磁盘分区大概有下面几个目的:
  
  提升数据的安全性(一个分区的数据损坏不会影响其他分区的数据)
  
  支持安装多个操作系统
  
  多个小分区对比一个大分区会有性能提升
  
  更好的组织数据
  
  磁盘的分区由主分区、扩展分区和逻辑分区组成。在一块磁盘上,主分区的最大个数是 4,其中扩展分区也是一个主分区,并且最多只能有一个扩展分区,但可以在扩展分区上创建多个逻辑分区。因此主分区(包括扩展分区)的范围是 1-4,逻辑分区从 5 开始。对于逻辑分区,Linux 规定它们必须建立在扩展分区上,而不是建立在主分区上。
  
  主分区的作用是用来启动操作系统的,主要存放操作系统的启动或引导程序,因此建议操作系统的引导程序都放在主分区,比如 Linux 的 /boot 分区,最好放在主分区上:
  
  扩展分区只不过是逻辑分区的 "容器"。实际上只有主分区和逻辑分区是用来进行数据存储的,因而可以将数据集中存放在磁盘的逻辑分区中。
  
  我们可以通过 fdisk 命令来查看磁盘分区的信息:
  
  $ sudo fdisk -l /dev/sda
  
  输出中的前几行是磁盘的基本信息,比如总大小为 80G,一共有多少个扇区(sector),每个扇区的大小等等。红框中的则是我们比较关注的分区信息:
  
  第一列 Device 显示了磁盘分区对应的设备文件名。
  
  第二列 Boot 显示是否为引导分区,上图中的 /dev/sda1 就是引导分区。
  
  第三列 Start 表示磁盘分区的起始位置。
  
  第四列 End 表示磁盘分区的结束位置。
  
  第五列 Sectors 表示分区占用的扇区数目。
  
  第六列 Size 显示分区的大小。
  
  第七列和第八列显示的内容相同,分别是数值 ID 及其文字描述。 Id 列显示了磁盘分区对应的 ID,根据分区的不同,分区对应的 ID 号也不相同。Linux 下用 83 表示主分区和逻辑分区,5 表示扩展分区,8e 表示 LVM 分区,82 表示交换分区,7 表示 NTFS 分区。
  
  上图中的信息表明:/dev/sda1 是一个主分区并且被用作引导分区;/dev/sda2 是扩展分区,其中只有一个逻辑分区,即 /dev/sda5,这点可以通过两个分区相同的大小证明。
  
  利用 fdisk 划分磁盘分区
  
  fdisk 是 Linux 系统中一款功能强大的磁盘分区管理工具,可以观察硬盘的使用情况,也可以用来管理磁盘分区。本文仅介绍如何使用 fdisk 创建新的磁盘分区。
  
  假设我们的 Linux 系统中增加了一块新的磁盘,系统对应的设备名为 /dev/sdd,下面我们通过 fdisk 命令对这个磁盘进行分区。
  
  $ sudo fdisk /dev/sdd
  
  输入命令 n 来创建新分区:
  
  根据上面的提示,我们选择 p 来创建主分区,然后提示我们输入分区的编号:
  
  主分区的编号为 1- 4,这里我们输入了 1。接下来是设置分区的大小:
  
  分区的大小是通过设置分区开始处的扇区和结束处的扇区设置的。这里如果回车两次会把整个磁盘划分为一个分区,也就是整个磁盘的容器都分给了一个分区。这样一个简单的分区就差不多完成了,注意此时的分区信息还没有写入到磁盘中,在这里还可以反悔,如果确认执行上面的分区,执行 w 命令就行了:
  
  这时分区操作已经完成了,我们可以通过下面的命令查看分区的结果:
  
  NioEventLoop#openSelector()实现了创建selector的功能,默认情况下,使用SelectorProvider#openSelector()方法创建一个新个selector:
  
  final Selector unwrappedSelector = provider.openSelector();
  
  如果设置环境变量io.netty.noKeySetOptimization=true, 会创建一个selectedKeySet = new SelectedSelectionKeySet(), 然后使用java的反射机制把selector的selectedKeys和publicSelectedKeys替换成selectedKeySet,具体步骤是:
  
  1.得到selector的真正类型: sun.nio.ch.SelectorImpl
  
  Object maybeSelectorImplClass = AccessController.doPrivileged(new PrivilegedAction<Object>() {
  
  @Override
  
  public Object run() {
  
  try {
  
  return Class.forName(
  
  "sun.nio.ch.SelectorImpl",
  
  false,
  
  PlatformDependent.getSystemClassLoader());
  
  } catch (Throwable cause) {
  
  return cause;
  
  }
  
  }
  
  });
  
  final Class<?> selectorImplClass = (Class<?>) maybeSelectorImplClass;
  
  2.替换selector是属性unwrappedSelector
  
  Field selectedKeysField = selectorImplClass.getDeclaredField("selectedKeys");
  
  Field publicSelectedKeysField = selectorImplClass.getDeclaredField("publicSelectedKeys");
  
  selectedKeysField.set(unwrappedSelector, selectedKeySet);
  
  publicSelectedKeysField.set(unwrappedSelector, selectedKeySet);
  
  之所以会设计一个这样的优化选项,是因为一般情况下调用完selector的select或selectNow方法后需要调用Selector#selectedKeys()得到触发NIO事件的的SelectableChannel,这样优化之后,可以直接从selectedKeySet中得到已经触发了NIO事件的SelectableChannel。
  
  在selector上注册channel感兴趣的NIO事件
  
  NioEventLoop提供了unwrappedSelector方法,这个方法返回了它创建好的Selector实例。这样任何的外部类都可以把任意的SelectableChannel注册到这selector上。在AbstractNioChannel中, doRegister方法的实现就是使用了这个方法:
  
  selectionKey = javaChannel(www.michenggw.com).register(eventLoop().unwrappedSelector(www.dasheng178.com/), 0, this);
  
  另外,它还提供了一个register方法:
  
  public void register(final SelectableChannel ch, final int interestOps, final NioTask<?> task)
  
  这个方法会把task当成SelectableChannel的附件注册到selector上:
  
  ch.register(selector, interestOps, task);
  
  实现EventExecutor的run方法,定义NIO事件和Executor任务的处理流程
  
  在NioEventLoop的run方法中实现NIO事件和EventExecutor的任务处理逻辑,这个run方法在io.netty.util.concurrent.SingleThreadEventExecutor中定义。在上一章中,我们看到了DefaultEventExecutor中是如何实现这个run方法的,这里我们将要看到这run方法的另一个实现。和SingleThreadEventExecutor中的run方法相比,NioEventLoop的run方法不仅要及时地执行taskQueue中的任务,还要能及时地处理NIO事件,因此它会同时检查selector中的NIO事件和和taskQueue队列,任何一个中有事件需要处理或有任务需要执行,它不会阻塞线程。同时它也保证了在没有NIO事件和任务的情况下线程不会无谓的空转浪费CUP资源。
  
  run主要实现如下,为了更清晰的说明它的主要功能,我对原来的代码进行了一些删减。
  
  for(;;){
  
  try{
  
  //phase1: 同时检查NIO事件和任务
  
  switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) {
  
  case SelectStrategy.CONTINUE:
  
  continue;
  
  case SelectStrategy.SELECT:
  
  select(wakenUp.getAndSet(www.yigouyule2.cn false)); //在taskQueue中没有任务的时候执行select
  
  }
  
  //phase2: 进入处理NIO事件,执行executor任务
  
  try{
  
  //处理NIO事件
  
  processSelectedKeys();
  
  }finally{
  
  //处理taskQueu中的任务
  
  runAllTasks();
  
  }
  
  }catch(Throwable t){
  
  handleLoopException(t);
  
  $ sudo fdisk -l /dev/sdd
  
  如果嫌上面的执行过程麻烦,可以用下面的一行命令起到相同的效果:
  
  $ (echo n; echo p; echo 1; echo ; echo ; echo w) | sudo fdisk /dev/sdd
  
  更改分区的类型
  
  上面创建的分区类型默认为 83(Linux),如果想要一个 8e(Linux LVM)类型的分区该怎么办?我们可以继续使用 fdisk 命令修改分区的类型,这次输入 t 命令来修改分区的类型:
  
  接下来可以选择要修改的分区号,我们只有一个分区,所以默认就是 1。
  
  下面我们可以通过 L 命令来查看 fdisk 命令支持的分区类型:
  
  我们需要创建 LVM,因此我们使用 LVM 的类型代码 8e:
  
  最后输入 w 命令确认变更。再次查看 /dev/sdd 的分区信息,此时分区类型已经变成了 Linux LVM:
  
  总结
  
  分区是使用磁盘的基础,在分区完成后还需要对分区进行格式化,并把格式化后的文件系统挂载到 Linux 系统之后才能存储文件。

© 著作权归作者所有

SEOwhywhy
粉丝 8
博文 155
码字总数 342404
作品 0
私信 提问
磁盘的基础知识——扇区、柱面、磁道、族

磁盘的物理结构 磁盘是由若干块坚硬金属材料制成的并涂以磁性介质的盘片压制而成。每个盘有两面,每面各有一个磁头,都可记录信息。要了解硬盘的物理结构,需要弄懂磁道、扇区、柱面、簇等几...

mj4738
2011/12/06
4K
0
4.1 df命令 4.2 du命令 4.3-4.4 磁盘分区(上)(下)

4.1 df命令 4.2 du命令 4.3-4.4 磁盘分区(上)(下) 4.1 df命令 磁盘管理 查看磁盘分区的命令 df 报告文件系统磁盘空间使用情况 第一列:磁盘分区 第二列:分区的大小 第三列:已经使用的空...

JasonYan86
2018/06/26
0
0
fdisk:Linux 下管理磁盘分区的利器

一块硬盘可以被划分成一个或多个逻辑磁盘,我们将其称作分区。我们对硬盘进行的划分信息被储存于建立在扇区 0 的分区表(MBR 或 GPT)中。 Linux 需要至少一个分区来当作根文件系统,所以我们...

作者: Magesh Maruthamuthu
02/04
0
0
Linux系统常用命令和相关工具详细介绍

操作环境:Fedora core 4.0 i686 & Slackware 10.1 一、df 命令; df 是来自于coreutils 软件包,系统安装时,就自带的;我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置;...

JavaGG
2009/05/07
373
0
如何在 Linux 中使用 parted 对磁盘分区

学习如何在 Linux 中使用 parted 命令来对存储设备分区。 在 Linux 中创建和删除分区是一种常见的操作,因为存储设备(如硬盘驱动器和 USB 驱动器)在使用之前必须以某种方式进行结构化。在大...

29%
2018/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mac下redis安装、设置、启动停止

常用命令说明 redis服务器:redis-server redis客户端:redis-cli redis性能测试工具:redis-benchmark AOF文件修复工具:redis-check-aof RDB文件修复工具:redis-check-rd redis设置临时密...

botkenni
16分钟前
3
0
好程序员web前端分享HTML5常见面试题集锦四

好程序员web前端分享HTML5常见面试题集锦四 1、为什么要初始化CSS样式? 答案:因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面...

好程序员官方
17分钟前
2
0
CDN的网络架构是什么?

CDN网络架构主要由两大部分,分为中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房,边缘主要指异地节点,CDN分发的载体,主要由Cac...

云漫网络Ruan
17分钟前
2
0
pandas入门07---可视化

01 入门 制作提供信息的可视化是数据分析的重要任务之一。首先介绍一下matplotlib库。 import matplotlib.pyplot as pltimport numpy as npdata = np.arange(10)print(data)plt.plot(da...

筠初
18分钟前
2
0
201_PyTorch中文教程:Torch与Numpy互操作

201_PyTorch中文教程:Torch与Numpy互操作 Numpy是经典的数学计算库,Torch中的Tensor可以与之互相转换,从而可以充分利用二者的计算函数和模型,以及使用其它支持Numpy的软件库和工具。但需...

openthings
19分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部