Linux 中用磁盘的分区,格式化,挂载

本贴最后更新于 2036 天前,其中的信息可能已经渤澥桑田

一、磁盘分区

1.1 fdisk : 用于 MBR 硬盘的分区

  1. 查看磁盘信息:lsblk,blkid,fdisk 命令

    root@ubuntu:~# lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sda 8:0 0 20G 0 disk
    ├─sda1 8:1 0 19G 0 part /
    ├─sda2 8:2 0 1K 0 part
    └─sda5 8:5 0 975M 0 part [SWAP]
    sr0 11:0 1 1024M 0 rom

    root@ubuntu:~# blkid
    /dev/sda1: UUID="798f5770-7ee0-4ba3-a706-fbda87230cf1" TYPE="ext4" PARTUUID="25f04eb0-01"
    /dev/sda5: UUID="94bcf6b0-4d5e-43fa-87ad-b93486badb5c" TYPE="swap" PARTUUID="25f04eb0-05"

    root@ubuntu:~# fdisk -l
    Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 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
    Disklabel type: dos
    Disk identifier: 0x25f04eb0

    Device Boot Start End Sectors Size Id Type
    /dev/sda1 * 2048 39942143 39940096 19G 83 Linux
    /dev/sda2 39944190 41940991 1996802 975M 5 Extended
    /dev/sda5 39944192 41940991 1996800 975M 82 Linux swap / Solaris

2)假如假如了一块硬盘/dev/sdb,对其进行分区,操作如下:

root@ubuntu:~# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x49f6d018.

Command (m for help): m

Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   u   change display/entry units
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table


Command (m for help): 

3)新建一个 100M 分区:

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-2097151, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151): +100M

Created a new partition 1 of type 'Linux' and of size 100 MiB.

Command (m for help): 

4)确定就输入 “w”,放弃则输入“q”。这番操作是为了把分割信息写入分区表,这时才算分区完毕

这个 gdisk 只有 root 才能执行,此外,请注意,使用的『装置档名』请不要加上数字,因为 partition 是针对『整个磁碟装置』而不是某个 partition 呢!所以执行『 gdisk /dev/vda1 』就会发生错误啦!要使用 gdisk /dev/vda 才对!

再次强调,你可以使用 gdisk 在您的磁碟上面胡搞瞎搞的进行实际操作,都不打紧,但是请『千万记住,不要按下 w 即可!』离开的时候按下 q 就万事无妨啰!此外,不要在 MBR 分割上面使用 gdisk,因为如果指令按错,恐怕你的分割纪录会全部死光光!也不要在 GPT 上面使用 fdisk 啦!

gdisk 用于 GPT 硬盘分区,过程和 fdisk 大同小异,不再赘述

因为 Linux 此时还在使用这颗磁碟,为了担心系统出问题,所以分割表并没有被更新喔!这个时候我们有两个方式可以来处理!其中一个是重新开机,不过很讨厌!另外一个则是透过 partprobe 这个指令来处理即可!

  • partprobe 更新 Linux 核心的分割表资讯

用法如下:

  [root@study ~]# partprobe [-s]   #你可以不要加-s !那么萤幕不会出现讯息! 
  [root@study ~]# partprobe -s   #不过还是建议加上-s比较清晰!

  root@ubuntu:~# partprobe 
  root@ubuntu:~# partprobe -s
  /dev/sda: msdos partitions 1 2 <5>
  /dev/sdb: msdos partitions 1

二、磁盘格式化(建置档案系统)

分区完毕后自然就是要进行档案系统的格式化啰!格式化的指令非常的简单,那就是 make filesystem, mkfs 这个指令啦!这个指令其实是个综合的指令,他会去呼叫正确的档案系统格式化工具软体!因为 CentOS 7 使用 xfs 作为预设档案系统, 底下我们会先介绍 mkfs.xfs ,之后介绍新一代的 EXT 家族成员 mkfs.ext4,最后再聊一聊 mkfs 这个综合指令吧!

将上面的 100M 新分区格式化为 xfs 文件系统,过程如下:

root@ubuntu:~# mkfs.xfs
The program 'mkfs.xfs' is currently not installed. You can install it by typing:
apt install xfsprogs
root@ubuntu:~# apt install -y xfsprogs

1)mkfs.xfs 的用法

