linux磁盘管理与分区 转载

原文:http://zhengjianglong.leanote.com/post/linux%E7%A3%81%E7%9B%98%E5%88%86%E5%8C%BA

一、基础知识

一块磁盘可以分为多个分区(partition),如window的C、D、E盘一样。linu系统是安装在磁盘上,在linux中设备都是以文件类型存在。

1.1 磁盘接口

个人计算机常见的磁盘接口有两种,分别是IDE和SATA:

  • IDE
    使用的排线较宽,每条线上可以接两个IDE设备(Master/Slave),磁盘驱动器上提供调整跳针来指定master或slave.一般助理都会提供两个IDE接口,因此最多可以接到4个IDE设备。传输133MB每秒。这四个IDE设备文件名如下:
IDE Master slave
IDE1(Primary) /dev/hda /dev/hdb
IDE2(Secondary) /dev/hdc /dev/hdd
  • SATA
    插槽比IDE小,排线较细有利于主机内部散热和安装。传输速度300MB每秒。目前大部分机器都采用了SATA。

1.2 磁盘组成


磁盘由盘片、机械手臂、磁头和主马达组成。而对于每个盘片又可以细分出扇区(Sector)、柱面(Cylinder)两个单位。

盘面
硬盘一般会有一个或多个盘片,每个盘片可以有两个面(Side),即第1个盘片的正面称为0面,反面称为1面;第2个盘片的正面称为2面,反面称为3面…依次类推。每个盘面对应一个磁头(head)用于读写数据。第一个盘面的正面的磁头称为0磁头,背面称为1磁头;第二个盘片正面的磁头称为2磁头,背面称为3磁头,以此类推。盘面数和磁头数是相等的。关机时磁头停留在盘片启停区,开机时磁头“飞行”在磁盘片上方。为了避免磁盘和磁头损坏,建议不要强制关机。

磁道
每个盘片的每个盘面被划分成多个狭窄的同心圆环,数据就是存储在这样的同心圆环上,我们将这样的圆环称为磁道(Track),每个盘面可以划分多个磁道。关机时磁头停留在硬盘的着陆区(Landing Zone),这个着陆区以前是位于离盘心最近的区域,不存放任何数据。
在每个盘面的最外圈,离盘心最远的地方是“0”磁道,向盘心方向依次增长为1磁道,2磁道,等等。硬盘数据的存放就是从最外圈开始

扇区
每个磁道划分成若干弧段,每段称为一个扇区(Sector)。扇区是硬盘上存储的物理单位,每扇区大小是512字节,大小不可改变。

柱面
柱面其实是我们抽象出来的一个逻辑概念,不同面上相同磁道编号则组成了一个圆柱面,即所称的柱面(Cylinder)。这里要注意,硬盘数据的读写是按柱面进行,即磁头读写数据时首先在同一柱面内从0磁头开始进行操作,依次向下在同一柱面的不同盘面(即磁头上)进行操作,只有在同一柱面所有的磁头全部读写完毕后磁头才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换。电子切换比从在机械上磁头向邻近磁道移动快得多。因此,数据的读写按柱面进行,而不按盘面进行。读写数据都是按照这种方式进行,尽可能提高了硬盘读写效率。

将物理相邻的若干个扇区称为了一个簇。

容量计算公式
硬盘容量=盘面数×柱面数×扇区数×512字节

1.3 硬盘读写数据的过程

现代硬盘寻道都是采用CHS(Cylinder Head Sector)的方式,硬盘读取数据时,读写磁头沿径向移动,移到要读取的扇区所在磁道的上方,这段时间称为寻道时间(seek time)。因读写磁头的起始位置与目标位置之间的距离不同,寻道时间也不同。目前硬盘一般为2到30毫秒,平均约为9毫秒。磁头到达指定磁道后,然后通过盘片的旋转,使得要读取的扇区转到读写磁头的下方,这段时间称为旋转延迟时间(rotational latencytime)。

1.4 磁盘分区表

磁盘上的第一个扇区特别主要,它记录两个重要的信息:
1. 主引导分区(Master Boot Record,MBR)。可以安装引导加载程序的地方,有446bytes。MBR是系统开机的时候会主动去读取这个区块的内容,这样系统才会知道你的程序放在哪里且该如何开机。
2. 分区表(partition table):记录整块硬盘分区的状态,有64bytes。

