第7章 Linux磁盘管理—磁盘格式化和挂载

第7章 Linux磁盘管理—磁盘格式化和挂载3 格式化磁盘分区。磁盘分区虽然分好区了,但暂时还不能用,我们还须对每一个分区进行格式化。前面章节中,阿铭介绍过Rocky 8以XFS作为默认的

欢迎大家来到IT世界,在知识的湖畔探索吧!

提醒:本文为合集文章,后续会持续更新!

关注我,每日提升!

7.3 格式化磁盘分区

磁盘分区虽然分好区了,但暂时还不能用,我们还须对每一个分区进行格式化。所谓格式化,其实就是安装文件系统,Windows下的文件系统有FAT32和NTFS。前面章节中,阿铭介绍过Rocky 8以XFS作为默认的文件系统,但我们依然可以给它指定ext3或者ext4格式。

7.3.1 命令mke2fsmkfs.ext2mkfs.ext3mkfs.ext4mkfs.xfs

当用man命令查询前4个命令的帮助文档时,你会发现我们看到的是同一个帮助文档,这说明这4个命令是一样的。下面我们以mke2fs命令为例进行介绍。

mke2fs命令常用的选项如下所示。

  • -b:表示分区时设定每个数据区块占用的空间大小。目前,每个数据块支持1024B、2048B以及4096B。
  • -i:表示设定inode的大小。
  • -N:表示设定inode的数量。有时默认的inode数不够用,所以要自定义inode的数量。
  • -c:表示在格式化前先检测一下磁盘是否有问题。加上这个选项后,运行速度会非常慢。
  • -L:表示预设该分区的标签(label)。
  • -j:表示建立ext3格式的分区。如果使用mkfs.ext3格式,就不用加这个选项了。
  • -t:用来指定文件系统的类型,可以是ext2、ext3 ,也可以是ext4。示例命令如下:
# mke2fs -t ext4 /dev/sda5
mke2fs 1.45.6 (20-Mar-2020)
创建含有 256000 个块(每块 4k)和 64000 个inode的文件系统
文件系统UUID:15043836-eee8-4d62-81f1-6e6fab5b6304
超级块的备份存储于下列块:
        32768, 98304, 163840, 229376

正在分配组表:完成
正在写入inode表:完成
创建日志(4096 个块)完成
写入超级块和文件系统账户统计信息: 已完成

欢迎大家来到IT世界,在知识的湖畔探索吧!

指定文件系统格式为ext4时,命令mke2fs -t ext4 /dev/sdb5等同于mkfs.ext4 /dev/sdb5。然而,mke2fs并不支持把分区格式化成XFS类型,而只能使用mkfs.xfs,示例命令如下:

欢迎大家来到IT世界,在知识的湖畔探索吧!# mke2fs -t xfs /dev/sda6
mke2fs 1.45.6 (20-Mar-2020)

你的mke2fs.conf文件中没有定义类型 xfs 的文件系统。
正在终止...
[root@aminglinux01 ~]# mkfs.xfs  /dev/sda6
meta-data=/dev/sda6              isize=512    agcount=4, agsize=64000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=256000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1566, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

在上例中,你是否注意到“块大小=4096”或者bsize=4096这项指标呢?这里涉及“块”的概念。磁盘在格式化的时候,会预先规定好每一个块的大小,然后再把所有的空间分割成一个一个的小块。存数据的时候,也是一个块一个块地写入。如果你的磁盘里存储的都是特别小的文件,比如说1KB或者2KB,阿铭建议你在格式化磁盘时指定块数值小一点。ext4文件系统的默认块大小为4096B(即4KB)。在格式化时,可以指定块大小为1024B、2048B或者4096B(它们是成倍增加的)。虽然格式化时可以指定块大小超过4096B,但一旦超过4096B,就不能正常挂载。那么,如何指定块大小呢?下面阿铭演示一下具体操作方法,如下所示:

# mke2fs -t ext4 -b 8192 /dev/sda5
警告:块大小 8192 在很多系统中不可用。
mke2fs 1.45.6 (20-Mar-2020)
 /dev/sda5 有一个 ext4 文件系统
        创建于 Wed Oct 26 21:58:28 2022
