【Linux】Linux 磁盘与文件系统管理命令

2019-05-14  本文已影响0人  w1992wishes

来自《鸟哥的 Linux 私房菜》,重复只是加深自己的印象。

本篇结构:

一、文件系统的简单操作

1.1、磁盘与目录的容量

磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode
当中记载的。在命令行下面该如何叫出这几个数据呢?

1.1.1、 df

df [-ahikHTm] [目录或文件名]

选项与参数:

image

在 Linux 下面如果 df 没有加任何选项,那么默认会将系统内所有的,(不含特殊内存内的文件系统与 swap) 都以 1 KBytes 的容量来列出来!

所输出的结果信息:

范例一:将系统内的所有特殊文件格式及名称都列出来

image

范例二:将 /etc 下面的可用的磁盘容量以易读的容量格式显示

root@master:~# df -h /etc
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-root 476G  148G  304G  33% /

范例三:将目前各个 partition 当中可用的 inode 数量列出

root@master:~# df -ih
Filesystem            Inodes  IUsed IFree IUse%  Mounted on
udev                    7.9M   419  7.9M   1% /dev
tmpfs                   7.9M   861  7.9M   1% /run
/dev/mapper/ubuntu--vg-root 31M  402K   30M    2% /
tmpfs                   7.9M     4  7.9M   1% /dev/shm
tmpfs                   7.9M     4  7.9M   1% /run/lock
tmpfs                   7.9M    16  7.9M   1% /sys/fs/cgroup
/dev/sda1               122K   310  122K   1% /boot
tmpfs                   7.9M     4  7.9M   1% /run/user/0
tmpfs                   7.9M     4  7.9M   1% /run/user/1000

由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个指令显示结果的速度非常的快速!在显示的结果中需要特别留意的是根目录的剩余容量! 因为所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下 0 时,那 Linux 可能就问题很大了。

需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个挂载点,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是 Linux 系统所需要载入的系统数据,而且是挂载在“内存当中”的, 所以当然没有占任何的磁盘空间。

/dev/shm/ 目录,其实是利用内存虚拟出来的磁盘空间,通常是总实体内存的一半!由于是通过内存仿真出来的磁盘,因此你在这个目录下面创建任何数据文件时,存取速度是非常快速的!(在内存内工作) 不过,也由于他是内存仿真出来的,因此这个文件系统的大小在每部主机上都不一样,而且创建的东西在下次开机时就消失了! 因为是在内存中!

1.1.2、du

du [-ahskm] 文件或目录名称

选项与参数:

直接输入 du 没有加任何选项时,则 du 会分析“目前所在目录”的文件与目录所占用的磁盘空间。但是,实际显示时,仅会显示目录容量(不含文件),因此 . 目录有很多文件没有被列出来,所以全部的目录相加不会等于 . 的容量。此外,输出的数值数据为 1K 大小的容量单位。加上参数 -a 则可以将文件容量也显示出来。

范例一:检查根目录下面每个目录所占用的容量