第一扇区结构如下:

分区表

分区表只有64bytes,最多能容纳4个分区记录,这四个分区被称为主(Primary)和扩展(Extended)分区。分区的最小单位是柱面,也是文件系统的最小单位。分区表记录了每个分区起始和结束的柱面号码。为什么要进行磁盘分区呢?有以下好处:
1. 数据的安全性。对某个分区数据重整时不影响其他分区。
2. 系统性能。数据一般存放在同一个分区中,使得数据分布更加集中,有助于数据读取的速度和性能。

虽然分区表只能分配4个分区,但可以利用扩展分区使额外的扇区来记录分区信息,扩展分区本身不能被格式化。从扩展分区切出来的分区叫做逻辑分区。如图:

上述分区在linux系统中文件名分别为:

  • P1:/dev/hda1 (主分区)
  • P2:/dev/hda2 (扩展分区)
  • L1:/dev/hda5
  • L2:/dev/hda6
  • L3:/dev/hda7
  • L4:/dev/hda8
  • L5:/dev/hda9

逻辑分区从5开始,前面的4个号码都是保留给主分区和扩展分区用。分区还具有以下特性:

  • 主分区和扩展分区最多只有四个(硬盘限制)
  • 扩展分区最多只有一个(操作系统限制)
  • 逻辑分区是有扩展分区持续切割出来的分区
  • 能够被格式化后作为数据访问的分区为主分区和逻辑分区,扩展分区无法格式化
  • linux系统中,IDE硬盘最多有59个逻辑分区(5~63),SATA硬盘则有11个逻辑分区(5~15)

1.5 固态硬盘和机械硬盘

  1. 性能方面,固态硬盘完胜机械硬盘。固态硬盘的读写速度要比机械硬盘的读写速度高,一般要高2倍左右的速度读写能力。
  2. 机械硬盘容量大,价格低。固态硬盘容量普遍偏小,价格昂贵。
  3. 固态硬盘几乎0噪音,机械硬盘噪音较大
  4. 机械硬盘的体积要比固态硬盘大,所以重量也要比固态硬盘重
  5. 在功耗方面,固态硬盘也要低于传统的机械硬盘

二、安装时分区

2.1 挂载

挂载是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下,也就是说进入该目录就可以读取该分区的意思。这个进入点的目录就称为”挂载点

例如 partion1 挂载在根目录上,partion2挂载在/home,意味着/home下数据都存放在partion2上,其他数据都放在partion1上。

3.1 分区规划

最简单的分区方法就是仅分出根目录和内存交换空间(/ & swap)即可。但是这样的分区不保险,如果任何一个细节坏掉(例如坏轨的产生),你的根目录将可能整个损毁。

分多个区有以下几个目的:

  • 避免磁盘一些细节坏掉,使得整个目录损毁
  • 在不损失数据的情况下重装系统,比如独立设置/home挂载点,重装系统的时候直接标记回/home,数据不会有任何损失。
  • 针对不同挂载点的特性分配合适的文件系统以合理发挥性能,比如对/var使用reiserfs,对/home使用xfs,对/使用ext4。
  • 针对不同的挂载点开启不同的挂载选项,如是否需要即时同步,是否开启日志,是否启用压缩。
  • 大硬盘搜索范围大,效率低
  • 磁盘配额只能对分区做设定
  • /home、/var、/usr/local 经常是单独分区,因为经常会操作,容易产生碎片

建议挂载的几大目录:

目录 说明 建议大小
/ 根目录,唯一必须挂载的目录。 10~15G
swap 交换分区,可能不是必须的。 一般为内存2倍,最大指定2G即可
/home 用户目录,存放用户文件,是读写很频繁的一个目录。最好分配一个分区 最大的剩余空间
/usr 应用程序目录。大部分的软件都安装在这里,如果您计划安装许多软件,建议也给它分配一个分区 最大的剩余空间的一半
/var 包含系统运行时要改变的数据。通常这些数据所在的目录的大小是要经常变化的,系统日志记录也在/var/log下。一般多用户系统或者网络服务器要建立这个分区,设立这个分区,对系统日志的维护很有帮助。 一般设置2-3G大小
/boot 包含了操作系统的内核和在启动系统过程中所要用到的文件。 100M左右
/tmp 临时文件,方便加载ISO镜像文件使用,对于多用户系统或者网络服务器来也有独立挂载的必要。临时文件目录,也是最常出现问题的目录之一。 一般设置1-5G

