Linux磁盘管理

一、文件系统

要对linux磁盘管理了解,首先需要先了解什么是文件系统。

那么什么是文件系统呢?文件系统是指操作系统中负责管理和储存文件信息的软件机构称为文件管理系统。文件系统用于明确磁盘和分区上的文件的方法和数据结构,即在磁盘上组织文件的方法。所以文件系统是创建在磁盘上面的,因此我们需要先了解下磁盘。我们以机械硬盘为例如下图:

Linux磁盘管理_linuxLinux磁盘管理_linux_02

二、磁盘的组成

如上图所示,机械硬盘的组成部分主要有磁盘面、磁头、磁道、柱面和扇区磁盘面负责数据的存储

磁盘面:磁盘是由一叠磁盘面组成,如上图。

磁头(Heads):每个磁头对应一个磁盘面,负责该磁盘面上的数据的读写。

磁道(Track):每个盘面会围绕圆心划分出多个同心圆圈,每个圆圈叫做一个磁道。

柱面(Cylinders):所有盘片上的同一位置的磁道组成的立体叫做一个柱面。

扇区(Sector):以磁道为单位管理磁盘仍然太大,所以又把每个磁道划分出了多个扇区,如上图

三、linux下的磁盘管理

由上面我们知道什么是文件系统和机械师硬盘的组成结构,那么对于linux下的磁盘我们如何进行管理呢?

首先我们需要了解一个重要的概念:linux下一切皆文件。了解这点对于我们来说非常重要,这样对于我们了解linux下的磁盘管理非常重要。下面我们来说下关于查看linux下磁盘的一些使用信息的命令:

1、查看磁盘分区

[root@localhost ~]# fdisk -l <<==============使用命令 fdisk -l


 

Disk /dev/sda: 128.8 GB, 128849018880 bytes

 

255 heads, 63 sectors/track, 15665 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: 0x00073570

 

  

 

Device Boot Start End Blocks Id System

 

/dev/sda1 *1 26 20480083 Linux

 

Partition 1 does not end on cylinder boundary.

 

/dev/sda2 26 785962914560 8e Linux LVM

 

Disk /dev/mapper/vg0-root: 21.5 GB, 21474836480 bytes

 

255 heads, 63 sectors/track, 2610 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

如上面所示:我们查出现在系统上有一块磁盘是sda在dev目录下,其中sda分了2个分区,在/dev/sda1和/dev/sda2。那么我们看下他们的标题所表示的意思:

§ Device:表示分区的设备文件名称。

§ Boot :表示是否是引导分区。是,则有“*”标识

§ Start :表示该分区在硬盘中的起始位置(柱面数)

§ End  :表示该分区在硬盘中的结束位置(柱面数)

§ Blocks:表示分区的大小,以Blocks(块)为单位,默认大小为1024字节

§ Id :表示分区对应系统ID号。83表示Linux中的EXT4分区、82表示Swap分区、8e表示LVM逻辑卷。

如上面所示我们知道现在系统中的磁盘为sda和其中的一些基本信息,那么我们如果对此磁盘增加分区呢。由上面的是信息我们可了解到我们的磁盘空间为128.8GB、15665柱面,其中sda1和sda2占了7895个柱面,因此我们还有很多的空间可以使用。下面我们将使用命令来建立一些新的分区。

2、新分区创建

[root@localhost ~]# fdisk /dev/sda

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

switch off the mode (command 'c') and change display units to

sectors (command 'u').

 

Command (m for help):

如上图,我是以我的电脑中的磁盘为标准使用命令 fdisk /dev/sda 就可以对当前的磁盘sda进行再分区的处理,当然我们输入命令的同时还有很多子选项。下面我们来看下这些子选项的内容:

输入m可以查看帮助信息的内容如下:

[root@localhost ~]# fdisk /dev/sda

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

switch off the mode (command 'c') and change display units to

sectors (command 'u').

 

Command (m for help): m

