第7章我的地盘我做主——Linux磁盘及文件系统管理

日常操作系统的使用几乎都是围绕着文件系统而展开的,一块新的硬盘安装到计算机上后并不是马上就可以使用,我们需对其进行分区、格式化后才可以使用。每种操作系统都是自己特有的文件系统,在本章主要讲解如何在Linux系统中对硬盘进行分区和格式化。

7.1 Linux磁盘分区

和大多数操作系统一样Linux允许将磁盘分割为多个分区,每个分区实际上被当做一个独立的磁盘。创建分区的过程叫做磁盘分区。

7.1.1 Linux硬盘管理方式

不同的操作系统都有其固定的记录磁盘分区信息的方式。因为传统上Linux可以与以DOS为基础的系统间互相操作,所以常见的分区方案是DOS分区。DOS分区方案特征如下,如图7-1所示。

图7-1 /dev/sda

(1)MBR:每个磁盘的第一个数据块(512字节)为其主引导记录(Master Boot Record,MBR)。在MBR中主要包括以下内容。

● 引导程序(Bootloader):在可引导磁盘上,MBR中有一个低层可执行文件叫引导程序,引导时BIOS将控制权交给引导程序,引导程序负责装载然后将控制权交给合适的操作系统。

● 分区表(Partiton Table):在每个磁盘上,引导记录中的64个字节被保留为磁盘分区表。在这个空间中最多可以记录4个分区。

(2)主分区:每个磁盘最多可以划分4个主分区,其属性记录在MBR的分区表中。Linux将主分区命名为1~4。在图7-1中第一个主分区是/dev/sda1、第二个主分区是/dev/sda2。

(3)扩展分区:为了解决一块磁盘只能划分4个分区而引入了扩展分区,只有在主分区小于4个时才可以划分扩展分区,在一块磁盘上最多只能有一个扩展分区。扩展分区本身并不能保存用户数据,必须在扩展分区中进一步划分成多个逻辑分区。扩展分区并不是必需的,如果一个磁盘上的4个分区够用就不必再使用扩展分区。

(4)逻辑分区:在扩展分区中可以建立多个逻辑分区。逻辑分区的分区信息作为一个链表存在,所以在理论上讲可以建立的逻辑分区的数目不受限制。在实际工作中,设备驱动程序会限制这个数目,如果在IDE硬盘最多可以划分63 个分区、SCSI硬盘最多可以划分15个分区。Linux总是把第一个逻辑分区标记为5,即使没有使用所有的4个分区,逻辑分区也是从5开始。

7.1.2 通过命令对磁盘进行分区

在Linux中最常用的分区工具是fdisk。这个命令行工具可以在最基本的环境中选择,但是只有root用户可以使用。该命令语法如下。

        fdisk [-l] [设备号]

常用指数:

常用选项:

● 设备号:需要进行配置的磁盘。

● -l:显示指定磁盘的分区情况。

fdisk命令的选项并不多,主要的操作是进入fdisk环境的相关操作,下面看几个fdisk命令的例子。

1.显示所有硬盘的分区情况

在fdisk -l显示的信息中,该计算机共有两块非IDE硬盘,其中/dev/sda已经有分区,/dev/sda还没有进行分区。

        [root@srv ~]# fdisk -l
        Disk /dev/sda: 214.7 GB, 214748364800 bytes
        255 heads, 63 sectors/track, 26108 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot      Start       End      Blocks   Id  System
        /dev/sda1   *          1         25     200781   83  Linux
        /dev/sda2            26       6399    51199155   83  Linux
        /dev/sda3          6400      12773    51199155    83  Linux
        /dev/sda4          12774      26108   107113387+   5  Extended
        /dev/sda5          12774      15323   20482843+   83  Linux
        /dev/sda6          15324      17873   20482843+   83  Linux
        /dev/sda7          17874      20423   20482843+   83  Linux
        /dev/sda8          20424      21698   10241406    83  Linux
        /dev/sda9          21699      21829     1052226   82  Linux swap / Solaris
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
        Disk /dev/sdb doesn't contain a valid partition table