三、安装后新增硬盘

系统安装完成之后,有时候因为硬盘容量不够等原因会新增一些新的硬盘。那么添加新的硬盘之后应该做些什么?
1. 对磁盘进行分区,以新建可用的分区
2. 对该分区进行格式化,以创建系统可用的文件系统
3. 可对刚新建的文件系统进行检验
4. 创建挂载点,挂载新硬盘

1. 查看当前磁盘使用情况

  1. df -h

首先查看当前硬盘使用情况,看看哪些地方需要增加存储容量。

虽然此刻各目录还有足够的空间,但考虑/home和/usr 后续还有一些新增数据。因此确定新增硬盘用于挂载到/home和/usr上。

2. 查看新增硬盘设备

  1. fdisk -l

命令的作用是列出当前系统中所有硬盘设备及其分区的信息(fdisk只有root才能执行)。新的硬盘设备还未进行初始化,没有包含有效的分区信息。/dev/sda1、/dev/sda2、/dev/sda3是已经存在的硬盘。/dev/sdb 是新增的硬盘。

Device:分区的设备文件名称。
Boot:是否是引导分区,是,则有“*”标识。
Start:该分区在硬盘中的起始位置(柱面数)。
End:该分区在硬盘中的结束位置(柱面数)。
Blocks:分区的大小,以Blocks(块)为单位,默认的块大小为1024字节。
Id:分区类型的ID标记号,对于ext3分区为83,LVM分区为8e。
System:分区类型。

3. 分区

  1. fdisk /dev/sdb #对 sdb 进行操作

fdisk交互命令:

命令 说明
a 设置可引导标记
b 编辑bsd磁盘标签
c 设置Dos操作系统兼容标记
d 删除一个分区
l 显示已知的文件系统类型,82为Linux swap分区,83为Linux分区
m 显示帮助菜单
n 新建分区
o 建立空白的DOS分区表
p 列出当前磁盘的分区表信息
q 不保存退出
s 新建空白SUN磁盘标签
t 改变一个分区的系统ID
u 改变显示记录单位
v 验证分区表
w 保存退出
x 附加功能

根据以上命令,我们可以通过以下指令进行分区。
新增分区过程:
1. fdisk /dev/sdb # /dev/sdb是新增的硬盘
2. n: 创建分区,这时候会让你选择一个分区数字,比如1
3. w或q: w是保存退出,这个需要谨慎使用,后果自负。q是不保存退出,练习时可以用。


设置分配好的分区,输入w保存退出。如果这时提示要重启才能生效,因为分区表被占用无法重新取得分区表信息。如果此刻不想重启又想让其生效,可以使用下面命令:

  1. partprobe #强制让内核重新找一次分区表

注:root在进行磁盘分区的时候,最好是在单用户维护模式下比较安全。
fdisk没有办法处理大于2TB以上的磁盘分区

4. 进行格式化(创建文件系统)

1)查看/home的文件格式

  1. df -hT

2)格式化分区

  1. mkfs -t ext4 /dev/sdb1

如果需要在创建文件系统的时候指定系统的卷标(label)、block的大小以及inode的数量,那么需要使用mkfs2命令

  1. mkfs2 [-b block大小] [-i block大小(一个inode多少容量)] [-L 卷标] [-cj] 设备

-b: 可以设置每个block大小。目前支持1024,2048,4096
-i: 多少容量给予一个inode
-c:磁盘错误检查,下达一个-c进行快速读取测试。下达两次-c -c,会测试读写。
-L: 卷标名称
-j: 成为EXT3,不加为EXT2

5. 检查

  • fsck用来检查和修正文件系统错误的命令。通常情况下只有root且文件系统有问题时才使用,否则正常情况下使用此命令,可能会造成对系统的伤害
  • badblocks用来检查硬盘或软盘扇区有没有坏轨的命令
  1. badblocks -[svw] 设备名称
  2. -s: 在屏幕中列出进度
  3. -v: 可以在屏幕上看到进度
  4. -w: 使用写入的方式来测试,建议不要使用此参数,尤其已有文件时。

6. 挂载

挂载前需要注意一下事情:

  • 单一文件系统不应该被重复挂载在不同的挂载点
  • 单一目录不应该重复挂载多个文件系统
  • 作为挂载点的目录,理论上都应该是空目录才是。如果挂载的目录不为空,那么挂载了文件系统之后,原目录下的东西就会暂时消失(被隐藏,而不是被覆盖)。