Command action

a toggle a bootable flag

b edit bsd disklabel

c toggle the dos compatibility flag

d delete a partition <<==============删除分区

l list known partition types <<==============查看ID号

m print this menu

n add a new partition <<==============新建一个分区

o create a new empty DOS partition table

p print the partition table <<==============列出分区信息

q quit without saving changes <<==============不保存退出

s create a new empty Sun disklabel

t change a partition's system id <<==============改变分区的ID号

u change display/entry units

v verify the partition table

w write table to disk and exit <<==============保存退出

x extra functionality (experts only)

 

Command (m for help):

以上是我们常用的一些选项。

然后输入n创建一个新分区:

 

[root@localhost ~]# fdisk /dev/sda

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

switch off the mode (command 'c') and change display units to

sectors (command 'u').

 

Command (m for help): n

Command action

e extended <<=======扩展分区

p primary partition (1-4) <<=======主分区

如上所示,当输入n需要创建一个分区的时候,系统会让你选择是创建一个什么样的分区,(注:其中一块磁盘最多可以创建4个主分区,扩展分区可以创建多个。使用fdisk命令对于一块磁盘来讲,最多只能管理15个分区)

 

[root@localhost ~]# fdisk /dev/sda

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

switch off the mode (command 'c') and change display units to

sectors (command 'u').

 

Command (m for help): n

Command action

e extended

p primary partition (1-4)

p <<=======选择创建主分区

Partition number (1-4): 3 <<=======主分区编号为3

First cylinder (7859-15665, default 7859): <<=======选着起始柱面

Using default value 7859

Last cylinder, +cylinders or +size{K,M,G} (7859-15665, default 15665): +10G <<=======选着结束柱面(我们可以以+K,M,G的形式来添加)我这边所使用的+10G

 

Command (m for help):

如上所示我们的一个磁盘分区就创建完成了,我们要查看新建的磁盘分区可以使用命令p来试下,如下:

 

Command (m for help): p

 

Disk /dev/sda: 128.8 GB, 128849018880 bytes

255 heads, 63 sectors/track, 15665 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: 0x00073570

 

Device Boot Start End Blocks Id System

/dev/sda1 * 1 26 204800 83 Linux

Partition 1 does not end on cylinder boundary.

/dev/sda2 26 7859 62914560 8e Linux LVM

/dev/sda3 7859 9164 10489446 83 Linux

 

Command (m for help):

如上所示我们的sda3就创建完成了,当然我们这边还有对以上所有的操作进行保存。在命令提示符下输入w。这样新的磁盘空间就创建完成了。

3、新分区的识别


对于我们新创建的分区,系统内核可能无法识别。我们使用命令cat 查看proc/partitions查看当前系统识别的磁盘分区,如下:

[root@localhost ~]# cat /proc/partitions

major minor #blocks name

 

8 0 125829120 sda

8 1 204800 sda1

8 2 62914560 sda2

新分区无法识别我们可以使用命令partx -a 后面跟上磁盘的路径如下:

[root@localhost ~]# partx -a /dev/sda

BLKPG: Device or resource busy

error adding partition 1

BLKPG: Device or resource busy

error adding partition 2

[root@localhost ~]# partx -a /dev/sda

BLKPG: Device or resource busy

error adding partition 1

BLKPG: Device or resource busy

error adding partition 2

BLKPG: Device or resource busy

error adding partition 3

[root@localhost ~]# cat /proc/partitions

major minor #blocks name

 

8 0 125829120 sda

8 1 204800 sda1

8 2 62914560 sda2

8 3 10489446 sda3

253 0 20971520 dm-0

253 1 2097152 dm-1

253 2 10485760 dm-2

253 3 20971520 dm-3

[root@localhost ~]#

如上所示我们可以发现我们刚才创建的sda3,但是有的时候partx这个命令我们需要使用两次才可以。

