Linux 学习笔记(七)增加硬盘

1 硬盘接口

  • PATA 也叫做 IDE,是作为 PC 的一种简单而廉价的接口而开发的。因为它把硬件控制器和硬盘片本身放置在一个盒子内,并且在计算机和硬盘之间使用一种相对高层的协议进行通信,所以最初它被称为“集成驱动器电路”。这就是所有现代硬盘的标准体系结构,但其名称沿用了下来。IDE 硬盘的速度中等、容量大,并且非常便宜。
  • SATA,Serial ATA 串行 ATA 是传统 IDE 的后续技术。除了支持更快的传输速率之外,SATA 通过清楚的连线和更长的最大电缆长度让连接更简单。SATA 本身支持热插拔和命令队列功能,这两种功能最终让 IDE 在服务器领域可以成为 SCSI 的一种替代选择。
  • SCSI 虽然不如以前那么流行了,但它仍然是得到最广泛支持的硬盘接口之一。它有几种不同的形式,所有形式都支持在一条总线上安装多个硬盘,并且支持不同的速率和多种通信类型。
  • 光纤通道(Fibre Channel)是在企业环境中正得到广泛应用的串行接口,因为它的带宽高,一次能够连接大量的设备。光纤通道设备通过光纤或者双铜轴电缆连接在一起。现在其速度能够达到 100 MB/s 以上。常见的拓扑包括 FC-AL(Fibre Channel Arbitrated Loop,光纤通道仲裁环路)的环形结构和使用光纤通道开关的交叉开关结构。光纤通道可以使用几种不同的协议,其中包括 SCSI 甚至 IP。光纤通道设备名可以由称为 World Wide Name 的硬连线 ID 号进行识别,它和以太网 MAC 地址类似。
  • USB,对于连接键盘和鼠标这样的设备来说,USB(Universal Serial Bus,通用串行总线)已经开始变得流行起来,但它的当前版本也有足够的带宽来支持像硬盘和 CD-ROM 驱动器这样的设备。USB 在个人电脑上使用得非常普遍,它能让您很容易地在系统之间移动硬盘。

2 Linux 文件系统

随着 Linux 从各种不同的操作系统吸收了许多特性,Linux 上的文件系统一直在快速演变。内核的 VFS (Virtual File System) 层对于 PC 来说特别方便,因为它提供了安装“原始”文件系统(比如臭名昭著的 Windows FAT 文件系统)所需要的框架。

2.1 ext2fs, ext3fs 和 ext4fs

Second Extended File System,也常称为 ext2fs,在过去很长时间里一直是主流的 Linux 文件系统。虽然 ext2 的代码是专为 Linux 编写的,但是它采用了许多源自于 BSD FFS 文件系统的概念,后者由 Kirk McKusick 和他的小组在 1986 年设计和实现。

ext3fs (Third Extended File System) 是对 ext2fs 的一种非常知名的扩充,它最初由 Stephen Tweedie 开发,ext3fs 向现有的 ext2fs 代码加入了日志功能,从概念上说很简单的修改却大大增加了可靠性。更有意思的是,甚至不必改变 ext2fs 的基础结构,就可以实现 ext3fs 扩展。实际上,您仍然可以把一个 ext3fs 文件系统当成 ext2fs 文件系统来安装——它只是不会启动日志功能而已。

