Fork me on GitHub

Linux分区与挂载

分区是将一个硬盘驱动器分成若干个逻辑驱动器,分区是把硬盘连续的区块当做一个独立的磁盘使用。分区表是一个硬盘分区的索引,分区的信息都会写进分区表。
通常情况下,为磁盘分区通常使用fdisk,它是对基于MBR机制分区的管理磁盘命令,但是它仅仅支持2TB以下磁盘的分区,超出2TB部分无法识别。若过超过则可以使用parted进行分区,本文主要讲解fdisk分区。

当前以虚拟机内的CentOS7为例:

fdisk磁盘分区

1、查看Linux系统上的文件系统(包含文件系统类型)的磁盘使用情况:

df -hT

详情如下:

[root@localhost ~]# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
devtmpfs                devtmpfs  994M     0  994M   0% /dev
tmpfs                   tmpfs    1000M     0 1000M   0% /dev/shm
tmpfs                   tmpfs    1000M   96M  905M  10% /run
tmpfs                   tmpfs    1000M     0 1000M   0% /sys/fs/cgroup
/dev/mapper/centos-root xfs       6.7G  3.4G  3.3G  51% /
/dev/sda1               xfs       497M  118M  380M  24% /boot
tmpfs                   tmpfs     200M     0  200M   0% /run/user/0   

2、fdisk命令详情如下:

fdisk(选项)(参数)

选项:

-b<分区大小>:指定每个分区的大小;
-l:列出指定的外围设备的分区表状况;
-s<分区编号>:将指定的分区大小输出到标准输出上,单位为区块;
-u:搭配"-l"参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址;
-v:显示版本信息。

参数:

设备文件:指定要进行分区或者显示分区的硬盘设备文件

菜单操作说明:

a    设置可引导标记
b    编辑bsd磁盘标签
c    设置Dos操作系统兼容标记
d    删除一个分区
l   显示已知的文件系统类型,例:83为Linux分区,82为Linux swap分区
m   显示菜单和帮助信息
n   新建分区
o    建立空白的DOS分区表
p    列出当前磁盘的分区表信息
q   不保存退出
s    新建空白SUN磁盘标签
t    改变一个分区的系统ID
u    改变显示记录单位
v    进行分区检查
w    保存退出
x    附加功能
x :扩展应用,高级功能    

查看磁盘分区情况

查看命令:

fdisk -l

例如:

[root@localhost ~]# fdisk -l
Disk /dev/sda: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c374c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    16777215     7875584   8e  Linux LVM

Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xda06dd45

   Device Boot      Start         End      Blocks   Id  System

Disk /dev/mapper/centos-root: 7159 MB, 7159676928 bytes, 13983744 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/centos-swap: 859 MB, 859832320 bytes, 1679360 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

磁盘分区

1、从上述查看结果可以看出/dev/sdb可进行分区:

fdisk /dev/sdb

其中”Device Boot Start End Blocks Id System”描述如下:

第一列:Device 显示了磁盘分区对应的设备文件名。
第二列:Boot 显示是否为引导分区,上图中的 /dev/sda1 就是引导分区。
第三列:Start 表示磁盘分区的起始位置。
第四列:End 表示磁盘分区的结束位置。
第五列:Sectors 表示分区占用的扇区数目。
第六列:Size 显示分区的大小。
第七列和第八列:显示的内容相同,分别是数值ID及其文字描述。 Id列显示了磁盘分区对应的ID,根据分区的不同,分区对应的ID号也不相同。
        Linux下用83表示主分区和逻辑分区,82表示swap交换分区,5表示扩展分区,8e表示LVM分区,7表示NTFS分区

2、进入交互模式后按 “m” 可列出所有命令

[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

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
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   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
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

3、输入 “p” 列出磁盘目前的分区情况:

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xda06dd45

   Device Boot      Start         End      Blocks   Id  System

可以看出尚未进行分区。

4、输入 “n” 创建新的磁盘分区:
1)出现两个菜单e表示扩展分区,p表示主分区
2)按”p”键(或直接回车,即默认)出现提示:”Partition number (1-4): “选择主分区号
3)输入”1”(或直接回车,即默认)表示第一个主分区
4)直接按回车表示”1”柱面开始分区
5)提示最后一个柱面或大小
分区的大小通过分区开始处的扇区和结束处的扇区设置的,或者输入分区的大小,如+4G(即磁盘容量为4G);之后回车,即表示创建了第一个分区。
这里如果不设置结束处的扇区或输入分区大小,而是直接回车会把整个磁盘划分为一个分区,也可以创建多个分区
6)输入”p”可查看磁盘目前的分区情况,如果分区没有问题,可以进行保存。

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-16777215, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215): 
Using default value 16777215
Partition 1 of type Linux and of size 8 GiB is set

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xda06dd45

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    16777215     8387584   83  Linux

