Linux学习-磁盘的分区、格式化、检验与挂载

如果想要在系统新增一颗磁盘时,哪些动作需要做的:

  1. 对磁盘进行分区,以创建可用的partition;
  2. 对该partition进行格式化(format),以创建系统可用的filesystem;
  3. 若想要仔细一点,则可对刚刚创建好的filesystem进行检验;
  4. 在Linux系统上,需要创建挂载点(亦即是目录),并将它挂载上来;

###观察磁盘分区状态

由于目前磁盘分区主要有MBR以及GPT两种格式,这两种格式所使用的分区工具不太一样,自然就要去找一下目前系统有的磁盘有哪些,这些磁盘是MBR还是GPT等等,这样才能处理

  • lsblk列出系统上的所有磁盘列表 lsblk可以看成"list block device"的缩写,就是列出所有存储设备的意思。

  • blkid列出设备的UUID等参数

虽然lsblk已经可以使用-f来列出文件系统与设备的UUID数据,但是还可以用blkid来找出设备的UUID,什么是UUID?UUID是全域单一识别码(universally unique identifer),Linux会将系统内所有的设备都给予一个独一无二的识别码,这个识别码就可以拿来作为挂载或者是使用这个设备/文件系统之用了。

[root@study ~]# blkid
/dev/vda2: UUID="94ac5f77-cb8a-495e-a65b-2ef7442b837c" TYPE="xfs"
/dev/vda3: UUID="WStYq1-P93d-oShM-JNe3-KeDl-bBf6-RSmfae" TYPE="LVM2_member"
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
/dev/mapper/centos-root: UUID="299bdc5b-de6d-486a-a0d2-375402aaab27" TYPE="xfs"
/dev/mapper/centos-swap: UUID="905dc471-6c10-4108-b376-a802edbd862d" TYPE="swap"
/dev/mapper/centos-home: UUID="29979bf1-4a28-48e0-be4a-66329bf727d9" TYPE="xfs"

如上所示,每一行代表一个文件系统,主要列出设备名称、UUID名称以及文件系统的类型(TYPE)。

  • parted列出磁盘的分区表类型与分区信息

虽然我们已经知道了系统上面的所有设备,并且通过blkid也知道了所有的文件系统,不过,还是不清楚磁盘的分区类型。这时我们可以通过简单的parted来输出。

[root@study ~]# parted device_name print
范例一:列出 /dev/vda 磁盘的相关数据
 [root@study ~]# parted /dev/vda print
 Model: Virtio Block Device (virtblk) # 磁盘的模块名称(厂商)
 Disk /dev/vda: 42.9GB # 磁盘的总容量
 Sector size (logical/physical): 512B/512B # 磁盘的每个逻辑/物理扇区容量
 Partition Table: gpt # 分区表的格式 (MBR/GPT)
 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

###磁盘分区 : gdisk/fdisk

要注意:MBR分区请使用fdisk分区,GPT分区请使用gdisk分区,

  • gdisk
[root@study ~]# gdisk 设备名称
范例:由前一小节的 lsblk 输出,我们知道系统有个 /dev/vda,请观察该磁盘的分区与相关数据
 [root@study ~]# gdisk /dev/vda <==仔细看,不要加上数字喔!
 GPT fdisk (gdisk) version 0.8.6

Partition table scan:
 MBR: protective
 BSD: not present
 APM: not present
 GPT: present
 
Found valid GPT with protective MBR; using GPT. <==找到了 GPT 的分区表!

Command (? for help): <==这里可以让你输入指令动作,可以按问号 (?) 来查看可用指令
Command (? for help): ?
b       back up GPT data to a file
c       change a partition's name
d       delete a partition # 删除一个分区
i        show detailed information on a partition
l        list known partition types
n       add a new partition # 增加一个分区
o       create a new empty GUID partition table (GPT)
p       print the partition table # 印出分区表 (常用)
q       quit without saving changes # 不储存分区就直接离开 gdisk
r        recovery and transformation options (experts only)
s       sort partitions
t       change a partition's type code
v       verify disk
w      write table to disk and exit # 储存分区操作后离开 gdisk
x       extra functionality (experts only)
?       print this menu
Command (? for help):