Proceed anyway? (y,N) y
mke2fs: 8192字节的块对于系统来说太大(最大为 4096)
Proceed anyway? (y,N) y
警告:8192字节的块对于系统来说太大(最大为 4096),但仍然强制进行操作
创建含有 128000 个块(每块 8k)和 64000 个inode的文件系统
文件系统UUID:eac5dc07-01db-4367-9200-7c3457048fe3
超级块的备份存储于下列块:
        65528

正在分配组表: 完成
正在写入inode表: 完成
创建日志(4096 个块)完成
写入超级块和文件系统账户统计信息: 已完成

重新格式化sdb6时,会提示这个分区已经格式化过

欢迎大家来到IT世界,在知识的湖畔探索吧!# mkfs.xfs -b size=8192 /dev/sda6 
mkfs.xfs: /dev/sda6 appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.

加上-f选项即可

# mkfs.xfs -b size=8192 -f /dev/sda6
meta-data=/dev/sda6              isize=512    agcount=4, agsize=32000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=8192   blocks=128000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=8192   ascii-ci=0, ftype=1
log      =internal log           bsize=8192   blocks=1128, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=8192   blocks=0, rtextents=0

通过上面的小试验可以发现,如果指定块大小为8192B,会提示块值设置得太大了,我们可以直接输入y强制格式化。你还可以尝试指定其他数字,但需要是1024的指数倍(1024、2048、4096或者8192)。其中,mkfs.xfs用法有点特殊,你需要注意和mke2fs区分。另外,还可以给分区指定标签,如下所示:

mke2fs -L TEST -t ext4 /dev/sda5
mke2fs 1.45.6 (20-Mar-2020)
 /dev/sda5 有一个 ext4 文件系统
        创建于 Wed Oct 26 22:00:36 2022
Proceed anyway? (y,N) y
创建含有 256000 个块(每块 4k)和 64000 个inode的文件系统
文件系统UUID:7af471e2-da5a-4897-be4e-049c990f2d9c
超级块的备份存储于下列块:
        32768, 98304, 163840, 229376

正在分配组表: 完成
正在写入inode表: 完成
创建日志(4096 个块)完成
写入超级块和文件系统账户统计信息: 已完成

这里我们可以使用-L选项来指定标签。标签会在挂载磁盘时使用,也可以写入配置文件,这个阿铭稍后介绍。

关于格式化的这部分内容,阿铭建议你,除非有需求,否则不需要指定块大小。也就是说,你只需要记住-t和-L这两个选项即可。

7.3.2 命令e2label

该命令用于查看或修改分区的标签,它只支持ext格式的文件系统,而不支持XFS文件系统。这个命令阿铭很少使用,你只要了解一下即可。示例命令如下:

# e2label /dev/sda5
TEST
# e2label /dev/sda5 TEST123
# e2label /dev/sda5
TEST123

7.4 挂载/卸载磁盘

前面我们讲到了磁盘的分区和格式化,那么格式化完成后,如何使用这些磁盘呢?这就涉及挂载磁盘了。格式化后的磁盘其实是一个块设备文件,类型为b。也许你会想,既然这个块文件就是那个分区,那么直接在那个文件中写数据不就可以写入那个分区了吗?这当然不行。

在挂载某个分区前,需要先建立一个挂载点,这个挂载点是以目录的形式出现的。一旦把某个分区挂载到这个挂载点(目录)下,要再往这个目录写数据时,就都会写到该分区中。所以,在挂载该分区前,挂载点(目录)下必须是个空目录。其实目录不为空并不影响所挂载分区的使用,但一旦挂载上了,该目录下以前的东西就看不到了(数据并没有丢失),除非卸载该分区。

7.4.1 命令mount

如果不加任何选项,直接运行mount命令,会显示如下信息:

# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=897764k,nr_inodes=224441,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
none on /sys/kernel/tracing type tracefs (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/rl-root on / type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
mqueue on /dev/mqueue type mqueue (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=43,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=22907)
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=183320k,mode=700)

输出的信息量有点大,大家先不用关心这些内容的含义。使用这个命令,可以查看当前系统已经挂载的所有分区、分区文件系统的类型、挂载点及一些选项等信息。如果想知道某个已挂载分区的文件系统类型,直接用mount命令查看即可。而未挂载的分区,怎么看呢,大家可以使用blkid命令查看,后面会讲到它。下面我们先建立一个空目录,然后在目录里建一个空白文档。示例命令如下:

# mkdir /newdir
# touch /newdir/newfile.txt
# ls /newdir/
newfile.txt