2.显示指定硬盘的分区情况

显示第一块非IDE硬盘的分区情况。

        [root@srv ~]# fdisk -l /dev/sda
        Disk /dev/sda: 214.7 GB, 214748364800 bytes
        255 heads, 63 sectors/track, 26108 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot      Start         End     Blocks     Id  System
        /dev/sda1   *          1         25     200781   83  Linux
        /dev/sda2            26       6399    51199155      83  Linux
        /dev/sda3          6400      12773     51199155     83  Linux
        /dev/sda4          12774      26108   107113387+   5  Extended
        /dev/sda5          12774      15323   20482843+     83  Linux
        /dev/sda6          15324      17873   20482843+     83  Linux
        /dev/sda7          17874      20423   20482843+     83  Linux
        /dev/sda8          20424      21698   10241406      83  Linux
        /dev/sda9          21699      21829    1052226   82  Linux swap / Solaris

3.使用fdisk创建及管理硬盘分区

使用fdisk命令进行分区时,直接使用“fdisk设备号”即可进入fdisk命令环境,比如要对第二块非IDE硬盘进行分区,可使用“fdisk/dev/sdb”。

        [root@srv ~]# fdisk /dev/sdb
        Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
        Building a new DOS disklabel. Changes will remain in memory only,
        until you decide to write them. After that, of course, the previous
        content won't be recoverable.
        1) software that runs at boot time (e.g., old versions of LILO)
        2) booting and partitioning software from other OSs
          (e.g., DOS FDISK, OS/2 FDISK)
        Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
        Command (m for help):

在进入fdisk环境后,需要使用一系统指令进行分区操作。可以通过“m”查看这些指令的帮助信息。下面是几个在fdisk环境中常用的指令。

(1)p:显示当前磁盘分区情况。在显示内容中“Disk/dev/sdb:225.4 GB,225485783040 bytes”表示第二块非IDE硬盘的容量为210G;“255 heads,63 sectors/track,27413 cylinders”是fdisk计算的柱面数等信息;“Units=cylinders of 16065*512=8225280 bytes”是每个柱面的大小为8M多一点;接下来是磁盘的分区表信息每列含义如下:

● Device:指向这个设备节点,通常作为这个分区的名称使用。

● Boot:如果在该表有“*”表示所在行的分区是可引导的,每个磁盘上可以有一个主分区被标为可引导。

● Start、End:分区开始和结束的柱面。

● Blocks:以1024字节的块为计算单位的分区大小。

● Id:一个2位的十六进制数,代表分区类型。

● System:Id定义的分区类型的文本名称。

        Command (m for help): p
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot     Start        End     Blocks   Id  System

(2)n:建立新的分区、w保存fdisk的修改并退出、q不保存fdisk的修改并退出。

● 使用fdisk命令为/dev/sdb管理分区。

        [root@srv ~]# fdisk /dev/sdb
        Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
        Building a new DOS disklabel. Changes will remain in memory only,
        until you decide to write them. After that, of course, the previous
        content won't be recoverable.
        1) software that runs at boot time (e.g., old versions of LILO)
        2) booting and partitioning software from other OSs
          (e.g., DOS FDISK, OS/2 FDISK)
        Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
        创建分区。
        Command (m for help): n
        Command action

● 输入“e”表示要建立扩展分区;输入“p”表示要建立主分区。

          e   extended
          p   primary partition (1-4)
        p

● 输入分区编号。

        Partition number (1-4): 1

● 输入新建分区的起始柱面数,一般不输入直接按回车键。

        First cylinder (1-27413, default 1):
        Using default value 1