ext4fs (Fouth Extended File System) 是 ext3fs 文件系统的后继版本,目前已经成为众多 Linux 发行版本的默认文件系统而被使用。ext4 原始的开发目标是一系列的向下兼容 ext3、移除其 64 位限制与提升其性能的延伸包。然而,某些 Linux 开发者因稳定性原因而拒绝将这些延伸包应用在 ext3 上,并要求其作为 ext3 的分支,改名为 ext4 并另行开发,以免影响到目前的 ext3 用户。该要求被接受以后,ext3 维护者西奥多·周(Theodore Ts'o)在2006年6月28日公开了ext4的开发计划。ext4 具有几个特别强悍的特性:

  • 可支持最高1 EB (1 EB = 10242 TB) 的分区与最大 16 TB 的文件
  • 向下直接兼容 ext2 与 ext3
  • 突破 32000 子目录限制,ext3 的一个目录下最多只能有 32000 个子目录。ext4 的子目录最高可达 64000 个。

关于 ext4 更详细信息可利用搜索引擎查找 ext4 关键字进行查阅。

2.2 ReiserFS

Hans Reiser 开发的 ReiserFS 是另一种在 Linux 上新出现的文件系统,SUSE 把它作为自己默认的文件系统。和 ext4fs 一样,ReiserFS 也是一种日志文件系统,因此能够维护文件系统的一致性。不必担心诸如系统崩溃、意外重启这样的异常事件(这在膝上或者桌上工作站环境里是很常见的)。

除了日志功能以外,ReiserFS 还会提供一种模块化的文件系统接口,通过这个接口,应用软件开发人员和系统管理员可以在非常细的粒度上指定应该怎样处理(和保护)文件。这项功能有可能在特殊环境里增强文件的安全性。ReiserFS 由 DARPA(国防部高级研究计划署,与资助创立 Internet 的是同一个单位)提供资助,它是声称为达到军用级别的安全性而设计的唯一开放源代码的文件系统。

2.3 XFS 和 JFS

在这类“现代、主流的 Linux 文件系统”中还有两个竞争者,它们就是 SGI 的 XFS 和 IBM 的 JFS。目前的内核和发行版本都支持它们,它们都是高性能的日志文件系统,而且有自己的支持者,但它们似乎都没有 ext4fs 和 ReiserFS 使用广泛。更多关于这两个文件系统的信息可以在网上找到更多资料。

3 hdparm: 设置 IDE 接口参数

hdparm 这个程序通过和 Linux 的 SATA/IDE 驱动程序打交道来获得和改变硬盘的参数。hdparm 能够设置硬盘的供电模式、启用或者禁用 DMA (DMA 只属于 IDE 的概念,不属于 SATA)、设置只读标志、以及打印详细的硬盘信息。

调用 hdparm 命令的语法为:

hdparm [ flags ] [device] ..

不带参数运行 hdparm 命令会输出当前硬盘的设置:

$ sudo hdparm /dev/sda
/dev/sda:
multcount     = 16 (on)
IO_support    =  1 (32-bit)
readonly      =  0 (off)
readahead     = 256 (on)
geometry      = 121601/255/63, sectors = 1953525168, start = 0

默认情况下,硬盘的设置已经相当高效了。我们来看一下各个标志所代表的意思:

  • multcount (multiple sector count 的缩写),这个标志控制了在一次单独的 I/O 中断当中,可以从磁盘中读取的磁道数。几乎所有现代的 IDE 驱动器都支持 multcount。
  • IO_support 32 位 I/O 的支持,如果没有开启该支持,可以通过 hdparm -c1 /dev/sda 来开启 32 位 I/O 的支持。
  • readonly 硬盘只读标志,除非必要,这个值都应该设置为 0,否则硬盘将只能读取而不能写入信息。

我们可以通过运行 hdparm 的性能评测判断硬盘的读取速度:

$ sudo hdparm -Tt /dev/sda
/dev/sda:
Timing cached reads:   8342 MB in  2.00 seconds = 4175.16 MB/sec
Timing buffered disk reads:  332 MB in  3.01 seconds = 110.42 MB/sec

“cached reads(调整缓存读)”表示 IDE 总线上的数据传输速率(和物理硬盘介质的吞吐量无关),而“buffered disk reads(缓冲读)”表示物理盘片的读开销。我们测试的这款硬盘速度还不算慢吧,虽然 110 MB/s 还无法与 SSD 硬盘的读取速度 530 MB/s 的速度相比。

4 fsck: 检查和修复文件系统

fsck(file system check)用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用 fsck 命令对文件系统进行检查。

使用方法:

fsck [-sAVRTMNP] [-C [fd]] [-t fstype] [filesys…] [–] [fs-specific-options]

检查与修复 Linux 文件系统,可以同时检查一个或多个 Linux 文件系统

参数说明
filesysdevice (eg. /dev/sda1), mout (eg. / or /usr)
-t给定文件系统类型,如 ext4
-s依序一个一个地执行 fsck 的指令来检查
-A对 /etc/fstab 中所有列出来的 partition 做检查
-C显示完整的检查进度
-P同时有 -A 条件时,同时有多个 fsck 的检查一直执行
-R同时有 -A 条件时,省略根目录 / 不检查
-V详细显示模式
-a如果检查有错则自动修复
-r如果检查有错则由使用者回答是否修复
-y选项指定检测每个文件是自动输入 yes

5 实例: 向 Linux 增加硬盘

在对硬盘进行分区之前,首先应该检查是否已经有了该硬盘的设备文件,在 Linux 上,硬盘设备文件的名字采用 /dev/sdXN 的形式,这里的 X 是一个小写字母,表示驱动器,N 是分区号,从 1 开始进行编号。要表示整个硬盘,只要省略掉分区号就可以了。

确定好需要分区的硬盘之后就可以开始进行操作了,使用 Linux 的 fdisk 分区工具来进行分区。

fdisk 是一个交互程序,按下 m 键会显示出它的所有命令。常用的命令有

命令功能
nnew 创建一个新分区
ttype 改变分区的类型
pprint 打印分区表
wwrite 将分区表写入硬盘
ddelete 删除分区
mmenu 显示功能菜单

这里我有一块新的硬盘 /dev/sdb 作为测试实例,因为硬盘还没有分区,所以需要先创建新分区。如果硬盘原来有老分区,那么在创建新分区之前,必须先用 fdiskdelete 命令删除它们或者如果你想保留原来分区也可以使用 type 命令改变分区类型。用 fdisk 程序把分区表写入硬盘之前,它不会改变任何东西。

$ sudo fdisk /dev/sdb

分区表可以容纳 4 个“主(primary)”分区,它们可以用来保存数据。另一种方法是创建一个“扩展(extended)”分区,它是一个主分区,指向了又一个分区表,能再有 4 个“逻辑(logical)”分区。虽然使用扩展分区能够克服正常情况下只有 4 个分区的限制,但如果仅仅需要不多的几个分区的话,只采用主分区仍是最简单的做法。

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-19457, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-19457, default 19457): +30G

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x014b014a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        3917    31462278   83  Linux