root@ubuntu:~# mkfs.xfs -h
mkfs.xfs: invalid option -- 'h'
unknown option -h 
Usage: mkfs.xfs
/* blocksize */		[-b log=n|size=num]
/* metadata */		[-m crc=0|1,finobt=0|1,uuid=xxx]
/* data subvol */	[-d agcount=n,agsize=n,file,name=xxx,size=num,
				(sunit=value,swidth=value|su=num,sw=num|noalign),
				sectlog=n|sectsize=num
/* force overwrite */	[-f]
/* inode size */	[-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,
				projid32bit=0|1,sparse=0|1]
/* no discard */	[-K]
/* log subvol */	[-l agnum=n,internal,size=num,logdev=xxx,version=n
				sunit=value|su=num,sectlog=n|sectsize=num,
				lazy-count=0|1]
/* label */		[-L label (maximum 12 characters)]
/* naming */		[-n log=n|size=num,version=2|ci,ftype=0|1]
/* no-op info only */	[-N]
/* prototype file */	[-p fname]
/* quiet */		[-q]
/* realtime subvol */	[-r extsize=num,size=num,rtdev=xxx]
/* sectorsize */	[-s log=n|size=num]
/* version */		[-V]
			devicename
<devicename> is required unless -d name=xxx is given.
<num> is xxx (bytes), xxxs (sectors), xxxb (fs blocks), xxxk (xxx KiB),
	  xxxm (xxx MiB), xxxg (xxx GiB), xxxt (xxx TiB) or xxxp (xxx PiB).
<value> is xxx (512 byte blocks).

2)利用默认值格式化刚才的分区:

root@ubuntu:~# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=6400 blks
		 =                       sectsz=512   attr=2, projid32bit=1
		 =                       crc=1        finobt=1, sparse=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
		 =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
		 =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

很快格是化完毕!都用预设值!较重要的是 inode 与 block 的数值

root@ubuntu:~# blkid /dev/sdb1
/dev/sdb1: UUID="d1fbeb10-106a-4f96-b28a-3fee8410aaa4" TYPE="xfs" PARTUUID="49f6d018-01"

确定建置好 xfs 档案系统了!

文件系统参数优化:

使用预设的 xfs 档案系统参数来建置系统即可!速度非常快!如果我们有其他额外想要处理的项目,才需要加上一堆设定值!举例来说,因为 xfs 可以使用多个资料流来读写系统,以增加速度,因此那个 agcount 可以跟 CPU 的核心数来做搭配!举例来说,如果我的伺服器仅有一颗 4 核心,但是有启动 Intel 超执行绪功能,则系统会模拟出 8 颗 CPU 时,那个 agcount 就可以设定为 8 喔!举个例子来瞧瞧:

root@ubuntu:~# grep 'processor' /proc/cpuinfo
processor	: 0
processor	: 1

所以就是有两颗 CPU 的意思,那就来设定设定我们的 xfs 档案系统格式化参数吧:

root@ubuntu:~# mkfs.xfs -f -d agcount=2 /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=2, agsize=12800 blks
		 =                       sectsz=512   attr=2, projid32bit=1
		 =                       crc=1        finobt=1, sparse=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
		 =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
		 =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

可以跟前一个范例对照看看,可以发现 agcount 变成 2 了喔!此外,因为已经格式化过一次,因此 mkfs.xfs 可能会出现不给你格式化的警告!因此需要使用-f

XFS 档案系统 for RAID 效能优化(Optional)

我们在第 14 章会持续谈到进阶档案系统的设定,其中就有磁碟阵列这个东西!磁碟阵列是多颗磁碟组成一颗大磁碟的意思, 利用同步写入到这些磁碟的技术,不但可以加快读写速度,还可以让某一颗磁碟坏掉时,整个档案系统还是可以持续运作的状态!那就是所谓的容错。

基本上,磁碟阵列(RAID) 就是透过将档案先细分为数个小型的分割区块(stripe) 之后,然后将众多的 stripes 分别放到磁碟阵列里面的所有磁碟, 所以一个档案是被同时写入到多个磁碟去,当然效能会好一些。为了档案的保全性,所以在这些磁碟里面,会保留数个(与磁碟阵列的规划有关) 备份磁碟(parity disk), 以及可能会保留一个以上的备用磁碟(spare disk),这些区块基本上会占用掉磁碟阵列的总容量,不过对于资料的保全会比较有保障!