首先你应该要通过lsblk或blkid先找到磁盘。再用 parted /dev/xxx print 来找出内部的分区表类型,之后才用gdisk或fdisk来操作系统。上表中可以发现gdisk会扫描MBR与GPT分区表,不过这个软件还是单纯使用在GPT分区表比较好。

不管进行来什么动作,只要离开gdisk时按下"q"那么所有的动作都不会生效。相反的,按下w就是动作生效的意思,所以,可以随意改动gdisk,只要在离开时按下的是q即可,先看看分区表的信息。

command (? for help): p <== 这里可以输出目前磁盘的状态
Disk /dev/vda: 83886080 sectors, 40.0 GiB     # 磁盘文件名/扇区数与总容量
Logical sector size: 512 Bytes     # 单一扇区大小为 512 Bytes
Disk identifier (GUID): A4C3C813-62AF-4BFE-BAC9-112EBD87A483     # 磁盘的 GPT 识别码
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 18862013 sectors (9.0 GiB)

Number Start (sector) End (sector) Size Code Name # 下面为完整的分区信息了!
 1             2048 6143 2.0 MiB EF02 # 第一个分区数据
 2            6144         2103295   1024.0 MiB  0700
 3         2103296        65026047   30.0 GiB    8E00
 # 分区编号 开始扇区号码 结束扇区号码 容量大小
 Command (? for help): q
 # 想要不储存离开吗?按下 q 就对了!不要随便按 w 啊!

使用p可以列出目前这颗磁盘的分区表信息,这个信息的上半部在显示整体磁盘的状态。要注意的是,现在的分区主要是以扇区为最小的单位。

下半部的分区表信息主要在列出每个分区的个别信息项目。每个项目的意义为:

  • Number : 分区编号,1号指的是/dev/vda1这样计算
  • Start(setor) : 每一个分区的开始扇区号码位置
  • End(sector) : 每一个分区的结束扇区号码位置,与start之间可以算出分区的总容量
  • Size : 就是分区的容量了
  • Code : 在分区内的可能的文件系统类型。Linux为8300,swap为8200。不过这个项目只是一个提示而已,不见得代表此分区的文件系统。
  • Name : 文件系统的名称等等。

只有root才能执行gdisk。此外,使用的设备文件吗请不要加上数字,因为partition是针对整个磁盘设备而不是某个partition。

  • 用gdisk新增分区

加入我需要有如下的分区需求:

  • 1GB的xfs系统(Linux)
  • 1GB的vfat文件系统(Windows)
  • 0.5GB的swap(Linux swap)

那就来处理。

[root@study ~]# gdisk /dev/vad
 Number Start (sector) End (sector) Size Code Name
 1            2048            6143   2.0 MiB     EF02
 2            6144         2103295   1024.0 MiB  0700
 3         2103296        65026047   30.0 GiB    8E00
 # 找出最后一个 sector 的号码是很重要的!
 Command (? for help): ? # 查一下增加分区的指令为何
Command (? for help): n # 就是这个!所以开始新增的行为!
Partition number (4-128, default 4): 4 # 默认就是 4 号,所以也能 enter 即可!
First sector (34-83886046, default = 65026048) or {+-}size{KMGTP}: 65026048 # 也能 enter
Last sector (65026048-83886046, default = 83886046) or {+-}size{KMGTP}: +1G # 决不要 enter
# 这个地方可有趣了!我们不需要自己去计算扇区号码,通过 +容量 的这个方式,
# 就可以让 gdisk 主动去帮你算出最接近你需要的容量的扇区号码喔!
Current type is 'Linux filesystem'
 Hex code or GUID (L to show codes, Enter = 8300): # 使用默认值即可~直接 enter 下去!
 # 这里在让你选择未来这个分区预计使用的文件系统!默认都是 Linux 文件系统的 8300  !
 Command (? for help): p
 Number Start (sector) End (sector) Size Code Name
 1            2048            6143   2.0 MiB     EF02
 2            6144         2103295   1024.0 MiB  0700
 3         2103296        65026047   30.0 GiB    8E00
 4        65026048        67123199   1024.0 MiB  8300  Linux filesystem

