Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

Linux 磁盘与文件系统管理 – 操作

df 命令

$ df [-ahikHTm] [目录或文件名]
选项与参数:
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :连同该 partition 的 filesystem 名称 (例如 xfs)也列出
-i :不用磁盘容量,而以 inode 的数量来显示


Linux 磁盘与文件系统管理 - 操作

文件系统的操作

df 命令

$ df [-ahikHTm] [目录或文件名]
选项与参数:
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :连同该 partition 的 filesystem 名称 (例如 xfs)也列出
-i :不用磁盘容量,而以 inode 的数量来显示

$ tune2fs [-l] [-L Label] [-U uuid] 装置文件名
选项与参数:
-l :类似 dumpe2fs -h 的功能。将 superblock 内的数据读出来
-L :修改 LABEL name
-U :修改 UUID 


du 命令

$ du [-ahskm] 文件或目录名称
选项与参数:
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;


ln 实体链接与符号链接

$ ln [-sf] 来源文件 目标文件
选项与参数:
-s :如果不加任何参数就进行连结,那就是 hard link,至于 -s 就是 symbol
-f :如果 目标文件 存在时,就主动的将目标文件直接移除后再建立!


硬链接(链接) hard link

image-20200112132233707

其实就是增加一个文件名链接到某 inode,除了文件名其他信息都是一样的。上图的意思就是,对于目录1和目录2,对应文件的 inode 是相同的。

实体链接最大的好处就是安全。如同上图中, 如果你将任何一个文件删除,其实 inode 与 block 都还是存在的! 此时你可以透过另一个文件来读取到正确的文件数据喔!此外,不论你使用哪个文件来编辑,最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改。

hard link 只是在某个目录下的 block 多写入一个关连数据,既不会增加 inode 也不会耗用 block 数量。同时我们还需要注意,硬链接是有限制的:

  • 不能跨文件系统
  • 不能 link 目录(当对文件夹建立硬链接时,需要对他下面的所有文件也进行硬链接,这样发生变动的时候会非常复杂)

一般使用方式如下:

ln /etc/crontab .


软链接(符号链接)Symbolic Link

image-20200112134010535

建立一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的。由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,软链接的文件会开不了。(相当于建立一个快捷方式)

Symbolic link 所建立的文件为一个独立的新的文件,所以会占用掉 inode 与 block。使用方法如下:

ln -s /etc/crontab crontab2


一般来说用 hard link 比较安全,但是 hard link 在用途上面是比较受限的。

同时还有个很有意思的现象:

$ ll a.txt 
lrwxrwxrwx 1 root root 11 1月  12 13:37 a.txt -> /root/a.txt


你注意到了,上面那个链接的大小为 12Bytes 这时因为 /root/a.txt 的总长度为12个字符。(而且软链接和实际的连结数都不会变)

目录的链接数

当你创建一个目录时候,一定会包括以下三个东西:

  • /tmp/testing
  • /tmp/testing/.
  • /tmp/testing/..

其中 /tmp/testing/tmp/testing/. 代表的是自身,所以新建一个目录的链接数都是 2,对于 /tmp/testing/.. 代表知道上层目录,所以上层目录 /tmp 都会增加一。

分区

观察磁盘分区状态

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

lsblk = list block device

[root@study ~]# lsblk [-dfimpt] [device]
选项与参数:
-d:仅列出磁盘本身,并不会列出该磁盘的分区数据
-f:同时列出该磁盘内的文件系统名称(可以显示 UUID )
-i:使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m:同时输出该设备在 /dev 底下的权限数据 (rwx 的数据)
-p:列出该设备的完整文件名!而不是仅列出最后的名字而已。
-t:列出该磁盘设备的详细数据,包括磁盘队列机制、预读写的数据量大小等


结果如下:(其中 MAJ:MIN 分别是主要:次要设备代码。其实核心认识的设备都是透过这两个代码来熟悉)

image-20200112140711001

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

常用的使用方法如下:

屏幕快照 2020-01-12 下午2.11.55

gdisk/fdisk 磁盘分区:

使用时需要注意:

  • MBR 分区表请使用 fdisk 分区, GPT 分区使用 gdisk 分区。否则会有很严重的后果(如果不知道可以使用 parted 进行查看)
  • 离开时按下 q,那么所有的动作都不会生效。相反的, 按下 w 就是动作生效的意思。所以,你可以随便玩 gdisk ,只要离开时按下的是 q 即可。
  • 只有 root 才能执行。
  • 请注意,使用的设备文件名请不要加上数字,因为 partition 是针对整个磁盘设备而不是某个 partition。所以执行 gdisk /dev/vda1 就会发生错误,要使用 gdisk /dev/vda 才对。

新建分区

$ fdisk /dev/vda

Command (m for help): p

Disk /dev/vda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00068c54

   Device Boot      Start         End      Blocks   Id  System

# 一开始磁盘为空

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-6527, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-6527, default 6527): +10G
# 会自动帮你计算扇区号码


Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (1307-6527, default 1307): 
Using default value 1307
Last cylinder, +cylinders or +size{K,M,G} (1307-6527, default 6527): +20G

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (3919-6527, default 3919): 
Using default value 3919
Last cylinder, +cylinders or +size{K,M,G} (3919-6527, default 6527): +25G
Value out of range. # 越界则会报错
Last cylinder, +cylinders or +size{K,M,G} (3919-6527, default 6527): +18G

Command (m for help): p

Disk /dev/vda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00068c54

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1               1        1306    10490413+  83  Linux
/dev/vda2            1307        3918    20980890   83  Linux
/dev/vda3            3919        6269    18884407+  83  Linux

# 可以观察到分区完成

Command (m for help): w

# 使用 w 保存结果


然后如果我们想要更新分区表,我们有两种方法

  • 重启系统
  • 利用 partprobe 指令

删除分区

直接再 gdisk 中使用 d,按照指令执行即可。

格式化

直接利用 mkfs 系列工具,一般来说输入 mkfs 按 tab 可以得到操作系统所支持的文件系统格式化功能:

$ mkfs
mkfs         mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs


以 xfs 为例,直接后面加上分区路径即可(当然还有些选项需要具体分析):

$ mkfs.xfs /dev/vda1


文件系统检验

无论是 xfs_repair 或 fsck.ext4,这都是用来检查与修正文件系统错误的指令。注意:通常只有身为 root 且你的文件系统有问题的时候才使用这个指令,否则在正常状况下使用此一指令, 可能会造成对系统的危害。

xfs_repair 处理 XFS 文件系统

$ xfs_repair [-fnd] 设备名称
选项与参数:
-f :后面的设备其实是个文件而不是实体设备 
-n :单纯检查并不修改文件系统的任何数据 (检查而已)
-d :通常用在单人维护模式底下,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用


注意,修复的时候需要卸载文件系统。然后我们知道根目录是无法删除的,如果根目录有问题的话我们需要进入单人维护或救援模式,然后利用 -d 这个选项来处理。

PS:Linux下的启动方式常用的到的有单用户方式、普通多用户方式、完全多用户方式和XWin方式。单用户方式下,系统并没有完全运行进来,只是部分程序运行,这时也不能进行远程登录到Linux系统。进入单用户方式进行系统维护由是ROOT用户来进行完成,而且是由ROOT直接的进入,没有密码检验。这时的ROOT用户对系统有完全的操作权限,可以修复系统的同时,也能随时的对系统进行破坏。

fsck.ext4 处理 EXT4 文件系统

$ 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


挂载和卸载

挂载点是目录, 而这个目录是进入文件系统的入口。注意,挂载文件系统时候需要满足:

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
  • 单一目录不应该重复挂载多个文件系统
  • 要作为挂载点的目录,理论上应该都是空目录才是(如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时的消失。等到被卸除之后,原本的内容就会再次出现)

常用使用方法如下(codepage 和 iocharset 都是语系数据):

mount -o codepage=950,iocharset=utf8 UUID="35BC-6D6B" /data/usb


mount 的完整格式如下:

$ mount -a
$ mount [-l]
$ mount [-t 文件系统] LABEL='' 挂载点
$ mount [-t 文件系统] UUID='' 挂载点 # 建议用这种方式喔!
$ mount [-t 文件系统] 设备文件名 挂载点
选项与参数:
-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) 的内存机制
    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 ?
    remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!
    # 其中默认值为:rw, suid, dev, exec, auto, nouser, and async 


一般来说 -t 选项不需要写(CentOS 会自动识别文件系统类型)。相反地,卸载文件系统使用 umount,卸载时候设备不能处于忙状态:

umount [-fn] 设备
选项与参数:
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-l :立刻卸除文件系统,比 -f 还强!
-n :不更新 /etc/mtab 情况下卸除。


开机挂载

直接修改 /etc/fstab 文件:

image-20200112175113876

可以看到,上面一共有六行,分别是:

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


第一个可以有下面三种写法:

  • 文件系统或磁盘的装置文件名,如 /dev/vda2 等
  • 文件系统的 UUID 名称,如 UUID=xxx
  • 文件系统的 LABEL 名称,例如 LABEL=xxx

第二个是挂载点,第三个是文件系统的格式(这里需要手动填写),第四个是文件系统参数,就是 mount -o 后面所接的参数,第五个能否被 dump 备份指令作用,一般填0就 OK 了。

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

/etc/fstab 是开机时的配置文件,不过,实际文件系统的挂载是记录到 /etc/mtab/proc/mounts 这两个文件当中的。每次我们在更动文件系统的挂载时,也会同时更动这两个文件。

但进入单人维护模式时候,/ 可是只读的状态,当然你就无法修改 /etc/fstab ,也无法更新 /etc/mtab,但不过我们可以使用以下命令:

mount -n -o remount,rw /


挂载镜像文件

mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd


修改参数

mknod 生成设备文件

Linux 核心 2.6 版以后,硬件文件名已经都可以被系统自动的实时产生了,我们根本不需要手动建立设备文件。但是当你改变根目录(chroot)的时候,可能需要手动处理。

$ mknod 设备文件名 [bcp] [Major] [Minor]
选项与参数:
设备种类:
  b :设定设备名称成为一个周边储存设备文件,例如磁盘等;
  c :设定设备名称成为一个周边输入设备文件,例如鼠标/键盘等;
  p :设定设备名称成为一个 FIFO 文件;
Major :主要设备代码;
Minor :次要设备代码;


常见设备代码的如下:

磁盘文件名 Major Minor
/dev/sda 8 0-15
/dev/sdb 8 16-31
/dev/loop0 7 0

PS:loop 设备的作用就是不把镜像文件刻录就可以挂载使用。

xfs_admin

xfs_admin 的作用是修改 XFS 文件系统的 UUID 与 Label name:

$ xfs_admin [-lu] [-L label] [-U uuid] 设备文件名
选项与参数:
-l :列出这个设备的 label name
-u :列出这个设备的 UUID
-L :设定这个设备的 Label name -U :设定这个设备的 UUID 


tune2fs

tune2fs 的作用是修改 ext4 的 label name 与 UUID

$ tune2fs [-l] [-L Label] [-U uuid] 装置文件名
选项与参数:
-l :类似 dumpe2fs -h 的功能。将 superblock 内的数据读出来
-L :修改 LABEL name
-U :修改 UUID 


设置交换区

一般有两种方法:设定一个交换分区,或者建立一个虚拟内存的文件。

交换分区

  1. 分区:先使用 gdisk 在你的磁盘中分区出一个分区槽给系统作为 swap 。
  2. 格式化:利用 mkswap 装置文件名 就能够格式化该分区槽成为 swap 格式。
  3. 使用:最后将该 swap 装置启动,方法为:swapon 装置文件名
  4. 观察:最终透过 freeswapon -s 这个指令来观察一下内存的用量吧!

虚拟内存文件

  1. 创建文件:直接利用 dd 命令创建文件,dd if=/dev/zero of=/tmp/swap bs=1M count=128
  2. 转换格式:利用 mkswap 文件 讲文件转换为 swap 格式。
  3. 使用:swapon swap文件
  4. 关闭:使用 swapoff 关掉 swap file
Share

You may also like...

发表评论