那个分割区块 stripe 的数值大多介于 4K 到 1M 之间,这与你的磁碟阵列卡支援的项目有关。stripe 与你的档案资料容量以及效能相关性较高。当你的系统大多是大型档案时,一般建议 stripe 可以设定大一些,这样磁碟阵列读/写的频率会降低,效能会提升。如果是用于系统, 那么小档案比较多的情况下, stripe 建议大约在 64K 左右可能会有较佳的效能。不过,还是都须要经过测试啦!完全是 case by case 的情况。更多详细的磁碟阵列我们在第 14 章再来谈,这里先有个大概的认识即可。14 章看完之后,再回来这个小节瞧瞧啰!

档案系统的读写要能够有最佳化,最好能够搭配磁碟阵列的参数来设计,这样效能才能够起来!也就是说,你可以先在档案系统就将 stripe 规划好, 那交给 RAID 去存取时,它就无须重复进行档案的 stripe 过程,效能当然会更好!那格式化时,最佳化效能与什么咚咚有关呢?我们来假设个环境好了:

  • 我有两个执行绪的 CPU 数量,所以 agcount 最好指定为 2
  • 当初设定 RAID 的 stripe 指定为 256K 这么大,因此 su 最好设定为 256k
  • 设定的磁碟阵列有 8 颗,因为是 RAID5 的设定,所以有一个 parity (备份碟),因此指定 sw 为 7
  • 由上述的资料中,我们可以发现资料宽度(swidth) 应该就是 256K*7 得到 1792K,可以指定 extsize 为 1792k

相关资料的来源可以参考文末( 注 7 )的说明,这里仅快速的使用 mkfs.xfs 的参数来处理格式化的动作喔!

[root@study ~]# mkfs.xfs -f -d agcount=2,su=256k,sw=7 -r extsize=1792k

从输出的结果来看, agcount 没啥问题, sunit 结果是 64 个 block,因为每个 block 为 4K,所以算出来容量就是 256K 也没错!那个 swidth 也相同!使用 448 * 4K 得到 1792K!那个 extsz 则是算成 bytes 的单位,换算结果也没错啦!上面是个方式,那如果使用 sunit 与 swidth 直接套用在 mkfs.xfs 当中呢?那你得小心了!因为指令中的这两个参数用的是『几个 512bytes 的 sector 数量』的意思!是『数量』单位而不是『容量』单位!因此先计算为:

  • sunit = 256K/512byte*1024(bytes/K) = 512 个 sector
  • swidth = 7 个磁碟* sunit = 7 * 512 = 3584 个 sector

所以指令就得要变成如下模样:

[root@study ~]# mkfs.xfs -f -d agcount=2,sunit=512,swidth=3584 -r extsize=1792k /dev/vda4

再说一次,这边你大概先有个概念即可,看不懂也没关系!等到 14 章看完后,未来回到这里,应该就能够看得懂了!多看几次!多做几次 ~ 作业系统的练习就是这样才能学的会!看得懂!^_^

  • mkfs.ext4 : 因为 ext4 的预设值已经相当适合我们系统使用,大部分的预设值写入于我们系统的/etc/mke2fs.conf 这个档案中,有兴趣可以自行前往查阅。也因此,我们无须额外指定 inode 的容量,系统都帮我们做好预设值啰!只需要得到 uuid 这个咚咚即可啦!

  • 其他档案系统 mkfs

mkfs 其实是个综合指令而已,当我们使用 mkfs -t xfs 时,它就会跑去找 mkfs.xfs 相关的参数给我们使用!如果想要知道系统还支援哪种档案系统的格式化功能,直接按[tabl] 就很清楚了!

[root@study ~]# mkfs[tab][tab] mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4  mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs

所以系统还有支援 ext2/ext3/vfat 等等多种常用的档案系统喔!那如果要将刚刚的/dev/vda5 重新格式化为 VFAT 档案系统呢?

[root@study ~]# mkfs -t vfat /dev/vda5

三、档案系统挂载与卸载

我们在本章一开始时的挂载点的意义当中提过挂载点是目录,而这个目录是进入磁碟分割槽(其实是档案系统啦!)的入口就是了。不过要进行挂载前,你最好先确定几件事:

  • 单一档案系统不应该被重复挂载在不同的挂载点(目录)中;
  • 单一目录不应该重复挂载多个档案系统;
  • 要作为挂载点的目录,理论上应该都是空目录才是。

尤其是上述的后两点!如果你要用来挂载的目录里面并不是空的,那么挂载了档案系统之后,原目录下的东西就会暂时的消失。举个例子来说,假设你的/home 原本与根目录(/)在同一个档案系统中,底下原本就有/home/test 与/home/vbird 两个目录。然后你想要加入新的磁碟,并且直接挂载/home 底下,那么当你挂载上新的分割槽时,则/home 目录显示的是新分割槽内的资料,至于原先的 test 与 vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉,而是暂时的隐藏了起来,等到新分割槽被卸载之后,则/home 原本的内容就会再次的跑出来啦!