● 输入新建分区的结束柱面数。输入柱面数虽然可以精确地进行分区,但计算起来比较麻烦。一般这里都直接输入新建分区的大小让fdisk自己计算,这样实际分区的大小可能与输入的大小有一点差别,但这个差别并不大,不会影响正确使用。直接输入大小时使用“+”接分区大小及单位,如下面输入的就是希望新建分区的大小是10G。还可以使用M、T等其他一些单位。

        Last cylinder or +size or +sizeM or +sizeK (1-27413, default 27413): +10G
        创建分区。
        Command (m for help): n
        Command action
          e   extended
          p   primary partition (1-4)

● 输入e,建立扩展分区。

        e

● 输入分区编号。

        Partition number (1-4): 2
        First cylinder (1218-27413, default 1218):
        Using default value 1218

● 直接按回车键表示把磁盘所有的剩余空间都给这个分区。

        Last cylinder or +size or +sizeM or +sizeK (1218-27413, default 27413):
        Using default value 27413

● 创建分区。

        Command (m for help): n
        Command action

● 输入“l”表示要建立逻辑分区,由于一块磁盘只能有一个扩展分区,上一步已经建立了一个扩展分区,所以这里只能建立主分区或在扩展分区建立逻辑分区。

          l   logical (5 or over)
          p   primary partition (1-4)
        First cylinder (1218-27413, default 1218):
        Using default value 1218

l

● 输入分区大小。

        Last cylinder or +size or +sizeM or +sizeK (1218-27413, default 27413): +10G

● 显示目录的分区情况,注意这里显示的内容只是一个计算值目前并没有写入磁盘分区表。如果不想保存本次的修改内容可使用“q”退出。

        Command (m for help): p
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot     Start        End     Blocks   Id    System
        /dev/sdb1             1       1217    9775521   83  Linux
        /dev/sdb2          1218       27413   210419370    5  Extended

● 第一个扩展分区的编号总是从5开始的。

        /dev/sdb5          1218       2434    9775521   83  Linux

● 保存fdisk的修改并退出。

        Command (m for help): w
        The partition table has been altered!
        Calling ioctl() to re-read partition table.
        Syncing disks.

对于已有分区并在使用的硬盘使用fdisk改变分区保存退出时,fdisk命令会出现磁盘分区表无法写的错误提示,这时可以重新启动计算机或使用如下命令使改变的分区信息写入磁盘分区表。

        Command (m for help): w
        The partition table has been altered!
        Calling ioctl() to re-read partition table.
        #无法写磁盘分区表。
        WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
        The kernel still uses the old table.
        The new table will be used at the next reboot.
        [root@srv ~]# partprobe    #使用partprobe命令使新建的分区信息写入磁盘分区表。

(3)d:删除分区。

● 使用fdisk命令为/dev/sdb管理分区。

        [root@srv ~]# fdisk /dev/sdb
        The number of cylinders for this disk is set to 27413.
        There is nothing wrong with that, but this is larger than 1024,
        and could in certain setups cause problems with:
        1) software that runs at boot time (e.g., old versions of LILO)
        2) booting and partitioning software from other OSs
          (e.g., DOS FDISK, OS/2 FDISK)

● 显示当前磁盘分区情况。

        Command (m for help): p
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot     Start        End     Blocks   Id  System
        /dev/sdb1             1       1217    9775521   83  Linux
        /dev/sdb2          1218      27413   210419370    5  Extended
        /dev/sdb5          1218       2434    9775521   83  Linux

● 删除分区。

        Command (m for help): d

● 输入要删除的分区编号,这里输入“5”表示要删除第2个分区。

        Partition number (1-5): 5

● 再次查看分区情况,第5个分区已经删除。

        Command (m for help): p
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot     Start        End     Blocks   Id    System
        /dev/sdb1             1       1217    9775521   83  Linux
        /dev/sdb2          1218       27413   210419370    5  Extended
        Command (m for help): w     #保存fdisk的修改并退出。
        The partition table has been altered!
        Calling ioctl() to re-read partition table.
        WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
        The kernel still uses the old table.
        The new table will be used at the next reboot.
        Syncing disks.