重点在Last sector那一行,那行绝对不要使用默认值,因为默认值会将所有的容量用光。因此它默认选择最大的扇区号码。因为我们仅要1GB而已,所以你要加上+1G这样即可,不需要计算sector的数据,gdisk会根据你填写的数值,直接计算出最接近该容量的扇区数。每次新增完毕后,请立即p查看一下结果。最终出现的画面会有点像下面。

Command (? for help) : p
Number Start (sector) End (sector) Size Code Name
 1            2048            6143   2.0 MiB     EF02
 2            6144         2103295   1024.0 MiB  0700
 3         2103296        65026047   30.0 GiB    8E00
 4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
 5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data
6        69220352        70244351   500.0 MiB   8200  Linux swap

比较有趣的是文件系统的ID。Linux大概都是8200/8300/8e00等三种格式,Windows几乎都是0700,如果忘记这些数字,可以在gdisk内按下:"L"来显示。如果一切的分区状态都正常的话,那么就直接写入磁盘分区表。

 Command (? for help): w

 Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
 PARTITIONS!!

 Do you want to proceed? (Y/N): y
 OK; writing new GUID partition table (GPT) to /dev/vda.
 Warning: The kernel is still using the old partition table.
 The new table will be used at the next reboot.
 The operation has completed successfully.
 # gdisk 会先警告你可能的问题,我们确定分区是对的,这时才按下 y !不过怎么还有警告?
 # 这是因为这颗磁盘目前正在使用当中,因此系统无法立即载入新的分区表~
 [root@study ~]# cat /proc/partitions
 major minor  #blocks  name
 252        0   41943040 vda
 252        1       2048 vda1
 252        2    1048576 vda2
 252        3   31461376 vda3
 253        0   10485760 dm-0
 253        1    1048576 dm-1
 253        2    5242880 dm-2
 # 你可以发现,并没有 vda4, vda5, vda6 喔!因为核心还没有更新!

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

  • partprobe更新Linux核心的分区信息
[root@study ~]# partprobe [-s] # 你可以不要加 -s !那么屏幕不会出现讯息!
 [root@study ~]# partprobe -s # 不过还是建议加上 -s 比较清晰!