而要将档案系统挂载到我们的 Linux 系统上,就要使用 mount 这个指令啦!不过,这个指令真的是博大精深 ~

[root@study ~]# mount -a 
[root@study ~]# mount [-l] 
[root@study ~]# mount [-t档案系统] LABEL=''挂载点 
[root@study ~]# mount [-t档案系统] UUID=''挂载点  #鸟哥近期建议用这种方式喔! 
[root@study ~]# mount [-t档案系统]装置档名挂载点

mount 的参数用法:

Usage:
 mount [-lhV]
 mount -a [options]
 mount [options] [--source] <source> | [--target] <directory>
 mount [options] <source> <directory>
 mount <operation> <mountpoint> [<target>]

Mount a filesystem.

Options:
 -a, --all               mount all filesystems mentioned in fstab
 -c, --no-canonicalize   don't canonicalize paths
 -f, --fake              dry run; skip the mount(2) syscall
 -F, --fork              fork off for each device (use with -a)
 -T, --fstab <path>      alternative file to /etc/fstab
 -i, --internal-only     don't call the mount.<type> helpers
 -l, --show-labels       show also filesystem labels
 -n, --no-mtab           don't write to /etc/mtab
 -o, --options <list>    comma-separated list of mount options
 -O, --test-opts <list>  limit the set of filesystems (use with -a)
 -r, --read-only         mount the filesystem read-only (same as -o ro)
 -t, --types <list>      limit the set of filesystem types
	 --source <src>      explicitly specifies source (path, label, uuid)
	 --target <target>   explicitly specifies mountpoint
 -v, --verbose           say what is being done
 -w, --rw, --read-write  mount the filesystem read-write (default)

 -h, --help     display this help and exit
 -V, --version  output version information and exit

Source:
 -L, --label <label>     synonym for LABEL=<label>
 -U, --uuid <uuid>       synonym for UUID=<uuid>
 LABEL=<label>           specifies device by filesystem label
 UUID=<uuid>             specifies device by filesystem UUID
 PARTLABEL=<label>       specifies device by partition label
 PARTUUID=<uuid>         specifies device by partition UUID
 <device>                specifies device by path
 <directory>             mountpoint for bind mounts (see --bind/rbind)
 <file>                  regular file for loopdev setup

Operations:
 -B, --bind              mount a subtree somewhere else (same as -o bind)
 -M, --move              move a subtree to some other place
 -R, --rbind             mount a subtree and all submounts somewhere else
 --make-shared           mark a subtree as shared
 --make-slave            mark a subtree as slave
 --make-private          mark a subtree as private
 --make-unbindable       mark a subtree as unbindable
 --make-rshared          recursively mark a whole subtree as shared
 --make-rslave           recursively mark a whole subtree as slave
 --make-rprivate         recursively mark a whole subtree as private
 --make-runbindable      recursively mark a whole subtree as unbindable

For more details see mount(8).

选项与参数: -a :依照设定档/etc/fstab 的资料将所有未挂载的磁碟都挂载上来 -l :单纯的输入 mount 会显示目前挂载的资讯。加上-l 可增列 Label 名称! -t :可以加上档案系统种类来指定欲挂载的类型。常见的 Linux 支援类型有:xfs, ext3, ext4, reiserfs, vfat, iso9660(光碟格式), nfs, cifs, smbfs (后三种为网路档案系统类型) -n :在预设的情况下,系统会将实际挂载的情况即时写入/etc/mtab 中,以利其他程式的运作。 但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用-n 选项。 -o :后面可以接一些挂载时额外加上的参数!比方说帐号、密码、读写权限等: async, sync: 此档案系统是否使用同步写入(sync) 或非同步(async) 的 记忆体机制,请参考档案系统运作方式。预设为 async。 atime,noatime: 是否修订档案的读取时间(atime)。为了效能,某些时刻可使用 noatime ro, rw: 挂载档案系统成为唯读(ro) 或可读写(rw) auto, noauto: 允许此 filesystem 被以 mount -a 自动挂载(auto) dev, nodev: 是否允许此 filesystem 上,可建立装置档案?dev 为可允许 suid, nosuid: 是否允许此 filesystem 含有 suid/sgid 的档案格式? exec, noexec: 是否允许此 filesystem 上拥有可执行 binary 档案? user, nouser: 是否允许此 filesystem 让任何使用者执行 mount ?一般来说, mount 仅有 root 可以进行,但下达 user 参数,则可让 一般 user 也能够对此 partition 进行 mount 。 defaults: 预设值为:rw, suid, dev, exec, auto, nouser, and async remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!