● 使用partprobe命令使新建的分区信息写入磁盘分区表。

        [root@srv ~]# partprobe

(4)a:指定分区为引导分区。

● 使用fdisk命令为/dev/sdb管理分区。

        [root@srv ~]# fdisk /dev/sdb
        The number of cylinders for this disk is set to 27413.
        There is nothing wrong with that, but this is larger than 1024,
        and could in certain setups cause problems with:
        1) software that runs at boot time (e.g., old versions of LILO)
        2) booting and partitioning software from other OSs
          (e.g., DOS FDISK, OS/2 FDISK)

● 显示当前磁盘分区情况。

        Command (m for help): p
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot      Start        End     Blocks   Id   System
        /dev/sdb1             1       1217    9775521   83  Linux
        /dev/sdb2          1218       27413   210419370    5  Extended
        /dev/sdb5          1218       3650    19543041   83   Linux
        /dev/sdb6          3651       7298    29302528+  83   Linux
        /dev/sdb7          7299       12162   39070048+  83   Linux
        /dev/sdb8          12163      12187     200781   83   Linux

● 指定引导分区。

        Command (m for help): a

● 输入要指定引导分区的分区编号,这里输入“1”表示要指定的引导分区第1个分区。

        Partition number (1-8): 1
        Command (m for help): p
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot      Start        End      Blocks   Id   System
        #第1个分区在“Boot”列有一个“*”,表明该分区已是引导分区。
        /dev/sdb1   *          1       1217    9775521    83   Linux
        /dev/sdb2          1218        27413   210419370    5  Extended
        /dev/sdb5          1218        3650    19543041   83   Linux
        /dev/sdb6          3651        7298    29302528+  83   Linux
        /dev/sdb7          7299        12162   39070048+  83   Linux
        /dev/sdb8          12163       12187     200781   83   Linux

● 保存fdisk的修改并退出。

        Command (m for help): w
        The partition table has been altered!
        Calling ioctl() to re-read partition table.
        WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
        The kernel still uses the old table.
        The new table will be used at the next reboot.
        Syncing disks.

● 使用partprobe命令使新建的分区信息写入磁盘分区表。

        [root@srv ~]# partprobe