然后把刚才格式化的/dev/sda5挂载到/newdir上,如下所示:

# mount /dev/sda5 /newdir/
# ls /newdir/
lost+found
# df -h |grep -v tmpfs
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/rl-root   17G  6.6G   11G   39% /
/dev/nvme0n1p1      1014M  194M  821M   20% /boot
/dev/sda5            969M  2.5M  900M    1% /newdir

把/dev/sda5挂载到/newdir后,原来在/newdir下的newfile.txt就看不到了,通过命令df -h命令可以查看刚刚挂载的分区。

我们也可以使用LABEL的方式挂载分区,如下所示:

# umount /newdir/
# df -h |grep -v tmpfs
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/rl-root   17G  6.6G   11G   39% /
/dev/nvme0n1p1      1014M  194M  821M   20% /boot
# mount LABEL=TEST123 /newdir
# df -h |grep -v tmpfs
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/rl-root   17G  6.6G   11G   39% /
/dev/nvme0n1p1      1014M  194M  821M   20% /boot
/dev/sda5            969M  2.5M  900M    1% /newdir

本例中用到了umount命令,这个命令是用来卸载磁盘分区的,阿铭稍后介绍。

mount命令常用的选项有-a、-t和-o。在介绍-a选项前,我们需要先了解一下/etc/fstab这个文件。

7.4.2 /etc/fstab配置文件

我们先来查看一下/etc/fstab文件的内容,如下所示:

# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jun  3 19:18:31 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=21f78c94-6652-406f-9f3a-57bd1cdc719f /boot                   xfs     defaults        0 0
/dev/mapper/rl-swap     none                    swap    defaults        0 0

这个文件中显示了系统启动时需要挂载的各个分区,下面阿铭简单描述一下各列的含义。

  • 第1列就是分区的标识,可以写分区的LABEL、分区的UUID(等会阿铭会着重讲一下这个概念),也可以写分区名(比如:/dev/sda1)。
  • 第2列是挂载点,即要挂载到的目录名。
  • 第3列是分区的格式。
  • 第4列是mount的一些挂载参数。一般情况下,直接写defaults即可。
  • 第5列的数字表示是否被dump备份。1表示备份,0表示不备份。
  • 第6列的数字表示开机时是否自检磁盘。1和2都表示检测,0表示不检测。自检时,1比2优先级高,所以先检测1,再检测2。如果有多个分区需要开机检测,就都设置成2,1检测完后会同时检测2。在CentOS 7/Rocky 8系统里,所有分区中该列的值都是0。

下面阿铭着重介绍第4列的常用选项。

  • async/sync:async表示与磁盘和内存不同步。系统每隔一段时间就会把内存数据写入磁盘中,而sync则会时时同步内存和磁盘中的数据。
  • auto/noauto:表示开机自动挂载/不自动挂载。
  • default:表示按照大多数永久文件系统的默认值设置挂载定义,它包含了rw、suid、dev、 exec、auto、nouser和async。
  • ro:表示按只读权限挂载。
  • rw:表示按可读可写权限挂载。
  • exec/noexec:表示允许/不允许可执行文件执行,但千万不要把根分区挂载为noexec,否则将无法使用系统,甚至连mount命令都无法使用。
  • user/nouser:表示允许/不允许root外的其他用户挂载分区。为了安全,请用nouser。
  • suid/nosuid:表示允许/不允许分区有suid属性,一般设置nosuid。
  • usrquota:表示启动用户的磁盘配额模式。磁盘配额会针对用户限定他们使用的磁盘额度。
  • grquota:表示启动群组的磁盘配额模式。

学完了/etc/fstab,我们就可以自己修改这个文件,增加一行来挂载新增分区。例如,阿铭增加了这样一行:

LABEL=TEST123 /newdir      ext4   defaults        0 0

然后卸载之前已经挂载的/dev/sda5,如下所示:

# umount /dev/sda5
# df -h |grep -v tmpfs
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/rl-root   17G  6.6G   11G   39% /
/dev/nvme0n1p1      1014M  194M  821M   20% /boot

使用命令df -h查看,会发现已经成功卸载/dev/sdb5。下面执行命令mount -a:

# mount -a
# df -h |grep -v tmpfs
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/rl-root   17G  6.6G   11G   39% /
/dev/nvme0n1p1      1014M  194M  821M   20% /boot
/dev/sda5            969M  2.5M  900M    1% /newdir