基本上,CentOS 7 已经太聪明了,因此你不需要加上-t 这个选项,系统会自动的分析最恰当的档案系统来尝试挂载你需要的装置!这也是使用 blkid 就能够显示正确的档案系统的缘故!那 CentOS 是怎么找出档案系统类型的呢?由于档案系统几乎都有 superblock ,我们的 Linux 可以透过分析 superblock 搭配 Linux 自己的驱动程式去测试挂载, 如果成功的套和了,就立刻自动的使用该类型的档案系统挂载起来啊!那么系统有没有指定哪些类型的 filesystem 才需要进行上述的挂载测试呢?主要是参考底下这两个档案:

  • /etc/filesystems:系统指定的测试挂载档案系统类型的优先顺序;
  • /proc/filesystems:Linux 系统已经载入的档案系统类型。

那我怎么知道我的 Linux 有没有相关档案系统类型的驱动程式呢?我们 Linux 支援的档案系统之驱动程式都写在如下的目录中:

  • /lib/modules/$(uname -r)/kernel/fs/

例如 ext4 的驱动程式就写在『/lib/modules/$(uname -r)/kernel/fs/ext4/』这个目录下啦!

另外,过去我们都习惯使用装置档名然后直接用该档名挂载, 不过近期以来比较建议使用 UUID 来识别档案系统,会比装置名称与标头名称还要更可靠!因为是独一无二的啊!

  • 挂载 xfs/ext4/vfat 等档案系统

范例:找出/dev/vda4 的 UUID 后,用该 UUID 来挂载档案系统到/data/xfs 内

[root@study ~]# blkid /dev/vda4 /dev/vda4: UUID="e0a6af55-26e7- 4cb7-a515-826a8bd29e90" TYPE="xfs"
[root@study ~]# mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs	
mount: mount point /data/xfs does not exist #非正规目录!所以手动建立它!
[root@study ~]# mkdir -p /data/xfs 
[root@study ~]# mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs 
[root@study ~]# df /data/ xfs Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda4 1038336 32864 1005472 4% /data/xfs #顺利挂载,且容量约为1G左右没问题!

root@ubuntu:~# mkdir -p /data/xfs
root@ubuntu:~# mount UUID="42c39a51-c4f0-493e-a086-50124ba8b92e" /data/xfs

请拿出你的随身碟并插入 Linux 主机的 USB 槽中!注意,你的这个随身碟不能够是 NTFS 的档案系统喔!接下来让我们测试测试吧!

万一你使用的 USB 磁碟被格式化为 NTFS 时,那可能就得要动点手脚,因为预设的 CentOS 7 并没有支援 NTFS 档案系统格式!所以你得要安装 NTFS 档案系统的驱动程式后,才有办法处理的!这部份我们留待 22 章讲到 yum 伺服器时再来谈吧!因为目前我们也还没有网路、也没有讲软体安装啊!

  • 重新挂载根目录与挂载不特定目录

整个目录树最重要的地方就是根目录了,所以根目录根本就不能够被卸载的!问题是,如果你的挂载参数要改变, 或者是根目录出现『唯读』状态时,如何重新挂载呢?最可能的处理方式就是重新开机(reboot)!不过你也可以这样做:

范例:将/重新挂载,并加入参数为 rw 与 auto [root@study ~]# mount -o remount,rw,auto /

重点是那个『 -o remount,xx 』的选项与参数!请注意,要重新挂载(remount) 时, 这是个非常重要的机制!尤其是当你进入单人维护模式时,你的根目录常会被系统挂载为唯读,这个时候这个指令就太重要了!

另外,我们也可以利用 mount 来将某个目录挂载到另外一个目录去喔!这并不是挂载档案系统,而是额外挂载某个目录的方法!虽然底下的方法也可以使用 symbolic link 来连结,不过在某些不支援符号连结的程式运作中,还是得要透过这样的方法才行。

范例:将/var 这个目录暂时挂载到/data/var 底下:

[root@study ~]# mkdir /data/var 
[root@study ~]# mount --bind /var /data/var 
[root@study ~]# ls -lid /var /data/var 
16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /data/var 
16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /var

