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

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

一、磁盘分区

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 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • 文件系统
    3 引用 • 2 回帖
  • fdisk
    1 引用

相关帖子

欢迎来到这里!

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

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