- Linux从初学到精通
- 张勤 鲜学丰等编著
- 62字
- 2020-08-27 03:01:41
第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