内容完全一模一样啊!因为挂载目录的缘故!

[root@study ~]# mount | grep var /dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

看起来,其实两者连结到同一个 inode 嘛!没错啦!透过这个 mount --bind 的功能, 您可以将某个目录挂载到其他目录去喔!而并不是整块 filesystem 的啦!所以从此进入/data/var 就是进入/var 的意思喔!

umount (将装置档案卸载)

[root@study ~]# umount [-fn]装置档名或挂载点
选项与参数: -f :强制卸载!可用在类似网路档案系统(NFS) 无法读取到的情况下; -l :立刻卸载档案系统,比-f 还强! -n :不更新/etc/mtab 情况下卸载。

就是直接将已挂载的档案系统给他卸载即是!卸载之后,可以使用 df 或 mount 看看是否还存在目录树中?卸载的方式,可以下达装置档名或挂载点,均可接受啦!底下的范例做看看吧!

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

由于你目前正在/data/cdrom/的目录内,也就是说其实『你正在使用该档案系统』的意思!所以自然无法卸载这个装置!那该如何是好?就『离开该档案系统的挂载点』即可。以上述的案例来说,你可以使用『 cd / 』回到根目录,就能够卸载/data/cdrom 啰!简单吧!

四、开机挂载/etc/fstab 及/etc/mtab

刚刚上面说了许多,那么可不可以在开机的时候就将我要的档案系统都挂好呢?这样我就不需要每次进入 Linux 系统都还要在挂载一次呀!当然可以啰!那就直接到/etc/fstab 里面去修修就行啰!不过,在开始说明前,这里要先跟大家说一说系统挂载的一些限制:

  • 根目录/ 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。
  • 其它 mount point 必须为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则(FHS)
  • 所有 mount point 在同一时间之内﹐只能挂载一次。
  • 所有 partition 在同一时间之内﹐只能挂载一次。
  • 如若进行卸载﹐您必须先将工作目录移到 mount point(及其子目录) 之外。

让我们直接查阅一下/etc/fstab 这个档案的内容吧!

root@ubuntu:~# cat /etc/fstab 
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=798f5770-7ee0-4ba3-a706-fbda87230cf1 /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=94bcf6b0-4d5e-43fa-87ad-b93486badb5c none            swap    sw              0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0

其实/etc/fstab (filesystem table)就是将我们利用 mount 指令进行挂载时,将所有的选项与参数写入到这个档案中就是了。除此之外, /etc/fstab 还加入了 dump 这个备份用指令的支援!与开机时是否进行档案系统检验 fsck 等指令有关。这个档案的内容共有六个栏位,这六个栏位非常的重要!你『一定要背起来』才好!各个栏位的总结资料与详细资料如下:

[装置/UUID 等] [挂载点] [档案系统] [档案系统参数] [dump] [fsck]

  • 第一栏:磁碟装置档名/UUID/LABEL name,这个栏位可以填写的资料主要有三个项目:
    • 档案系统或磁碟的装置档名,如/dev/vda2 等
    • 档案系统的 UUID 名称,如 UUID=xxx
    • 档案系统的 LABEL 名称,例如 LABEL=xxx

因为每个档案系统都可以有上面三个项目,所以你喜欢哪个项目就填哪个项目!无所谓的!只是从鸟哥测试机的/etc/fstab 里面看到的,在挂载点/boot 使用的已经是 UUID 了喔!那你会说不是还有多个写/dev/mapper/xxx 的吗?怎么回事啊?因为那个是 LVM 啊!LVM 的档名在你的系统中也算是独一无二的,这部份我们在后续章节再来谈。不过,如果为了一致性,你还是可以将他改成 UUID 也没问题喔!(鸟哥还是比较建议使用 UUID 喔!) 要记得使用 blkid 或 xfs_admin 来查询 UUID 喔!

  • 第二栏:挂载点(mount point)::

就是挂载点啊!挂载点是什么?一定是目录啊 ~ 要知道啊!忘记的话,请回本章稍早之前的资料瞧瞧喔!

  • 第三栏:磁碟分割槽的档案系统:

在手动挂载时可以让系统自动测试挂载,但在这个档案当中我们必须要手动写入档案系统才行!包括 xfs, ext4, vfat, reiserfs, nfs 等等。

  • 第四栏:档案系统参数:

记不记得我们在 mount 这个指令中谈到很多特殊的档案系统参数?还有我们使用过的『-o codepage=950』?这些特殊的参数就是写入在这个栏位啦!虽然之前在 mount 已经提过一次,这里我们利用表格的方式再汇整一下:

| 参数 | 内容意义 |
| async/sync
非同步/同步 | 设定磁碟是否以非同步方式运作!预设为 async(效能较佳) |
| auto/noauto
自动/非自动 | 当下达 mount -a 时,此档案系统是否会被主动测试挂载。预设为 auto。 |
| rw/ro
可读写/唯读 | 让该分割槽以可读写或者是唯读的型态挂载上来,如果你想要分享的资料是不给使用者随意变更的, 这里也能够设定为唯读。则不论在此档案系统的档案是否设定 w 权限,都无法写入喔! |
| exec/noexec
可执行/不可执行 | 限制在此档案系统内是否可以进行『执行』的工作?如果是纯粹用来储存资料的目录,那么可以设定为 noexec 会比较安全。不过,这个参数也不能随便使用,因为你不知道该目录下是否预设会有执行档。
举例来说,如果你将 noexec 设定在/var ,当某些软体将一些执行档放置于/var 下时,那就会产生很大的问题喔!因此,建议这个 noexec 最多仅设定于你自订或分享的一般资料目录。 |
| user/nouser
允许/不允许使用者挂载 | 是否允许使用者使用 mount 指令来挂载呢?一般而言,我们当然不希望一般身份的 user 能使用 mount 啰,因为太不安全了,因此这里应该要设定为 nouser 啰! |
| suid/nosuid
具有/不具有 suid 权限 | 该档案系统是否允许 SUID 的存在?如果不是执行档放置目录,也可以设定为 nosuid 来取消这个功能! |
| defaults | 同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。基本上,预设情况使用 defaults 设定即可! |

  • 第五栏:能否被 dump 备份指令作用:

dump 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会啦!直接输入 0 就好了!

  • 第六栏:是否以 fsck 检验磁区:

早期开机的流程中,会有一段时间去检验本机的档案系统,看看档案系统是否完整(clean)。不过这个方式使用的主要是透过 fsck 去做的,我们现在用的 xfs 档案系统就没有办法适用,因为 xfs 会自己进行检验,不需要额外进行这个动作!所以直接填 0 就好了。

/etc/fstab 是开机时的设定档,不过,实际 filesystem 的挂载是记录到/etc/mtab 与/proc/mounts 这两个档案当中的。每次我们在更动 filesystem 的挂载时,也会同时更动这两个档案喔!但是,万一发生你在/etc/fstab 输入的资料错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的/可是 read only 的状态,当然你就无法修改/etc/fstab ,也无法更新/etc/mtab 啰 ~ 那怎么办?没关系,可以利用底下这一招:

[root@study ~]# mount -n -o remount,rw /

五、利用 GNU 的 parted 命令进行分割行为(Optional)

root@officetochat:~# parted 
GNU Parted 3.2
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found partitions, or a particular partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU Parted
(parted)                                                                  

虽然你可以使用 gdisk/fdisk 很快速的将你的分割槽切割妥当,不过 gdisk 主要针对 GPT 而 fdisk 主要支援 MBR ,对 GPT 的支援还不够!所以使用不同的分割时,得要先查询到正确的分割表才能用适合的指令,好麻烦!有没有同时支援的指令呢?有的!那就是 parted 啰!

Tips老实说,若不是后来有推出支援 GPT 的 gdisk,鸟哥其实已经爱用 parted 来进行分割行为了!虽然很多指令都需要同时开一个终端机去查 man page, 不过至少所有的分割表都能够支援哩!^_^

parted 可以直接在一行指令列就完成分割,是一个非常好用的指令!它常用的语法如下:

|

[root@study ~]# parted [装置] [指令[参数]]
选项与参数: 指令功能: 新增分割:mkpart [primary|logical|extended] [ext4|vfat|xfs] 开始结束 显示分割:print 删除分割:rm [partition]

范例一:以 parted 列出目前本机的分割表资料 [root@study ~]# parted /dev/vda print Model: Virtio Block Device (virtblk) <==磁碟介面与型号 Disk /dev/vda: 42.9 GB <==磁碟档名与容量 Sector size (logical/physical): 512B/512B <==每个磁区的大小 Partition Table: gpt <==是 GPT 还是 MBR 分割 Disk Flags: pmbr_boot
Number Start End Size File system Name Flags 1 1049kB 3146kB 2097kB bios_grub 2 3146kB 1077MB 1074MB xfs 3 1077MB 33.3GB 32.2GB lvm 4 33.3GB 34.4GB 1074MB xfs Linux filesystem 5 34.4GB 35.4GB 1074MB ext4 Microsoft basic data 6 35.4GB 36.0GB 537MB linux-swap(v1) Linux swap
[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]