du -sm /*

16  /bin
108 /boot
... 省略 ...
du: cannot access '/proc/104399/fd/4': No such file or directory
du: cannot access '/proc/104399/fdinfo/4': No such file or directory
... 省略 ...
1692    /tmp
9607    /usr
41054   /var

这是个很常被使用的功能,利用万用字符 * 来代表每个目录,如果想要检查某个目录下,哪个次目录占用最大的容量,可以用这个方法找出来。至于 /proc 里头会列出一堆“No such file or directory” 的错误,因为是内存内的程序,程序执行结束就会消失,因此会有些目录找不到,是正确的!

与 df 不一样的是,du 这个指令其实会直接到文件系统内去搜寻所有的文件数据,所以指令的运行会执行一小段时间。此外,在默认的情况下,容量的输出是以 KB 来设计的, 如果想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可,如果只想要知道该目录占了多少容量的话,使用 -s 就可以。

至于 -S 这个选项部分,由于 du 默认会将所有文件的大小均列出,因此假设在 /etc 下面使用 du 时, 所有的文件大小,包括 /etc 下面的次目录容量也会被计算一次。然后最终的容量(/etc) 也会加总一次, 因此很多朋友都会误会 du 分析的结果不太对劲。如果想要列出某目录下的全部数据, 或许也可以加上 -S 的选项,减少次目录的加总。

1.2、实体链接与符号链接: ln

1.2.1、Hard Link (实体链接, 硬式链接或实际链接)

也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。那么想一想, 有没有可能有多个文件名对应到同一个 inode 号码呢?有的!那就是 hard link 的由来。

简单说:hard link 只是在某个目录下新增一笔文件名链接到某 inode 号码的关连记录而已

如图,有个 /root/crontab 是 /etc/crontab 的实体链接,这两个文件名链接到同一个 inode :

使用 hard link 设置链接文件时,磁盘的空间与 inode 的数目都不会改变, hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量(其实还是可能会改变系统的 block 的,那就是当新增这笔数据却刚好将目录的 block 填满时,就可能会新加一个 block 来记录文件名关连性,而导致磁盘空间的变化)。

由图也可知,事实上 hard link 应该仅能在单一文件系统中进行的,应该是不能够跨文件系统,所以 hard link 是有限制的

因为如果使用 hard link 链接到目录时, 链接的数据需要连同被链接目录下面的所有数据都创建链接。

1.2.2、Symbolic Link (符号链接,亦即是捷径)

相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名!由于只是利用文件来做为指向的动作, 所以,当来源文件被删除之后,symbolic link 的文件会“开不了”, 会一直说“无法打开某文件!”。实际上就是找不到原始“文件名”而已。

image

如图:

由 1 号 inode 读取到链接文件的内容仅有文件名,根据文件名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法通过链接文件读取的问题了!

这个 Symbolic Link 与 Windows 的捷径可以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 。

1.2.3、指令

ln [-sf] 来源文件 目标文件

选项与参数:

关于目录的 link 数量:

一个“空目录”里面至少会存在 . 与 .. 这两个目录。那么,当创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:

而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录,而 /tmp/testing/.. 则代表 /tmp 这个目录。所以说,当创建一个新的目录时, “新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1。

二、磁盘的分区、格式化、检验与挂载

想要在系统里面新增一颗磁盘时,应该有如下动作需要做:

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

2.1、观察磁盘分区状态

目前磁盘分区主要有 MBR 以及 GPT 两种格式,这两种格式所使用的分区工具不太一样,因此分区前要去找一下目前系统有的磁盘有哪些, 这些磁盘是 MBR 还是 GPT 等等。

2.1.1、lsblk 列出系统上的所有磁盘列表

lsblk 可以看成“ list block device ”的缩写,就是列出所有储存设备的意思。

lsblk [-dfimpt] [device]

选项与参数:

范例一:列出本系统下的所有磁盘与磁盘内的分区信息

root@master:/dev# lsblk
NAME                  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                     8:0    0   500G  0 disk 
├─sda1                  8:1    0   487M  0 part /boot
├─sda2                  8:2    0     1K  0 part 
└─sda5                  8:5    0 499.5G  0 part 
  ├─ubuntu--vg-root   252:0    0 483.5G  0 lvm  /
  └─ubuntu--vg-swap_1 252:1    0    16G  0 lvm  [SWAP]
sr0                    11:0    1  1024M  0 rom  

系统主要有个 sr0 以及一个 sda 的设备,而 sda 的设备下面又有三个分区, 其中 sda5 甚至还有因为 LVM 产生的文件系统。

范例二:仅列出 /dev/sda 设备内的所有数据的完整文件名

root@master:/dev# lsblk -ip /dev/sda
NAME                    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
/dev/sda                  8:0    0   500G  0 disk 
|-/dev/sda1               8:1    0   487M  0 part /boot
|-/dev/sda2               8:2    0     1K  0 part 
`-/dev/sda5               8:5    0 499.5G  0 part 
  |-/dev/mapper/ubuntu--vg-root  252:0 0 483.5G  0 lvm  /
  `-/dev/mapper/ubuntu--vg-swap_1 252:1 0 16G  0 lvm  [SWAP]

2.1.2、blkid 列出设备的 UUID 等参数

lsblk 可以使用 -f 也可以来列出文件系统与设备的 UUID 数据。

UUID 是全域单一识别码 (universally unique identifier),Linux 会将系统内所有的设备都给予一个独一无二的识别码, 这个识别码就可以拿来作为挂载或者是使用这个设备/文件系统之用。

root@master:/dev# blkid
/dev/sda1: UUID="4ed77cbc-f446-4918-90ca-4e6b6fc7d97c" TYPE="ext2" PARTUUID="863f83f3-01"
/dev/sda5: UUID="lYIIQX-XyCX-1hpS-bLSR-yXX7-SdqL-6Swqvq" TYPE="LVM2_member" PARTUUID="863f83f3-05"
/dev/mapper/ubuntu--vg-root: UUID="4eb8d680-6565-494a-bf6e-3c15e48eda1b" TYPE="ext4"
/dev/mapper/ubuntu--vg-swap_1: UUID="b2d65ad5-9053-4315-83ae-ddba10e59f57" TYPE="swap"

每一行代表一个文件系统,主要列出设备名称、UUID 名称以及文件系统的类型。

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

parted device_name print

范例一:列出 /dev/sda 磁盘的相关数据

root@master:/dev# parted /dev/sda print
Model: VMware Virtual disk (scsi) # 磁盘的模块名称(厂商)
Disk /dev/sda: 537GB # 磁盘的总容量
Sector size (logical/physical): 512B/512B # 磁盘的每个逻辑/物理扇区容量
Partition Table: msdos # 分区表的格式 (MBR/GPT)
Disk Flags: 
# 下面才是分区数据
Number  Start   End    Size   Type      File system  Flags
 1      1049kB  512MB  511MB  primary   ext2         boot
 2      513MB   537GB  536GB  extended
 5      513MB   537GB  536GB  logical                lvm

2.2、磁盘分区: gdisk/fdisk

MBR 分区表请使用 fdisk 分区, GPT 分区表请使用 gdisk 分区,否则会分区失败。

所以先通过 lsblk 或 blkid 先找到磁盘,再用 parted /dev/xxx print 来找出内部的分区表类型,之后才用 gdisk 或 fdisk 来操作系统。

2.2.1、gdisk

先看看 gdisk。

gdisk 设备名称

范例:观察该磁盘的分区与相关数据(鸟哥书上的代码,我的设备是 MBR 分区表)

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):

先来看看分区表信息。

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 ”可以列出目前这颗磁盘的分区表信息,这个信息的上半部在显示整体磁盘的状态。下半部的分区表信息主要在列出每个分区的个别信息项目。每个项目的意义为:

具体新增分区的操作见《鸟哥的 Linux 私房菜》378 页。

2.2.2、partprobe 更新 Linux 核心的分区表信息

partprobe [-s] # 可以不要加 -s !那么屏幕不会出现信息!

partprobe -s # 不过还是建议加上 -s 比较清晰!

2.2.3、fdisk

虽然 MBR 分区表在未来应该会慢慢的被淘汰,毕竟现在磁盘容量随便都大于 2T 以上了,不过依旧有些旧的系统,以及虚拟机的使用上面,还是有小磁盘存在的空间!这时处理 MBR 分区表, 就得要使用 fdisk。

fdisk 跟 gdisk 使用的方式几乎一样,只是一个使用 ? 作为指令提示数据,一个使用 m 作为提示这样而已。此外,fdisk 有时会使用柱面 (cylinder) 作为分区的最小单位,与 gdisk 默认使用 sector 不太一样。

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

格式化的指令非常的简单,那就是“make filesystem, mkfs” 这个指令!这个指令其实是个综合的指令,他会去调用正确的文件系统格式化工具软件!

我们常听到的“格式化”其实应该称为“创建文件系统 (make filesystem)”才对,使用的指令是 mkfs 。

2.3.1、EXT4 文件系统 mkfs.ext4

想要格式化为 ext4 的传统 Linux 文件系统的话,可以使用 mkfs.ext4 这个指令。

mkfs.ext4 [-b size] [-L label] 设备名称

选项与参数:

范例:将 /dev/vda5 格式化为 ext4 文件系统

 mkfs.ext4 /dev/vda5

2.3.2、XFS 文件系统 mkfs.xfs

mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \
[-r parms] 设备名称

选项与参数:

2.3.3、其他文件系统 mkfs

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

mkfs[tab][tab]
mkfs          mkfs.bfs      mkfs.btrfs    mkfs.cramfs   mkfs.ext2     mkfs.ext3     mkfs.ext4     mkfs.ext4dev  mkfs.fat      mkfs.minix    mkfs.msdos    mkfs.ntfs     mkfs.vfat     mkfs.xfs 

2.4、文件系统检验

文件系统运行时会有磁盘与内存数据非同步的状况发生,因此莫名其妙的死机非常可能导致文件系统的错乱。

2.4.1、xfs_repair 处理 XFS 文件系统

xfs_repair [-fnd] 设备名称

选项与参数:

范例一:检查一下刚刚创建的 /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

xfs_repair 可以检查/修复文件系统,不过,因为修复文件系统是个很庞大的任务!因此,修复时该文件系统不能被挂载! 所以,检查与修复 /dev/vda4 没啥问题,但是修复/dev/centos/home 这个已经挂载的文件系统时,就出现上述的问题了! 没关系,若可以卸载,卸载后再处理即可。

Linux 系统有个设备无法被卸载,那就是根目录!如果你的根目录有问题怎办?这时得要进入单人维护或救援模式,然后通过 -d 这个选项来处理! 加入 -d 这个选项后,系统会强制检验该设备,检验完毕后就会自动重新开机!

2.4.2、fsck.ext4 处理 EXT4 文件系统

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

fsck.ext4 [-pf] [-b superblock] 设备名称

选项与参数:

2.5、文件系统挂载与卸载

进行挂载前,最好先确定几件事:

[root@study ~]# mount -a
[root@study ~]# mount [-l]
[root@study ~]# mount [-t 文件系统] LABEL='' 挂载点
[root@study ~]# mount [-t 文件系统] UUID='' 挂载点 # 鸟哥近期建议用这种方式!
[root@study ~]# mount [-t 文件系统] 设备文件名 挂载点

选项与参数:

2.5.1、挂载 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

范例二:使用相同的方式,将 /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

2.5.2、重新挂载根目录与挂载不特定目录

整个目录树最重要的地方就是根目录了,所以根目录根本就不能够被卸载的。如果挂载参数要改变, 或者是根目录出现“只读”状态时,如何重新挂载呢?最可能的处理方式就是重新开机 (reboot)!

不过也可以这样做:

范例:将 / 重新挂载,并加入参数为 rw 与 auto

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

另外,也可以利用 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

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

2.6、umount (将设备文件卸载)

umount [-fn] 设备文件名或挂载点

选项与参数:

三、设置开机挂载

但是挂载是临时的,系统重启后需要重新挂载,如果希望下次启动时,自动挂载,需要按照下述操作。

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

先查阅一下 /etc/fstab 这个文件的内容。

[root@study ~]# cat /etc/fstab
Device Mount point filesystem parameters dump fsck
/dev/mapper/centos-root / xfs defaults 0 0
UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0

/etc/fstab (filesystem table) 就是将利用 mount 指令进行挂载时, 将所有的选项与参数写入到这个文件中。除此之外, /etc/fstab 还加入了 dump 这个备份用指令的支持! 与开机时是否进行文件系统检验 fsck 等指令有关。

这个文件的内容共有六个字段,各个字段的总结数据与详细数据如下:

[设备/UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]

第一栏:磁盘设备文件名/UUID/LABEL name:

这个字段可以填写的数据主要有三个项目:

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

就是挂载的目录。

第三栏:磁盘分区的文件系统:

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

第四栏:文件系统参数:

参数 内容意义
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 的存在?如果不是可执行文件放置目录,也 可以设置为 nosuid 来取消这个功能!
defaults 同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。 基本上, 默认情况使用 defaults 设置即可!

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

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

第六栏:是否以 fsck 检验扇区:

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

例题:假设我们要将 /dev/vda4 每次开机都自动挂载到 /data/xfs ,该如何进行?

# 首先,请用 nano 将下面这一行写入 /etc/fstab 最后面中;

[root@study ~]# nano /etc/fstab
UUID="e0fa7252-b374-4a06-987a-3cb14f415488" /data/xfs xfs defaults 0 0

# 再来看看 /dev/vda4 是否已经挂载,如果挂载了,请务必卸载再说!
[root@study ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda4 1038336 32864 1005472 4% /data/xfs
# 竟然不知道何时被挂载了?赶紧给他卸载先!
# **因为,如果要被挂载的文件系统已经被挂载了(无论挂载在哪个目录),那测试就不会进行喔!**
[root@study ~]# umount /dev/vda4

# 最后测试一下刚刚我们写入 /etc/fstab 的语法有没有错误!这点很重要!因为这个文件如果写错了, 则你的 Linux 很可能将无法顺利开机完成!所以请务必要测试测试!
[root@study ~]# mount -a
[root@study ~]# df /data/xfs

最终有看到 /dev/vda4 被挂载起来的信息才是成功的挂载了!而且以后每次开机都会顺利的将此文件系统挂载起来的!

3.2、特殊设备 loop 挂载

如果有光盘镜像文件,或者是使用文件作为磁盘的方式时,那就得要使用特别的方法来将他挂载起来,不需要烧录!

3.2.1、挂载光盘/DVD镜像文件

如果下载了 Linux 或者是其他所需光盘/DVD的镜像文件后, 难道一定需要烧录成为光盘才能够使用该文件里面的数据吗?当然不是!我们可以通过 loop 设备来挂
载的!

ll -h /tmp/CentOS-7.0-1406-x86_64-DVD.iso
-rw-r--r--. 1 root root 3.9G Jul 7 2014 /tmp/CentOS-7.0-1406-x86_64-DVD.iso
# 看到上面的结果吧!这个文件就是镜像文件,文件非常的大吧!

[root@study ~]# mkdir /data/centos_dvd
[root@study ~]# mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd
[root@study ~]# df /data/centos_dvd
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/loop0 4050860 4050860 0 100% /data/centos_dvd
# 就是这个项目! .iso 镜像文件内的所有数据可以在 /data/centos_dvd 看到!
[root@study ~]# ll /data/centos_dvd
total 607
-rw-r--r--. 1 500 502 14 Jul 5 2014 CentOS_BuildTag <==瞧!就是DVD的内容啊!
drwxr-xr-x. 3 500 502 2048 Jul 4 2014 EFI
-rw-r--r--. 1 500 502 611 Jul 5 2014 EULA
-rw-r--r--. 1 500 502 18009 Jul 5 2014 GPL
drwxr-xr-x. 3 500 502 2048 Jul 4 2014 images
.....(下面省略).....
[root@study ~]# umount /data/centos_dvd/
# 测试完成!记得将数据给他卸载!同时这个镜像文件也被鸟哥删除了...测试机容量不够大!

四、内存交换空间(swap)之创建

以前的年代因为内存不足,因此那个可以暂时将内存的程序拿到硬盘中暂放的内存交换空间(swap) 就显的非常的重要! 否则,如果突然间某支程序用掉你大部分的内存,那你的系统恐怕有损毁的情况发生。

一般来说,如果硬件的配备资源足够的话,那么 swap 应该不会被系统所使用到,swap 会被利用到的时刻通常就是实体内存不足的情况了。 CPU 所读取的数据都来自于内存, 那当内存不足的时候,为了让后续的程序可以顺利的运行,因此在内存中暂不使用的程序与数据就会被挪到 swap 中了。 此时内存就会空出来给需要执行的程序载入。由于 swap 是用磁盘来暂时放置内存中的信息,所以用到 swap 时,主机磁盘灯就会开始闪个不停!

4.1、使用实体分区创建swap

创建 swap 分区的方式也是非常的简单的!通过下面几个步骤就搞定:

  1. 分区:先使用 gdisk 在磁盘中分区出一个分区给系统作为 swap 。由于 Linux 的 gdisk 默认会将分区的 ID 设置为 Linux 的文件系统,所以可能还得要设置一下 system ID。
  2. 格式化:利用创建 swap 格式的“mkswap 设备文件名”就能够格式化该分区成为 swap 格式。
  3. 使用:最后将该 swap 设备启动,方法为:“swapon 设备文件名”。
  4. 观察:最终通过 free 与 swapon -s 这个指令来观察一下内存的用量吧!

具体操作:

  1. 先进行分区的行为
[root@study ~]# gdisk /dev/vda
Command (? for help): n
Partition number (6-128, default 6):
First sector (34-83886046, default = 69220352) or {+-}size{KMGTP}:
Last sector (69220352-83886046, default = 83886046) or {+-}size{KMGTP}: +512M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
6 69220352 70268927 512.0 MiB 8200 Linux swap # 重点就是产生这东西!
Command (? for help): w
Do you want to proceed? (Y/N): y
[root@study ~]# partprobe
[root@study ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
.....(中间省略).....
`-vda6 252:6 0 512M 0 part # 确定这里是存在的才行!
# 鸟哥有简化输出喔!结果可以看到我们多了一个 /dev/vda6 可以使用于 swap 喔!
  1. 开始创建 swap 格式
[root@study ~]# mkswap /dev/vda6
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=6b17e4ab-9bf9-43d6-88a0-73ab47855f9d
[root@study ~]# blkid /dev/vda6
/dev/vda6: UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d" TYPE="swap"

# 确定格式化成功!且使用 blkid 确实可以抓到这个设备了喔
  1. 开始观察与载入看看
[root@study ~]# free
total used free shared buff/cache available
Mem: 1275140 227244 330124 7804 717772 875536 # 实体内存
Swap: 1048572 101340 947232 # swap 相关

# 我有 1275140K 的实体内存,使用 227244K 剩余 330124K ,使用掉的内存有 717772K 用在缓冲/高速缓存的用途中。至于 swap 已经有 1048572K !这样会看了吧?!

[root@study ~]# swapon /dev/vda6
[root@study ~]# free
total used free shared buff/cache available
Mem: 1275140 227940 329256 7804 717944 874752
Swap: 1572856 101260 1471596 <==有看到增加了没?
[root@study ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1048572 101260 -1
/dev/vda6 partition 524284 0 -2

# 上面列出目前使用的 swap 设备有哪些的意思!

[root@study ~]# nano /etc/fstab
UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d" swap swap defaults 0 0

# 当然要写入配置文件,只不过不是文件系统,所以没有挂载点!第二个字段写入 swap 即可。

4.2、使用文件创建swap

如果是在实体分区无法支持的环境下,此时前一小节提到的 loop 设备创建方法就派的上用场,与实体分区不一样的,这个方法只是利用 dd 去创建一个大文件而已。

  1. 使用 dd 这个指令来新增一个 128MB 的文件在 /tmp 下面:
[root@study ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128
128+0 records in
128+0 records out
134217728 Bytes (134 MB) copied, 1.7066 seconds, 78.6 MB/s
[root@study ~]# ll -h /tmp/swap
-rw-r--r--. 1 root root 128M Jun 26 17:47 /tmp/swap

# 这个指令的简单意义如下:
# if 是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的设备!
# of 是 output file ,将一堆零写入到后面接的文件中。
# bs 是每个 block 大小,就像文件系统那样的 block 意义;
# count 则是总共几个 bs 的意思。所以 bs*count 就是这个文件的容量了!
  1. 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式:
[root@study ~]# mkswap /tmp/swap
Setting up swapspace version 1, size = 131068 KiB
no label, UUID=4746c8ce-3f73-4f83-b883-33b12fa7337c

# 这个指令下达时请“特别小心”,因为下错字符控制,将可能使您的文件系统挂掉!
  1. 使用 swapon 来将 /tmp/swap 启动:
[root@study ~]# swapon /tmp/swap
[root@study ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1048572 100380 -1
/dev/vda6 partition 524284 0 -2
/tmp/swap file 131068 0 -3
  1. 使用 swapoff 关掉 swap file,并设置自动启用:
[root@study ~]# nano /etc/fstab
/tmp/swap swap swap defaults 0 0

# 为何这里不要使用 UUID 呢?这是因为系统仅会查询区块设备 (block device) 不会查询文件!

# 所以,这里千万不要使用 UUID,不然系统会查不到喔!

[root@study ~]# swapoff /tmp/swap /dev/vda6
[root@study ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 1048572 100380 -1

# 确定已经回复到原本的状态了!然后准备来测试!!

[root@study ~]# swapon -a
[root@study ~]# swapon -s

# 最终你又会看正确的三个 swap 出现啰!这也才确定你的 /etc/fstab 设置无误!

swap 在目前的桌面电脑来讲,存在的意义已经不大了!这是因为目前的 x86 主机所含的内存实在都太大了 (一般入门级至少也都有 4GB 了),所以, Linux 系统大概都用不到 swap 这个玩意儿的。不过, 如果是针对服务器或者是工作站这些常年上线的系统来说的话,那么,无论如何,swap 还是需要创建的。

五、补充

5.1、利用 GNU 的 parted 进行分区行为(Optional)

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

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

parted [设备] [指令 [参数]]

选项与参数:
指令功能:

范例一:以 parted 列出目前本机的分区表数据

[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 <==是 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 ]
  1. Number:这个就是分区的号码!举例来说,1号代表的是 /dev/vda1 的意思;
  2. Start:分区的起始位置在这颗磁盘的多少 MB 处,他以容量作为单位;
  3. End:此分区的结束位置在这颗磁盘的多少 MB 处;
  4. Size:由上述两者的分析,得到这个分区有多少容量;
  5. File system:分析可能的文件系统类型为何的意思;
  6. Name:就如同 gdisk 的 System ID 之意。

范例二:将 /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 容量的分区

[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 而不需要跟用户互动!这就是它的最大好处!

上一篇下一篇

猜你喜欢

热点阅读