使用命令df -h查看,会发现多出一个文件/dev/sdb5挂载到了/newfir下,这就是mount -a命令执行的结果。这个-a选项会把/etc/fstab中出现的所有磁盘分区挂载上。除了-a选项外,还有两个常用的选项。

  • -t选项:用来指定挂载的分区类型,默认不指定,会自动识别。
  • -o选项:用来指定挂载的分区有哪些特性,即上面/etc/fstab配置文件中第4列的那些。这个选项阿铭经常使用,示例命令如下:
# mkdir /newdir/dir1
# mount -o remount,ro,sync /dev/sda5 /newdir
# mkdir /newdir/dir2
mkdir: 无法创建目录"/newdir/dir2": 只读文件系统

由于-o选项指定了ro参数,所以该分区只读了。通过mount命令可以看到,/dev/sda5也有ro参数,示例命令如下:

# mount |grep sda5
/dev/sda5 on /newdir type ext4 (ro,relatime,sync)

下面阿铭重新挂载,让它恢复读写,如下所示:

# mount -o remount  /newdir  #这里可以省略掉磁盘分区,只写挂载点
# mkdir /newdir/dir2
# ls /newdir/
dir1 dir2  lost+found

7.4.3 命令blkid

阿铭在日常的运维工作中遇到过这样的情况,一台服务器上新装了两块磁盘:磁盘a(在服务器上显示为sdc)和磁盘b(在服务器上显示为sdd)。有一次阿铭把这两块磁盘都拔掉了,之后再重新插上,重启机器,结果磁盘编号被调换了,即磁盘a显示为sdd,磁盘b显示为sdc(这是因为阿铭把磁盘插错了插槽)。

我们知道挂载磁盘是通过/dev/sda1这样的分区名字来挂载的,如果该分区先前已加入到/etc/fstab中,系统启动后则会挂载错分区。那么,怎样避免这样的情况发生呢?这就用到了UUID。我们可以通过blkid命令获取各分区的UUID,如下所示:

# blkid
/dev/sda5: LABEL="TEST123" UUID="7af471e2-da5a-4897-be4e-049c990f2d9c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3d19a658-05"
/dev/nvme0n1p1: UUID="21f78c94-6652-406f-9f3a-57bd1cdc719f" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="91dd1aed-01"
/dev/nvme0n1p2: UUID="wFTzNH-yNbZ-hP00-mRUH-sILl-nbcq-oAWzt3" TYPE="LVM2_member" PARTUUID="91dd1aed-02"
/dev/sr0: BLOCK_SIZE="2048" UUID="2021-11-14-09-30-59-00" LABEL="Rocky-8-5-x86_64-dvd" TYPE="iso9660" PTUUID="6b8b4567" PTTYPE="dos"
/dev/mapper/rl-root: UUID="cbb1e131-d2a3-4b62-a1fe-b1172e295101" BLOCK_SIZE="512" TYPE="xfs"
/dev/mapper/rl-swap: UUID="c05b4dde-37bf-48d9-b9ee-a51f1c15d027" TYPE="swap"
/dev/sda6: UUID="aa787ecd-eb79-4b52-92fa-e4d594fb3ff8" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="3d19a658-06"
/dev/nvme0n1: PTUUID="91dd1aed" PTTYPE="dos"

这样可以获得全部磁盘分区的UUID。如果格式化时指定了LABEL,则该命令也会显示LABEL值,文件系统的类型也会显示。当然,这个命令后面也可以指定查询哪个分区,示例命令如下:

# blkid /dev/sda5
/dev/sda5: LABEL="TEST123" UUID="7af471e2-da5a-4897-be4e-049c990f2d9c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3d19a658-05"

获得UUID后,我们如何使用它呢?用法如下所示:

# umount /newdir
# mount UUID="7af471e2-da5a-4897-be4e-049c990f2d9c" /newdir

UUID也是支持写入到/etc/fstab中的,示例命令如下:

# tail -1 /etc/fstab
UUID="7af471e2-da5a-4897-be4e-049c990f2d9c" /newdir      ext4   defaults        0 0