这样我们的新磁盘分区就创建好了,磁盘新的分区是创建好了,但是如何去实现文件系统的创建呢,新的分区如何创建磁盘系统呢?

4、文件系统的创建

上面我们所做的操作新的磁盘分区我们已经创建好了,但是如何在新的磁盘分区上面创建文件系统?当然linux系统上面支持众多的文件系统(如:ext2, ext3, ext4, xfs, btrfs, reiserfs, jfs, swap等)我们这边是以Centos 6为例,当然在centos上面最常用的文件系统是ext,这个文件系统也有很多的版本,我们这边以etx4为例。

     创建文件系统我们使用命令:

mkfs.FS_TYPE  /dev/DEVICE

我们把之前创建的新的磁盘分区创建为ext4的文件系统,如下:

[root@localhost ~]# mkfs.ext4 /dev/sda3 <<======指定文件系统ext4 路径问/dev/sda3

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 blocks

655776 inodes, 2622361 blocks

131118 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=2688548864

81 block groups

32768 blocks per group, 32768 fragments per group

8096 inodes per group

Superblock backups stored on blocks:

32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

 

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 20 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

[root@localhost ~]#

这样我们新分区上的一个文件系统就创建完成了。

对于ext系类的文件系统我们也可以使用mke2fs来创建,当然这个命令也可以跟很多选项,这边简要的说明几个常用的如下:

          -t  {ext2|ext4|ext4}:指定文件系统类型

          -b {1024|2048|4096}:创建块大小(注:默认的为4096)

          -L “LABEL”:指定卷标

          ........

那么我们来测试下如:创建/dev/sda3的文件系统,块大小为2048,文件系统ext4,标为卷TEST

[root@localhost ~]# mke2fs -t ext4 -b 2048 -L "TEST" /dev/sda3

mke2fs 1.41.12 (17-May-2010)

Filesystem label=TEST <<======卷标为“TEST”

OS type: Linux

Block size=2048 (log=1) <<======块大小为2048

Fragment size=2048 (log=1)

Stride=0 blocks, Stripe blocks

657408 inodes, 5244722 blocks

262236 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=543162368

321 block groups

16384 blocks per group, 16384 fragments per group

2048 inodes per group

Superblock backups stored on blocks:

16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816, 1327104,

2048000, 3981312

 

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 22 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

[root@localhost ~]#

这样我们新分区的文件系统就创建好了。文件系统创建好了,但是我们如何去使用它呢?

5、挂载磁盘

以上我们了解了磁盘的分区、载入新分区和创建新分区的文件系统。我们下面来简单的说明下新分区文件系统的挂载:

          这里我我们要使用命令mount,当然我们也可以只使用mount显示当前系统所挂载的所有设备,如:

[root@localhost ~]# mount

/dev/mapper/vg0-root on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda1 on /boot type ext4 (rw)

/dev/mapper/vg0-usr on /usr type ext4 (rw)

/dev/mapper/vg0-var on /var type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

[root@localhost ~]#

当然上图是我们使用mount命令查看当前系统上面所挂载的设备,而我们新建的文件系统还没有挂载,所以不会显示。

mount的用法:

                        mount [-fnrsvw] [-t vfstype] [-o options] device dir

device:指明要挂载的设备;

(1) 设备文件:例如/dev/sda5

(2) 卷标:-L 'LABEL', 例如 -L 'MYDATA'