/dev/vda: gpt partitions 1 2 3 4 5 6

 [root@study ~]# lsblk /dev/vda # 实际的磁盘分区状态
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0disk
&#124;-vda1          252:1    0    2M  0 part
&#124;-vda2          252:2    0    1G  0 part /boot
&#124;-vda3          252:3    0   30G  0 part
&#124; &#124;-centos-root 253:0    0   10G  0 lvm  /
&#124; &#124;-centos-swap 253:1    0    1G  0 lvm  [SWAP]
&#124; `-centos-home 253:2    0    5G  0 lvm  /home
&#124;-vda4          252:4    0    1G  0 part
&#124;-vda5          252:5    0    1G  0 part
`-vda6          252:6    0  500M  0 part

[root@study ~]# cat /proc/partitions # 核心的分区纪录
 major minor  #blocks  name
 252        0   41943040 vda
 252        1       2048 vda1
 252        2    1048576 vda2
 252        3   31461376 vda3
 252        4    1048576 vda4
 252        5    1048576 vda5
 252        6     512000 vda6
 # 现在核心也正确的抓到了分区参数了!
  • 用gdisk删除一个分区

现在将我们刚刚新建的/dev/vda6删除。

[root@study ~]# disk /dev/vda
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1            2048            6143   2.0 MiB     EF02
2            6144         2103295   1024.0 MiB  0700
3         2103296        65026047   30.0 GiB    8E00
4        65026048        67123199   1024.0 MiB  8300  Linux filesystem
5        67123200        69220351   1024.0 MiB  0700  Microsoft basic data
6        69220352        70244351   500.0 MiB   8200  Linux swap

Command (? for help): d
 Partition number (1-6): 6

 Command (? for help): p
 # 你会发现 /dev/vda6 不见了!非常棒!没问题就写入吧!

 Command (? for help): w
 # 同样会有一堆讯息!鸟哥就不重复输出了!自己选择 y 来处理吧!

 [root@study ~]# lsblk
 # 你会发现!怪了!怎么还是有 /dev/vda6 呢?没办法!还没有更新核心的分区表啊!所以当然有错!

 [root@study ~]# partprobe -s
 [root@study ~]# lsblk
 # 这个时候,那个 /dev/vda6 才消失不见了!了解吧!
  • disk

虽然MBR分区在未来应该会慢慢的被淘汰,但是在小磁盘的使用上,这时处理MBR分区表,就得要使用fdisk。

fdisk跟gdisk使用的方式几乎一样!只是一个使用?作为指令提示数据,一个使用m作为提示。此外,fdisk有时会使用柱面(cylinder)作为分区的最小单位,与gdisk默认使用sector不太一样,另外MBR分区是有限制的(Primary, Extened, Logical)。下面为相关的指令。

[root@study ~]# disk /dev/sda
Command (m for help): m <== 输入 m 后,就会看到下面这些指令介绍
Command action
a   toggle a bootable flag
b   edit bsd disklabel
c   toggle the dos compatibility flag
d delete a partition <==删除一个partition
l   list known partition types
m   print this menu
n add a new partition <==新增一个partition
o   create a new empty DOS partition table
p print the partition table <==在屏幕上显示分区表
q quit without saving changes <==不储存离开fdisk程序
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 &lt;==将刚刚的动作写入分区表
x extra functionality (experts only)

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

分区完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,那就是"make filesystem,mkfs"这个指令。这个指令是个综合的指令,他会去调用正确的文件系统格式化工具软件!

  • XFS文件系统mkfs.xfs

我们常听到的"格式化"其实应该称为"创建文件系统(make filesystem)"才对,所以使用的指令为mkfs,因为我们要创建的其实是xfs文件系统,因此使用的是mkfs.xfs这个指令。这个指令是这样使用的:

[root@study ~]# mkfs.xfs [-b bsize] [-d parms] [-I parms] [-L label] [-f] [-r parms] 设备名称
选项与参数:
关于单位:下面只要谈到“数值”时,没有加单位则为 Bytes 值,可以用 k,m,g,t,p (小写)等来解释
比较特殊的是 s 这个单位,它指的是 sector 的“个数”!
-b :后面接的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k !
-d :后面接的是重要的 data section 的相关参数值,主要的值有:
agcount=数值 :设置需要几个储存群组的意思(AG),通常与 CPU 有关
agsize=数值 :每个 AG 设置为多少容量的意思,通常 agcount/agsize 只选一个设置即可
file :指的是“格式化的设备是个文件而不是个设备”的意思!(例如虚拟磁盘)
size=数值 :data section 的容量,亦即你可以不将全部的设备容量用完的意思
su=数值 :当有 RAID 时,那个 stripe 数值的意思,与下面的 sw 搭配使用
sw=数值 :当有 RAID 时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)
sunit=数值 :与 su 相当,不过单位使用的是“几个 sector(512Bytes大小)”的意思
swidth=数值 :就是 su*sw 的数值,但是以“几个 sector(512Bytes大小)”来设置
-f :如果设备内已经有文件系统,则需要使用这个 -f 来强制格式化才行!
-i :与 inode 有较相关的设置,主要的设置值有:
size=数值 :最小是 256Bytes 最大是 2k,一般保留 256 就足够使用了!
internal=[0&#124;1]:log 设备是否为内置?默认为 1 内置,如果要用外部设备,使用下面设置
logdev=device :log 设备为后面接的那个设备上头的意思,需设置 internal=0 才可!
size=数值 :指定这块登录区的容量,通常最小得要有 512 个 block,大约 2M 以上才行!
-L :后面接这个文件系统的标头名称 Label name 的意思!
-r :指定 realtime section 的相关设置值,常见的有:
extsize=数值 :就是那个重要的 extent 数值,一般不须设置,但有 RAID 时,
最好设置与 swidth 的数值相同较佳!最小为 4K 最大为 1G 。

范例:将前一小节分区出来的 /dev/vda4 格式化为 xfs 文件系统
[root@study ~]# mkfs.xfs /dev/vda4
meta-data=/dev/vda4       isize=256    agcount=4, agsize=65536 blks
=                sectsz=512   attr=2, projid32bit=1
=                crc=0        finobt=0
data     =                bsize=4096   blocks=262144, imaxpct=25
=                sunit=0      swidth=0 blks
naming   =version 2       bsize=4096   ascii-ci=0 ftype=0
log      =internal log    bsize=4096   blocks=2560, version=2
=                sectsz=512   sunit=0 blks, lazy-count=1
realtime =none            extsz=4096   blocks=0, rtextents=0
# 很快格是化完毕!都用默认值!较重要的是 inode 与 block 的数值
[root@study ~]# blkid /dev/vda4
 /dev/vda4: UUID="39293f4f-627b-4dfd-a015-08340537709c" TYPE="xfs"
 # 确定创建好 xfs 文件系统了!
  • XFS文件系统forRAID性能优化(Optional)

  • EXT4文件系统mkfs.ext4

[root@study ~]# mkfs.ext4 [-b size] [-L label] 设备名称
选项与参数:
 -b :设置 block 的大小,有 1K, 2K, 4K 的容量,
 -L :后面接这个设备的标头名称。
 范例:将 /dev/vda5 格式化为 ext4 文件系统
[root@study ~]# mkfs.ext4 /dev/vda5
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=   # 显示 Label name
OS type: Linux
Block size=4096 (log=2) # 每一个 block 的大小
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks # 跟 RAID 相关性较高
65536 inodes, 262144 blocks # 总计 inode/block 的数量
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups # 共有 8 个 block groups 喔!
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
 Writing inode tables: done
 Creating journal (8192 blocks): done
 Writing superblocks and filesystem accounting information: done
 [root@study ~]# dumpe2fs -h /dev/vda5
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   &lt;none&gt;
Last mounted on:          &lt;not available&gt;
Filesystem UUID:          3fd5cc6f-a47d-46c0-98c0-d43b072e0e12
....(中间省略)....
Inode count:              65536
Block count:              262144
Block size:               4096
Blocks per group:         32768
Inode size:   256
  Journal size:             32M
  • 其他文件系统mkfs

mkfs其实是个综合指令,当我们使用mkfs -t xfs时,就会使用mkfs.xfs 相关的参数。如果想知道系统还支持那种文件系统的格式化功能。直接[tab]就很清楚了。

###文件系统检验

  • xfs_repair处理XFS文件系统

当有xfs文件系统错乱才需要使用这个指令。

[root@study ~]# xfs_repair [-fnd] 设备名称
选项与参数:
 -f :后面的设备其实是个文件而不是实体设备
 -n :单纯检查并不修改文件系统的任何数据 (检查而已)
 -d :通常用在单人维护模式下面,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用
 范例:检查一下刚刚创建的 /dev/vda4 文件系统
[root@study ~]# xfs_repair /dev/vda4
Phase 1 - find and verify superblock...
Phase 2 - using internal log
Phase 3 - for each AG...
Phase 4 - check for duplicate blocks...
Phase 5 - rebuild AG headers and trees...
Phase 6 - check inode connectivity...
Phase 7 - verify and correct link counts...
done
# 共有 7 个重要的检查流程!详细的流程介绍可以 man xfs_repair 即可!
范例:检查一下系统原本就有的 /dev/centos/home 文件系统
 [root@study ~]# xfs_repair /dev/centos/home
 xfs_repair: /dev/centos/home contains a mounted filesystem
 xfs_repair: /dev/centos/home contains a mounted and writable filesystem
 fatal error -- couldn't initialize XFS library
  • fsck.ext4处理ext4文件系统

fsck是个综合指令,如果是针对ext4的话,建议直接使用fsck.ext4来检测比较妥当,

[root@study ~]# fsck.ext4 [-pf] [-b superblock] 设备名称
选项与参数:
-p :当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。
-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入
细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标 !
-D :针对文件系统下的目录进行最优化配置。
-b :后面接 superblock 的位置!一般来说这个选项用不到。但是如果你的 superblock 因故损毁时,
通过这个参数即可利用文件系统内备份的 superblock 来尝试救援。一般来说,superblock 备份在:
1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768
范例:找出刚刚创建的 /dev/vda5 的另一块 superblock,并据以检测系统
 [root@study ~]# dumpe2fs -h /dev/vda5 &#124; grep 'Blocks per group'
 Blocks per group:         32768
 # 看起来每个 block 群组会有 32768 个 block,因此第二个 superblock 应该就在 32768 上!
 # 因为 block 号码为 0 号开始编的!
 [root@study ~]# fsck.ext4 -b 32768 /dev/vda5
 e2fsck 1.42.9 (28-Dec-2013)
 /dev/vda5 was not cleanly unmounted, check forced.
 Pass 1: Checking inodes, blocks, and sizes
 Deleted inode 1577 has zero dtime.  Fix&lt;y&gt;? yes
 Pass 2: Checking directory structure
 Pass 3: Checking directory connectivity
 Pass 4: Checking reference counts
 Pass 5: Checking group summary information
 /dev/vda5: ***** FILE SYSTEM WAS MODIFIED ***** # 文件系统被改过,所以这里会有警告!
 /dev/vda5: 11/65536 files (0.0% non-contiguous), 12955/262144 blocks
 # 好巧合!鸟哥使用这个方式来检验系统,恰好遇到文件系统出问题!于是可以有比较多的解释方向!
 # 当文件系统出问题,它就会要你选择是否修复~如果修复如上所示,按下 y 即可!
 # 最终系统会告诉你,文件系统已经被更改过,要注意该项目的意思!
 范例:已默认设置强制检查一次 /dev/vda5
 [root@study ~]# fsck.ext4 /dev/vda5
 e2fsck 1.42.9 (28-Dec-2013)
 /dev/vda5: clean, 11/65536 files, 12955/262144 blocks
 # 文件系统状态正常,它并不会进入强制检查!会告诉你文件系统没问题 (clean)
 [root@study ~]# fsck.ext4 -f /dev/vda5
 e2fsck 1.42.9 (28-Dec-2013)
 Pass 1: Checking inodes, blocks, and sizes
 ....(下面省略)...

###文件系统挂载与卸载

挂载前,需要先确定几件事:

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

而要将文件系统挂载到我们的Linux系统上,需要使用mount这个指令。

[root@study ~]# mount -a
[root@study ~]# mount [-l]
[root@study ~]# mount [-t 文件系统] LABEL='' 挂载点
[root@study ~]# mount [-t 文件系统] UUID='' 挂载点 # 鸟哥近期建议用这种方式喔!
[root@study ~]# mount [-t 文件系统] 设备文件名 挂载点
选项与参数:
-a :依照配置文件 [/etc/fstab](../Text/index.html#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: 重新挂载,这在系统出错,或重新更新参数时,很有用!

系统指定哪些类型的filesystem才需要挂载测试?主要参考下面这两个文件:

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

Linux支持的文件系统驱动程序都写在如下的目录下:

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

过去我们习惯使用设备文件名然后直接使用文件名挂载,不过建议使用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 左右没问题!
 范例:使用相同的方式,将 /dev/vda5 挂载于 /data/ext4
 [root@study ~]# blkid /dev/vda5
 /dev/vda5: UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" TYPE="ext4"
 [root@study ~]# mkdir /data/ext4
 [root@study ~]# mount UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" /data/ext4
 [root@study ~]# df /data/ext4
 Filesystem     1K-blocks  Used Available Use% Mounted on
   /dev/vda5         999320  2564    927944   1% /data/ext4
  • 挂载CD或DVD光盘
范例:将你用来安装 Linux 的 CentOS 原版光盘拿出来挂载到 /data/cdrom!
[root@study ~]# balked
 .....(前面省略).....
 /dev/sr0: UUID="2015-04-01-00-21-36-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
 [root@study ~]# mkdir /data/cdrom
 [root@study ~]# mount /dev/sr0 /data/cdrom
 mount: /dev/sr0 is write-protected, mounting read-only
 [root@study ~]# df /data/cdrom
 Filesystem     1K-blocks    Used Available Use% Mounted on
 /dev/sr0         7413478 7413478         0 100% /data/cdrom
# 怎么会使用掉 100% 呢?是啊!因为是 DVD 啊!所以无法再写入了啊!
  • 挂载vfat中文U盘(USB磁盘)
范例:找出你的U盘设备的 UUID,并挂载到 /data/usb 目录中
[root@study ~]# blkid
 /dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
 [root@study ~]# mkdir /data/usb
 [root@study ~]# mount -o codepage=950,iocharset=utf8 UUID="35BC-6D6B" /data/usb
 [root@study ~]# # mount -o codepage=950,iocharset=big5 UUID="35BC-6D6B" /data/usb
 [root@study ~]# df /data/usb
 Filesystem     1K-blocks  Used Available Use% Mounted on
 /dev/sda1        2092344     4   2092340   1% /data/usb
  • 重新挂载根目录与挂载不特定目录

如果你的挂载参数要改变, 或者是根目录出现“只读”状态时,如何重新挂载呢?最可能的处理方 式就是重新开机 (reboot)! 不过你也可以这样做:

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

另外,我们也可以利用 mount 来将某个目录挂载到另外一个目录去喔!这并不是挂载文件系 统,而是额外挂载某个目录的方法! 虽然下面的方法也可以使用 symbolic link 来链接,不过 在某些不支持符号链接的程序运行中,还是得要通过这样的方法才行。

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 情况下卸载。

范例:将之前自行挂载的文件系统全部卸载:
[root@study ~]# mount
.....(前面省略).....
/dev/vda4 on /data/xfs type xfs (rw,relatime,seclabel,attr2,inode64,logbsize=256k,sunit=512,..)
/dev/vda5 on /data/ext4 type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sr0 on /data/cdrom type iso9660 (ro,relatime)
/dev/sda1 on /data/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=950,iocharset=...)
/dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
# 先找一下已经挂载的文件系统,如上所示,特殊字体即为刚刚挂载的设备 !
# 基本上,卸载后面接设备或挂载点都可以!不过最后一个 centos-root 由于有其他挂载,
# 因此,该项目一定要使用挂载点来卸载才行!

[root@study ~]# umount /dev/vda4      <==用设备文件名来卸载
[root@study ~]# umount /data/ext4     <==用挂载点来卸载
[root@study ~]# umount /data/cdrom    <==因为挂载点比较好记忆!
[root@study ~]# umount /data/usb     
[root@study ~]# umount /data/var      <==一定要用挂载点!因为设备有被其他方式挂载

###磁盘/文件系统参数修订

  • mknod

在Linux下面所有的设备都以文件来表示,但是那个文件如何代表设备呢?就是通过文件的major与minor数值来代替的。举例来说

root@study ~]# ll /dev/vda*
brw-rw----. 1 root disk 252, 0 Jun 24 02:30 /dev/vda
brw-rw----. 1 root disk 252, 1 Jun 24 02:30 /dev/vda1
brw-rw----. 1 root disk 252, 2 Jun 15 23:43 /dev/vda2
brw-rw----. 1 root disk 252, 3 Jun 15 23:43 /dev/vda3
brw-rw----. 1 root disk 252, 4 Jun 24 20:00 /dev/vda4
brw-rw----. 1 root disk 252, 5 Jun 24 21:15 /dev/vda5

上表当中 252 为主要设备代码 (Major) 而 0~5 则为次要设备代码 (Minor)。 我们的 Linux 核心认识的设备数据就是通过这两个数值来决定的!

某些情况下面我们可能还是得要手动处理设备文件的,例如 在某些服务被关到特定目录下时(chroot), 就需要这样做了。此时这个 mknod 就得要知道 如何操作才行!

[root@study ~]# mknod 设备文件名 [bcp] [Major] [Minor]
选项与参数:
 设备种类:
 b :设置设备名称成为一个周边储存设备文件,例如磁盘等;
 c :设置设备名称成为一个周边输入设备文件,例如鼠标/键盘等;
 p :设置设备名称成为一个 FIFO 文件;
 Major :主要设备代码;
 Minor :次要设备代码;
 范例:由上述的介绍我们知道 /dev/vda10 设备代码 252, 10,请创建并查阅此设备
 [root@study ~]# mknod /dev/vda10 b 252 10
 [root@study ~]# ll /dev/vda10
 brw-r--r--. 1 root root 252, 10 Jun 24 23:40 /dev/vda10
 # 上面那个 252 与 10 是有意义的,不要随意设置啊!
 范例:创建一个 FIFO 文件,文件名为 /tmp/testpipe
 [root@study ~]# mknod /tmp/testpipe p
 [root@study ~]# ll /tmp/testpipe
 prw-r--r--. 1 root root 0 Jun 24 23:44 /tmp/testpipe
 # 注意啊!这个文件可不是一般文件,不可以随便就放在这里!
 # 测试完毕之后请删除这个文件吧!看一下这个文件的类型!是 p 喔!^_^
 [root@study ~]# rm /dev/vda10 /tmp/testpipe
 rm: remove block special file '/dev/vda10' ? y
 rm: remove fifo '/tmp/testpipe' ? y
  • xfs_admin修改XFS文件系统的UUID与label name
[root@study ~]# xfs_admin [-lu] [-L label] [-U uuid] 设备文件名
选项与参数:
 -l :列出这个设备的 label name
 -u :列出这个设备的 UUID
 -L :设置这个设备的 Label name
 -U :设置这个设备的 UUID 喔!
 范例:设置 /dev/vda4 的 label name 为 vbird_xfs,并测试挂载
 [root@study ~]# xfs_admin -L vbird_xfs /dev/vda4
 writing all SBs
 new label = "vbird_xfs" # 产生新的 LABEL 名称 !
 [root@study ~]# xfs_admin -l /dev/vda4
 label = "vbird_xfs"
 [root@study ~]# mount LABEL=vbird_xfs /data/xfs/
 范例:利用 uuidgen 产生新 UUID 来设置 /dev/vda4,并测试挂载
[root@study ~]# umount /dev/vda4 # 使用前,请先卸载!
[root@study ~]# uuidgen
e0fa7252-b374-4a06-987a-3cb14f415488 # 很有趣的指令!可以产生新的 UUID 喔!
[root@study ~]# xfs_admin -u /dev/vda4
UUID = e0a6af55-26e7-4cb7-a515-826a8bd29e90
[root@study ~]# xfs_admin -U e0fa7252-b374-4a06-987a-3cb14f415488 /dev/vda4
Clearing log and setting UUID
writing all SBs
new UUID = e0fa7252-b374-4a06-987a-3cb14f415488
[root@study ~]# mount UUID=e0fa7252-b374-4a06-987a-3cb14f415488 /data/xfs
  • tune2fs修改ext4的label name与UUID
[root@study ~]# tune2fs [-l] [-L label] [-U UUID] 设备文件名
选项与参数:
 -l :类似 dumpe2fs -h 的功能~将 superblock 内的数据读出来~
 -L :修改 LABEL name
 -U :修改 UUID  !
 范例:列出 /dev/vda5 的 label name 之后,将它改成 vbird_ext4
 [root@study ~]# dumpe2fs -h /dev/vda5 &#124; grep name
 dumpe2fs 1.42.9 (28-Dec-2013)
 Filesystem volume name: &lt;none&gt; # 果然是没有设置的!
 [root@study ~]# tune2fs -L vbird_ext4 /dev/vda5
 [root@study ~]# dumpe2fs -h /dev/vda5 &#124; grep name
 Filesystem volume name:   vbird_ext4
   [root@study ~]# mount LABEL=vbird_ext4 /data/ext4

转载于:https://my.oschina.net/tucci/blog/1476527

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值