|

上面是最简单的 parted 指令功能简介,你可以使用『 man parted 』,或者是『 parted /dev/vda help mkpart 』去查询更详细的资料。比较有趣的地方在于分割表的输出。我们将上述的分割表示意拆成六部分来说明:

  1. Number:这个就是分割槽的号码啦!举例来说,1 号代表的是/dev/vda1 的意思;
  2. Start:分割的起始位置在这颗磁碟的多少 MB 处?有趣吧!他以容量作为单位喔!
  3. End:此分割的结束位置在这颗磁碟的多少 MB 处?
  4. Size:由上述两者的分析,得到这个分割槽有多少容量;
  5. File system:分析可能的档案系统类型为何的意思!
  6. Name:就如同 gdisk 的 System ID 之意。

不过 start 与 end 的单位竟然不一致!好烦 ~ 如果你想要固定单位,例如都用 MB 显示的话,可以这样做:

|

[root@study ~]# parted /dev/vda unit mb print

|

如果你想要将原本的 MBR 改成 GPT 分割表,或原本的 GPT 分割表改成 MBR 分割表,也能使用 parted !但是请不要使用 vda 来测试!因为分割表格式不能转换!因此进行底下的测试后,在该磁碟的系统应该是会损毁的!所以鸟哥拿一颗没有使用的随身碟来测试,所以档名会变成/dev/sda 喔!再讲一次!不要恶搞喔!

|

范例二:将/dev/sda 这个原本的 MBR 分割表变成 GPT 分割表!(危险!危险!勿乱搞!无法复原!) [root@study ~]# parted /dev/sda print Model: ATA QEMU HARDDISK (scsi) Disk /dev/sda: 2148MB Sector size (logical/physical): 512B/512B Partition Table: msdos #确实显示的是 MBR 的 msdos 格式喔!
[root@study ~]# parted /dev/sda mklabel gpt Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? y
[root@study ~]# parted /dev/sda print
#你应该就会看到变成 gpt 的模样!只是...后续的分割就全部都死掉了!

|

接下来我们尝试来建立一个全新的分割槽吧!再次的建立一个 512MB 的分割来格式化为 vfat,且挂载于/data/win 喔!

|

范例三:建立一个约为 512MB 容量的分割槽 [root@study ~]# parted /dev/vda print
.....(前面省略)..... Number Start End Size File system Name Flags
.....(中间省略)..... 6 35.4GB 36.0GB 537MB linux-swap(v1) Linux swap #要先找出来下一个分割的起始点!
[root@study ~]# parted /dev/vda mkpart primary fat32 36.0GB 36.5GB
#由于新的分割的起始点在前一个分割的后面,所以当然要先找出前面那个分割的 End 位置! #然后再请参考 mkpart 的指令功能,就能够处理好相关的动作! [root@study ~]# parted /dev/vda print
.....(前面省略)..... Number Start End Size File system Name Flags
7 36.0GB 36.5GB 522MB primary
[root@study ~]# partprobe [root@study ~]# lsblk /dev/vda7 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda7 252:7 0 498M 0 part #要确定它是真的存在才行!
[root@study ~]# mkfs -t vfat /dev/vda7 [root@study ~]# blkid /dev/vda7 /dev/vda7: SEC_TYPE="msdos" UUID="6032-BF38" TYPE="vfat"
[root@study ~]# nano /etc/fstab
UUID="6032-BF38" /data/win vfat defaults 0 0
[root@study ~]# mkdir /data/win [root@study ~]# mount -a [root@study ~]# df /data/win Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda7 509672 0 509672 0% /data/win

|

事实上,你应该使用 gdisk 来处理 GPT 分割就好了!不过,某些特殊时刻,例如你要自己写一只脚本,让你的分割全部一口气建立, 不需要 gdisk 一条一条指令去进行时,那么 parted 就非常有效果了!因为他可以直接进行 partition 而不需要跟用户互动!这就是它的最大好处!鸟哥还是建议,至少你要操作过几次 parted ,知道这家伙的用途!未来有需要再回来查!或使用 man parted 去处理喔!

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖 • 1 关注
  • 文件系统
    3 引用 • 2 回帖
  • fdisk
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...