(3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'

(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs

dir:挂载点

事先存在;建议使用空目录;

进程正在使用中的设备无法被卸载;

[root@localhost ~]# mount /dev/sda3 /media/disk/ <<========将/dev/sda3这分区挂载到/media/disk(注:disk是目录,且必须事先存在)

[root@localhost ~]# mount <<========然后我们使用mount命令查看挂载信息

/dev/mapper/vg0-root on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda1 on /boot type ext4 (rw)

/dev/mapper/vg0-usr on /usr type ext4 (rw)

/dev/mapper/vg0-var on /var type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

/dev/sda3 on /media/disk type ext4 (rw) <<=========我们刚才挂载的sda3就现在在这边了

[root@localhost ~]#

这样我们的sda3就挂载完成了,我们可以su到里面来建些文件来试下。

[root@localhost ~]# cd /media/disk/

[root@localhost disk]# ll

total 16

drwx------ 2 root root 16384 Aug 26 03:19 lost+found

[root@localhost disk]# touch a.txt <<=========创建一个文件

[root@localhost disk]# mkdir deanzhu <<=========创建一个目录

[root@localhost disk]# ll

total 18

-rw-r--r-- 1 root root 0 Aug 26 05:57 a.txt

drwxr-xr-x 2 root root 2048 Aug 26 05:57 deanzhu

drwx------ 2 root root 16384 Aug 26 03:19 lost+found

[root@localhost disk]#

当然对于mount这个命令本事来说它还有很多选项如:

常用命令选项:

-t vsftype:指定要挂载的设备上的文件系统类型;

-r: readonly,只读挂载;

-w: read and write, 读写挂载;

-n: 不更新/etc/mtab;

-a:自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有“自动挂载”功能)

-L 'LABEL': 以卷标指定挂载设备;

-U 'UUID': 以UUID指定要挂载的设备;

-B, --bind: 绑定目录到另一个目录上;

当然我们这边了解了挂载,加入我想取消挂载要怎么做呢,我们要使用命令umount后面加上挂载点的位置或者是挂载分区的位置,如:

[root@localhost ~]# umount /dev/sda3 <<=========取消sda3的挂载

[root@localhost ~]# mount <<=========使用mount命令再次查看就没有sda3挂载了

/dev/mapper/vg0-root on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda1 on /boot type ext4 (rw)

/dev/mapper/vg0-usr on /usr type ext4 (rw)

/dev/mapper/vg0-var on /var type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

[root@localhost ~]#

注:我们使用命令这种方式挂载它只是一时性的,当我们将系统重启过之后挂载就会消失,那么就需要重新挂载才可以使用。

6、修改配置文件,使系统重启后不需要重新挂载

文件挂载的配置文件:/etc/fstab,我们来查看下/etc/fstab这个文件。

[root@localhost ~]# cat /etc/fstab

 

#

# /etc/fstab

# Created by anaconda on Fri Aug 14 12:36:21 2015

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

/dev/mapper/vg0-root / ext4 defaults 1 1

UUID=06cc06e7-3636-40b1-8135-409f4a840747 /boot ext4 defaults 1 2

/dev/mapper/vg0-usr /usr ext4 defaults 1 2

/dev/mapper/vg0-var /var ext4 defaults 1 2

/dev/mapper/vg0-swap swap swap defaults 0 0

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

要挂载的设备或伪文件系统  挂载点  文件系统类型   挂载选项  储频率 自检次序

如上其中每行定义一个要挂载的文件系统;上图中我已经将每行所表示的意思用红字标出,下面也做了相应的解释,如下:

要挂载的设备或伪文件系统:设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc, sysfs)

挂载选项:defaults(这个是默认值)

转储频率:0:不做备份;1:每天转储;2:每隔一天转储

自检次序:0:不自检;1:首先自检;一般只有rootfs才用1;等

如果我们要想系统在启动时自动挂载文件系统,我们只需要编辑/etc/fstab这个文件即可。

四、小结

对于linux的磁盘管理我这边只是提到一点点的内容,当然如果你要是想了解更多的关于linux下的磁盘管理和文件系统还需要学习的更多。我这边在写下点命令都是和linux磁盘管理和系统管理有关的,有时间的话可以去查看下具体的用法(swapon:挂载交换分区;free [OPTION]:查看内存空间使用状态;df:文件系统空间占用等信息查看;blkid:块设备属性信息查看;mkswap:创建交换分区等)这纯属个人学习的一些总结,还有很多不足的地方。