如果直接将新的分区,如 “/dev/sdb1”挂载到某个目录下,如 “/home”下,则会导致 “/home” 目录以前的全部文件被覆盖,但并未消失。且不会将此前的目录容量加上,这会导致严重的问题。

  • 所以我们需要先将 “/dev/sdb1” 挂载到 “/mnt” 下;
  • 再将 “/home/*” 所有东西复制到 “/mnt/”;
  • 接着删除 “/home/*” 全部文件;若因为与此目录有关的程序运行占用目录导致无法删除 “/home”,则利用 lsof 命令找到这些程序的 PID,然后 “kill -9 PID” 后在删除 “/home” 。lsof 命令 列出被进程所打开的文件的信息
  • 之后再解挂载 “/mnt”;
  • 最后再将 “/dev/sdb1” 挂载到 “/home”;
  • 将此写进 /etc/fstab 配置文件中,让它开启自读取
  1. >mount /dev/sdb1 /mnt
  2. >cp -Rp /home/* /mnt #R递归负责,p保持复制的权限,如果没有这个,到时后/home目录下的某文件夹的所有者和所属组都是 root,没有办法切换到此用户。
  3. >rm -rf /home #此处可能会用到 lsof 命令 --> lsof /home
  4. >umount /mnt
  5. >mount /dev/sdb1 /home

将此写进 /etc/fstab 配置文件中,让它开启自读取

  1. >vi /etc/fstab
  2. /dev/sdb1 /home ext4 defaults 0 0

第一字段:设备名或设备卷标名。
第二字段:文件系统的挂载点目录的位置。
第三字段:文件系统类型,如ext3、swap等。
第四字段:挂载参数,即mount命令“-o”选项后可使用的参数,如defaults、rw等。
第五字段:表示文件系统是否需要dump备份,一般设为1时表示需要,设为0时将被dump所忽略。

第六字段:该数字用于决定在系统启动时进行磁盘检查的顺序,0表示不进行检查,1表示优先检查,2表示其次检查。对于根分区应设为1,其他分区设为2.

系统文件/etc/fstab是系统自动挂载文件,所以不能写错,一旦写错可能导致系统直接崩溃。所以我们在保存/etc/fstab文件之后,我们必须使用命令mount -a自动实现挂载

  1. mount -a #依据配置文件/etc/fstab的内容,自动挂载
  2. mount -o remount,rw / # /etc/fstab文件修复

四、交换区的构建

如果在安装系统的时候没有分配swap,为了应付物理内存不足的情况下造成的内存扩展记录,可以构建swap在硬盘上暂时存放内存中的信息。构建步骤:
1. 分区:利用fdisk分出一个分区作为swap.
2. 格式化:利用“mkswap 设备文件名”格式化一个swap。
3. 使用:将该swap启动,“swapon 设备文件名”
4. 查看:通过free查看内存状态。

五、磁盘管理相关命令

  • df 命令可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息,它也可以显示所有文件系统对i节点和磁盘块的使用情况;
  • du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小;
  • fdisk 命令用于磁盘分区;上一节已经讲过
  • mkfs 格式化并创建文件系统。
  • fsck、badblocks磁盘检验
  • unmount 卸载
  1. unmount [-fn] 设备名或挂载点

-f: 强制卸载
-n: 不更新 /etc/mtab的情况下卸载。filesystem的挂载是记录到/etc/mtab与/proc/mounts这两个档案中的。每次我们在更动filesystem的挂载时,也会同时更动这两个档案。参考[/etc/mtab和/proc/mounts的区别]

  • e2label:修改设备label。e2label 设备名称 新的label名称
  • du
    查看当前文件大小,du -h –max-depth=1

参考

[1] Linux 磁盘分区
[2] 硬盘的存储原理和内部架构
[3] Linux 安装分区设置 分区大小 功能
[4] Linux系统安装时分区的选择
[5] 安装Linux前的规划
[6] 玩转 Linux 之:磁盘分区、挂载知多少?
[7] 给Linux新增硬盘之后
[8] 《鸟哥私房菜》磁盘的分区、格式化、检验与挂载

猜你喜欢

转载自www.cnblogs.com/migrantworkers/p/9162642.html