原文: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 固态硬盘和机械硬盘
- 性能方面,固态硬盘完胜机械硬盘。固态硬盘的读写速度要比机械硬盘的读写速度高,一般要高2倍左右的速度读写能力。
- 机械硬盘容量大,价格低。固态硬盘容量普遍偏小,价格昂贵。
- 固态硬盘几乎0噪音,机械硬盘噪音较大
- 机械硬盘的体积要比固态硬盘大,所以重量也要比固态硬盘重
- 在功耗方面,固态硬盘也要低于传统的机械硬盘
二、安装时分区
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. 查看当前磁盘使用情况
df -h
首先查看当前硬盘使用情况,看看哪些地方需要增加存储容量。
虽然此刻各目录还有足够的空间,但考虑/home和/usr 后续还有一些新增数据。因此确定新增硬盘用于挂载到/home和/usr上。
2. 查看新增硬盘设备
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. 分区
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保存退出。如果这时提示要重启才能生效,因为分区表被占用无法重新取得分区表信息。如果此刻不想重启又想让其生效,可以使用下面命令:
partprobe #强制让内核重新找一次分区表
注:root在进行磁盘分区的时候,最好是在单用户维护模式下比较安全。
fdisk没有办法处理大于2TB以上的磁盘分区
4. 进行格式化(创建文件系统)
1)查看/home的文件格式
df -hT
2)格式化分区
mkfs -t ext4 /dev/sdb1
如果需要在创建文件系统的时候指定系统的卷标(label)、block的大小以及inode的数量,那么需要使用mkfs2命令
。
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用来检查硬盘或软盘扇区有没有坏轨的命令
badblocks -[svw] 设备名称
-s: 在屏幕中列出进度
-v: 可以在屏幕上看到进度
-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 配置文件中,让它开启自读取
>mount /dev/sdb1 /mnt
>cp -Rp /home/* /mnt #R递归负责,p保持复制的权限,如果没有这个,到时后/home目录下的某文件夹的所有者和所属组都是 root,没有办法切换到此用户。
>rm -rf /home #此处可能会用到 lsof 命令 --> lsof /home
>umount /mnt
>mount /dev/sdb1 /home
将此写进 /etc/fstab 配置文件中,让它开启自读取
>vi /etc/fstab
/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自动实现挂载
mount -a #依据配置文件/etc/fstab的内容,自动挂载
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 卸载
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] 《鸟哥私房菜》磁盘的分区、格式化、检验与挂载