如果想让某个分区在开机后自动挂载,有两个办法可以实现:一是在/etc/fstab中添加一行,如上例中那行;二是把挂载命令写到/etc/rc.d/rc.local文件中去,系统启动后会执行这个文件中的命令。只要你把想要开机启动的命令统统写入到这个文件中(直接放到最后)即可。阿铭经常把挂载的命令放到该文件的最后一行,示例命令如下:

# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
mount UUID="7af471e2-da5a-4897-be4e-049c990f2d9c" /newdir

有的朋友可能会遇到这样的情况,把命令写入/etc/rc.d/rc.local文件里,却并没有开机执行,这很有可能是因为系统并没有找到那个命令。所以,为了避免此类问题,阿铭建议你,以后写入到该文件的命令,要使用绝对路径,比如本例中的mount应该写成/usr/bin/mount。更改完/etc/rc.d/rc.local文件后,还需要一步操作:

# chmod a+x /etc/rc.d/rc.local

这是因为,在Rocky 8系统,该文件默认没有执行权限。以上两种方法任选其一,阿铭介绍第2种方法其实也是告诉你:如何让一些操作行为随系统启动而自动执行。另外,阿铭建议你在挂载磁盘分区时,尽量使用UUID或者LABEL这两种方法。

7.4.4 命令umount

在上面的小试验中,阿铭多次用到umount命令。这个命令后面可以跟挂载点,也可以跟分区名(如/dev/sda1),但是不可以跟LABEL和UUID。示例命令如下:

# umount /dev/sda5
# mount UUID="7af471e2-da5a-4897-be4e-049c990f2d9c" /newdir
# umount /newdir
# mount UUID="7af471e2-da5a-4897-be4e-049c990f2d9c" /newdir

umount命令的-l选项非常有用。有时候你会遇到不能卸载的情况,如下所示:

# umount /newdir
umount: /newdir:目标忙。
 (有些情况下通过 lsof(8) 或 fuser(1) 可以找到有关使用该设备的进程的有用信息)

不能卸载是因为当前目录还在卸载的分区上。解决这个问题的办法有两种:一是进入到其他目录;二是使用umount命令的-l选项,示例命令如下:

# umount -l /newdir
# df -h |grep -v tmpfs
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/rl-root   17G  6.6G   11G   39% /
/dev/nvme0n1p1      1014M  194M  821M   20% /boot

7.5 建立一个swap文件增加虚拟内存

安装系统时我们就接触了swap命令,它类似于Windows的虚拟内存,分区时一般指定虚拟内存的大小为实际内存的2倍。如果你的实际内存超过4GB,那么划分8GB给虚拟内存就足够日常交换了。如果真遇到了虚拟内存不够用的情况,就必须增加一个虚拟磁盘,因为我们不可能重新给磁盘分区。增加虚拟磁盘的基本思路是:建立swapfile→格式化为swap格式→启用该虚拟磁盘。

首先,建立swapfile,如下所示:

# dd if=/dev/zero of=/tmp/newdisk bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,6.36177 秒,169 MB/秒

dd命令阿铭经常用到,所以请你也要掌握它的使用方法:用if指定源(一般是写/dev/zero,它是UNIX系统特有的一个文件,它可以源源不断地提供“0”),of指定目标文件,bs定义块的大小,count定义块的数量。bs和count这两个参数决定了目标文件的大小,即目标文件大小=bs*count。上面的示例中,阿铭用dd命令建立一个大小为1.1GB的文件,下面将它格式化为swap格式,命令如下:

# mkswap -f /tmp/newdisk
mkswap: /tmp/newdisk:不安全的权限 0644,建议使用 0600。
正在设置交换空间版本 1,大小 = 1024 MiB (1073737728  个字节)
无标签,UUID=df739399-cb11-4a92-b8db-9e94e257b815

文件格式化后,就可以挂载使用了,如下所示:

# free -m
 total        used        free      shared 
buff/cache   available
Mem: 1806         235         293           8        1276        1413
Swap: 4095           0        4095
# swapon /tmp/newdisk

swapon: /tmp/newdisk:不安全的权限 0644,建议使用 0600。 //虽然提示不安全,但实际已经挂载上

# free -m
 total        used        free      shared 
buff/cache   available
Mem: 1806         236         293           8        1276        1412
Swap: 5119           0        5119

前后对比一下swap分区,我们发现多了1024MB的空间。其中,free命令用来查看内存的使用情况,-m选项表示以MB为单位显示,阿铭还会在后续章节详细介绍该命令。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/42555.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信