5、按 “t” 键可改变一个分区的系统ID

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xda06dd45

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    16777215     8387584   83  Linux

Command (m for help): t       
Selected partition 1
Hex code (type L to list all codes): L

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      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            
1e  Hidden W95 FAT1 80  Old Minix      
Hex code (type L to list all codes): a6
Changed type of partition 'Linux' to 'OpenBSD'

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xda06dd45

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    16777215     8387584   a6  OpenBSD

5、按 “d” 键删除分区:

如果分区有误,可以删除重新分区。如下:

Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xda06dd45

   Device Boot      Start         End      Blocks   Id  System

6、按 “w” 键保存退出:

分区结束后一定要保存,否则之前的分区不会生效

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

各个参数的解析:

1. 输入 m 显示所有命令列示。
2. 输入 p 显示硬盘分割情形,打印分区表。
3. 输入 a 设定硬盘启动区。
4. 输入 n 设定新的硬盘分割区。
  4.1. 输入 e 硬盘为[延伸]分割区(extend)。
  4.2. 输入 p 硬盘为[主要]分割区(primary)。
5. 输入 t 改变硬盘分割区属性。例:          
    82: linux swap
    83:linux
    86:NTFS window分区
6. 输入 d 删除硬盘分割区属性。
7. 输入 q 结束不存入硬盘分割区属性。
8. 输入 w 结束并写入硬盘分割区属性

磁盘格式化(创建文件系统)

查看文件系统的类型

1、mount
查看已经挂载的文件系统类型。

[root@localhost /]# mount | grep "^/dev"
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)

2、lsblk
显示块设备,当使用 -f 选项时,会打印当前系统所有分区的文件系统类型。

[root@localhost /]# lsblk -f  //lsblk -o UUID -f 
NAME            FSTYPE      LABEL UUID                                   MOUNTPOINT
sda                                                                      
|-sda1          xfs               d918cc0b-aa5b-4147-bd41-469533c0618d   /boot
`-sda2          LVM2_member       F6FzL6-RBmy-3vgL-IbSC-caU3-rIUg-9hv2jg 
  |-centos-root xfs               96b564fd-7267-4cf3-a4c2-78da91f07e2d   /
  `-centos-swap swap              4677bc0d-f76e-4af0-b078-196f86856f19   [SWAP]