(5)t:改变分区类型、l:查看可用的分区类型。分区类型决定分区是一什么样的分区,默认情况下fdisk会自动将分区的类型指定为“Linux”(可能是主分区或逻辑分区)或“Extended”(扩展分区)。在一些情况下需要手动修改分区的类型以满足特殊应用的需求,如配置RAID或LVM。

    [root@srv ~]# fdisk /dev/sdb
    The number of cylinders for this disk is set to 27413.
    There is nothing wrong with that, but this is larger than 1024,
    and could in certain setups cause problems with:
    1) software that runs at boot time (e.g., old versions of LILO)
    2) booting and partitioning software from other OSs
       (e.g., DOS FDISK, OS/2 FDISK)
    Command (m for help): l
    0  Empty                  1e  Hidden W95 FAT1      80  Old Minix          bf  Solaris
    1  FAT12                  24  NEC DOS              81  Minix / old Lin    c1 DRDOS/sec (FAT-
    2  XENIX root             39  Plan 9               82  Linux swap / So    c4 DRDOS/sec (FAT-
    3  XENIX usr              3c  PartitionMagic       83  Linux              c6 DRDOS/sec (FAT-
    4  FAT16 <32M             40  Venix 80286          84  OS/2 hidden C:     c7  Syrinx
    5  Extended               41  PPC PReP Boot        85  Linux extended     da  Non-FS data
    6  FAT16                  42  SFS                  86  NTFS volume set      db  CP/M/CTOS/.
    7  HPFS/NTFS              4d  QNX4.x               87  NTFS volume set      de  Dell Utility
    8  AIX                    4e  QNX4.x 2nd part      88  Linux plaintext    df   BootIt
    9  AIX bootable           4f  QNX4.x 3rd part      8e  Linux LVM          e1  DOS access
    a  OS/2 Boot Manag        50  OnTrack DM           93  Amoeba             e3  DOS R/O
    b W95 FAT32               51  OnTrack DM6 Aux        94 Amoeba BBT          e4 SpeedStor
    c  W95 FAT32 (LBA)        52  CP/M                 9f  BSD/OS             eb  BeOS fs
    e  W95 FAT16 (LBA)        53  OnTrack DM6 Aux      a0  IBM Thinkpad hi    ee  EFI GPT
    f  W95 Ext'd (LBA)        54  OnTrackDM6           a5  FreeBSD            ef EFI (FAT-12/16/
    10  OPUS                  55  EZ-Drive             a6  OpenBSD            f0 Linux/PA-RISC b
    11  Hidden FAT12          56  Golden Bow           a7  NeXTSTEP           f1  SpeedStor
    12  Compaq diagnost       5c  Priam Edisk          a8  Darwin UFS         f4  SpeedStor
    14  Hidden FAT16 <3       61  SpeedStor            a9  NetBSD             f2  DOS secondary
    16  Hidden FAT16          63  GNU HURD or Sys      ab  Darwin boot        fb  VMware VMFS
    17  Hidden HPFS/NTF       64  Novell Netware       b7  BSDI fs            fc VMware VMKCORE
    18  AST SmartSleep        65  Novell Netware       b8  BSDI swap          fd Linux raid auto
    1b  Hidden W95 FAT3       70  DiskSecure Mult      bb  Boot Wizard hid    fe  LANstep
    1c  Hidden W95 FAT3       75  PC/IX                be  Solaris boot       ff  BBT

这些分类类型中并不是每一种都会经常使用到,在本书中主要会使用到“Linux LVM”、“Linux raid auto”、“Linux swap / Solaris”三种,下面将/dev/sdb5的分区类型转换为“Linux LVM”。

● 使用fdisk命令为/dev/sdb管理分区。

        [root@srv ~]# fdisk /dev/sdb
        The number of cylinders for this disk is set to 27413.
        There is nothing wrong with that, but this is larger than 1024,
        and could in certain setups cause problems with:
        1) software that runs at boot time (e.g., old versions of LILO)
        2) booting and partitioning software from other OSs
          (e.g., DOS FDISK, OS/2 FDISK)

● 显示当前磁盘分区情况。

        Command (m for help): p
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot     Start        End     Blocks   Id    System
        /dev/sdb1             1       1217    9775521   83  Linux
        /dev/sdb2          1218       27413   210419370    5  Extended
        /dev/sdb5          1218       2434    9775521   83    Linux
        /dev/sdb6          2435       3651    9775521   83    Linux

● 转换分区类型。

        Command (m for help): t

● 输入要转换的分区编号。

        Partition number (1-6): 6

● 将分区转换为“Linux LVM”。转换时输入分区类型的编号,分区类型编号是一个十六进制数,上面已经说明可以使用“l”查看。在这里也可以通过“L”查看。

        Hex code (type L to list codes): 8e
        Changed system type of partition 6 to 8e (Linux LVM)
        Command (m for help): p
        Disk /dev/sdb: 225.4 GB, 225485783040 bytes
        255 heads, 63 sectors/track, 27413 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
          Device Boot     Start        End     Blocks   Id    System
        /dev/sdb1             1       1217    9775521   83  Linux
        /dev/sdb2          1218       27413   210419370    5  Extended
        /dev/sdb5          1218       2434    9775521   83    Linux

● 分区类型已经转换为“Linux LVM”。

        /dev/sdb6          2435       3651    9775521   8e  Linux LVM

● 保存fdisk的修改并退出。

        Command (m for help): w
        The partition table has been altered!
        Calling ioctl() to re-read partition table.
        WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
        The kernel still uses the old table.
        The new table will be used at the next reboot.
        Syncing disks.

● 使用partprobe命令使新建的分区信息写入磁盘分区表。

        [root@srv ~]# partprobe