我们以相似的方式创建一个交换分区,唯一的不同在于我们把分区类型从 Linux 改为 Linux swap。虽然内核并不关注分区类型,但是有些程序或者脚本会试着用类型来判断每个分区是什么分区。目前,Linux swap 分区不能超过 2GB,这可能超出了绝大多数应用的需要,但是既然我们有多余的硬盘空间,那么就可以表现得慷慨一些。如果 mkswap 不能使用我们分配给它的全部空间,那么它会向我们发出警告。

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (3917-19457, default 3917): 3917
Last cylinder, +cylinders or +size{K,M,G} (3917-19457, default 19457): +1G

Command (m for help): type
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap / Solaris)

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x014b014a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        3917    31462278   83  Linux
/dev/sdb2            3917        4048     1052257+  82  Linux swap / Solaris

接着我将第 3 个分区包含硬盘剩下的全部空间,我们以类似的方式设定它。在写入分区表之前,我们最后再审核一遍它。

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x014b014a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        3917    31462278   83  Linux
/dev/sdb2            3917        4048     1052257+  82  Linux swap / Solaris
/dev/sdb3            4048       19457   123772793   83  Linux

如果分区不是在柱面边界处结束的,那么磁盘块数(blocks)旁边就会出现一个加号。您可以删除这个分区,(按照上面的显示)键入柱面数重新创建它,也可以保持原状,浪费一点儿硬盘空间。我们对新的分区表很满意,最后使用 write 命令将它写入硬盘。

现在我们已经为创建文件系统做好了准备。要创建一个 ext4fs 文件系统的话,只要运行 mkfs.ext4 命令并带上设备名作为参数。

$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1901280 inodes, 7602753 blocks
380137 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
233 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

然后我们在文件系统上运行 fsck 命令,以确保它们已经正确的创建好了。使用 -f 标志迫使 fsck 一定检查新的文件系统,而不会假定它们已经清理干净了。

$ sudo fsck -f /dev/sdb1
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdb1: 11/1901280 files (0.0% non-contiguous), 163345/7602753 blocks

新文件系统的安装点一创建好就可以安装该文件系统了:

$ sudo mkdir /bkroot
$ sudo mount /dev/sdb1 /bkroot

为了让系统在引导的时候安装新的文件系统,我们在文件 /etc/fstab 中为每一个新文件系统加了一行。每行应该列出设备名、安装点、文件系统类型、安装选项、备份频度以及 fsck 检查的次序,添加设备名的时候应该使用推荐的 UUID 作为标识硬盘分区的唯一标识,以免发生因重新配置硬盘设备而产生的挂载失败现象,分区的 UUID 可以通过命令:

$ sudo blkid /dev/sdb1

进行查询,不带参数的 blkid 将列出系统上所有硬盘分区的信息。

$ sudo blkid
/dev/sda1: UUID="2620575a-200a-4aa1-88db-f05c09d55df0" TYPE="ext4" 
/dev/sda5: UUID="3fc981c5-fe38-400c-99df-c400d62b9fbd" TYPE="ext4" 
/dev/sdb1: UUID="e2b3010d-02d1-48d7-bf8f-45a6f3ae8a42" TYPE="ext4"
/dev/sdb5: UUID="0003132B000BD914" TYPE="ntfs" 
/dev/sdc1: UUID="07a8f477-1112-457e-8035-fa561d78d67b" TYPE="ext4" 
/dev/sdc3: LABEL="winning" UUID="31C42845422F4DCB" TYPE="ntfs" 
/dev/sdc5: UUID="738d17b8-4be3-474d-843d-6f65ab74a5a2" TYPE="ext4" 

顺利找到 UUID/etc/fstab 文件中添加一行

# 设备名    挂载点   文件系统    选项    备份频度    fsck 检查的次序

UUID=e2b3010d-02d1-48d7-bf8f-45a6f3ae8a42     /bkroot    ext4    defaults    0   3

最后重启系统测试对 /etc/fstab 文件所做的修改是否正确,还要确保新的文件系统都正确地挂到系统上了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值