sdb                                                                      
`-sdb1          ext4              32ce315d-b6a5-49a6-84c7-daaec7ac32cb   
sr0                                                         

3、file -s
确定磁盘上是否存在文件系统。新磁盘为原始的块储存设备,必须先在这种设备上创建文件系统,然后才能够装载并使用它们,
file -s 命令获取设备信息,例如其文件系统类型。如果输出仅显示 data(如以下示例输出),则说明设备上没有文件系统,您必须创建一个文件系统。

[root@localhost /]# sudo file -s /dev/sdb
/dev/sdb: data

[root@localhost /]# sudo file -s /dev/sda1
/dev/sda1: XFS filesystem data

查看当前系统支持的文件系统

1、cat /proc/filesystems

[root@localhost /]# cat /proc/filesystems
nodev    sysfs
nodev    rootfs
...
nodev    mqueue
    xfs
    ext3
    ext2
    ext4
    iso9660
    vfat
    hfs
    hfsplus

2、cat /etc/filesystems

[root@localhost /]# cat /etc/filesystems
xfs
ext4
ext3
ext2
...
hfs
hfsplus
*

3、ls -l /lib/modules/uname -r/kernel/fs (CentOS)

[root@localhost /]# ls  -al /lib/modules/`uname -r`/kernel/fs
total 60
drwxr-xr-x 33 root root  4096 Feb 15 18:44 .
drwxr-xr-x 12 root root   118 Feb 15 18:44 ..
drwxr-xr-x  2 root root    21 Feb 15 18:44 btrfs
...
drwxr-xr-x  2 root root    22 Feb 15 18:44 exofs
drwxr-xr-x  2 root root    20 Feb 15 18:44 ext4

mke2fs命令

系统分区之后,并不能直接使用,需要格式化。mke2fs命令是专门用于管理ext系列文件系统的一个专门的工具。其还有像mkfs.ext2,mkfs.ext3,mkfs.ext4等衍生的命令
命令格式:

mke2fs [options] [device]

选项说明:

-t 指定文件系统类型(如ext2,ext3,ext4等),则会从/etc/mke2fs.conf文件中读取默认配置;
-j:创建ext3文件系统,mkfs.ext3自带了该选项,不加-j则为ext2;
-b block-size:设置硬盘的block大小。
-L 'LABEL':设置卷标;
-N:设置inode节点的数量;
-m:设置为文件系统预留的块的百分比;
-c:在创建文件系统前进程硬盘自检;

例如:

mke2fs /dev/sdb1   #创建文件系统格式为ext2
mke2fs -j /dev/sdb1 #创建文件系统格式为ext3
mke2fs -t ext4 /dev/sdb1 #创建文件系统格式为ext4

[root@localhost /]# mke2fs -t ext4 /dev/sdb1 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2096896 blocks
104844 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

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

e2fsck -p /dev/sdb1 #检查ext2/ext3/ext4格式的文件系统:文件、扇区是否有错误,参数-p(等同 -a)是自动修复

格式化完成之后,便可以进行硬盘的挂载。

磁盘挂载

格式化硬盘后,需要为每个分区设置挂载点,有两种方式:一种是临时挂载,重启失效;另一种开机自动挂载。

1、创建挂载点

mkdir /data

作为挂载点的目录,理论上都应该是空目录。如果挂载的目录不为空,那么挂载了文件系统之后,原目录下的内容会暂时消失(被隐藏,而不是被覆盖),且不会将此前的目录容量加上,取消挂载之后,原来内容即可恢复。

2、磁盘挂载

第一种方式:临时挂载(手动挂载),重启失效

命令mount可用来挂载文件系统:

mount 要挂载的设备源 挂载目的点

例如:

mount /dev/sdb1 /data    

常用参数:
不带参数的mount命令会显示所有已挂载的文件系统
-t 指定文件系统的类型,如:-t ext4、-t vfat
-o 指定挂载选项:

ro: 以只读方式挂载;
rw: 以读写方式挂载,默认挂载选项;
async: 异步IO,数据写操作优先于内存完成,然后再根据某种策略同步至硬盘中,默认挂载选项;
sync: 同步IO;
auto/noauto: 设置设备是否支持mount的-a选项自动挂载,默认挂载为auto;
exec/noexec: 设置是否允许执行此设备上得二进制程序文件,默认挂载为exec;
suid/nosuid: 设置是否支持在此设备的文件上使用suid,默认挂载为suid;
user/nouser: 设置是否允许普通挂载此文件设备,默认挂载为nouser;
defaults: 使用预设的选项 rw, suid, dev, exec, auto, nouser, and async;
remount: 重新挂载文件系统

比如:

mount -t ext4 -o remount,ro /dev/sdb1 /data/ #重新挂载并只读

第二种方式:开机自动挂载

blkid命令,可以查看硬盘设备的信息(或者采用上述的命令lsblk):

[root@localhost data]# blkid
/dev/sda1: UUID="d918cc0b-aa5b-4147-bd41-469533c0618d" TYPE="xfs" 
/dev/sda2: UUID="F6FzL6-RBmy-3vgL-IbSC-caU3-rIUg-9hv2jg" TYPE="LVM2_member" 
/dev/sdb1: UUID="330c5768-3bdb-4a25-9b91-626276a6d2ca" TYPE="ext4" 
/dev/mapper/centos-root: UUID="96b564fd-7267-4cf3-a4c2-78da91f07e2d" TYPE="xfs" 
/dev/mapper/centos-swap: UUID="4677bc0d-f76e-4af0-b078-196f86856f19" TYPE="swap"

1、编辑/etc/fstab,添加一行。
查看要挂载分区的UUID(Universally Unique Identifier),将UUID或者直接将对应的设备文件名写入文件中,即:

echo 'UUID="F6FzL6-RBmy-3vgL-IbSC-caU3-rIUg-9hv2jg" /data  ext4 defaults 0 0' >> /etc/fstab
或者
echo '/dev/sdb1 /data ext4 defaults 0 0' >> /etc/fstab    

备注:开机自动挂载最好设置UUID,其次使用卷标,因为有时卷设备名会发生变化,导致开机启动出现异常

每列描述如下:

file system<设备文件名称>   mount point<挂载目录>    type<文件系统类型>  options<文件系统参数>  dump<是否备份>  pass<开机时自检>

第一列:可以是设备名称(比如 /dev/sda1)或标记 (LABEL=) 或 UUID (UUID=)
第二列:挂载点(也就是挂载目录),对于交换空间,该值应该是”none”或”swap”
第三列:所要挂载设备的文件系统类型。支持许多种不同的文件系统:ext2, ext3, ext4, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap 及 auto。设置成auto类型,mount 命令会猜测使用的文件系统类型,对 CDROM 和 DVD 等移动设备是非常有用的。
第四列:挂载参数,即mount命令“-o”选项后可使用的参数,如defaults、rw等,通常使用defaults即可
第五列:备份,dump是一个用来作为备份的命令。0:不做备份 1:每天备份
第六列:文件系统的检查顺序。开机的过程中,系统默认会以fsck检验我们系统是否为完整;0:不检验,1:最先检验(一般根目录即”/“会选择, 设置后其他不能再使用1),2:1级别检验完成之后进行检验

2、/etc/fstab写入完成后,重启或者执行”mount -a”自动挂载。

3、最后”df -hT”查看挂载是否成功。

取消挂载

命令umount用来卸载已挂载的文件系统,命令:

umount 文件系统或者挂载点

例如:

[root@localhost ~]# umount /dev/sdb1
或者
[root@localhost ~]# umount /data

如果出现下面的问题:

[root@localhost ~]# umount /dev/sdb1
umount: /data: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

表示该文件系统正在被使用,无法卸载。在Linux系统中,只有当该文件系统上所有访问的用户或进程完成操作并退出后,这个文件系统才能被正常卸载。
一般情况下的原因是因为你在当前的目录中工作,这时只要退到根目录下再卸载就可以了。可以使用命令fuser/lsof查看哪些进程正在访问该文件系统,
之后使用kill命令将进程杀死来进行卸载。

1、fuser -uvm 文件系统或者挂载点,fuser显示使用指定文件或者文件系统的进程的pid

参数描述:

-u:在每个进程后显示所属的用户名
-m:显示所有使用指定文件系统的进程,后面可以跟挂载点,或是dev块设备
-v:详细的输出,可以看到占用的进程和PID号
-i:杀死进程前需要用户确认(和-k一起使用)
-k:杀死访问指定文件的所有进程(效果类似rm -rf)

例如:

[root@localhost data]# fuser -uvm  /data
                     USER        PID ACCESS COMMAND
/data:               root     kernel mount (root)/data
                     root       1037 ..c.. (root)bash
                     root       1485 F.... (root)vim

每种类型的访问(即每个pid后面)加上一个字母表示:

c - 当前目录。表示该进程是在该目录下启动的
e - 正在运行的可执行文件
f - 打开文件。在默认显示模式下省略f
F - 打开文件进行写入。默认显示模式下省略F
r - 根目录。表示该目录是该进程的根目录
m - mmap'ed文件或共享库

2、lsof 文件系统或者挂载点

[root@localhost /]# lsof +D  /data
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
vim     1485 root    4u   REG   8,17    12288   12 /data/.a.swp

如果出现:fuser/lsof: command not found,安装psmisc/lsof即可。

备注:挂载/取消挂载的限制(重点)

1、根目录是必须要先于其他mount point被挂载。因为挂载的是所有目录的根目录,其他目录都是由根目录"/"衍生出来的。
2、挂载点必须是已经存在的目录。
3、挂载点的指定可以任意,但必须遵守必要的系统目录架构原则
4、所有挂载点在同一时间只能被挂载一次
5、所有分区在同一时间只能被挂载一次
6、若取消挂载,必须将工作目录退出挂载点(及其子目录)之外,且当前磁盘没有发生读写等操作
轻轻的我走了,正如我轻轻的来