GeekHub

记一次Linux系统目录优化(bind目录)

先说一下背景,目前用的主机是一台8代的厚版Intel NUC,装了一块M.2的SSD和一块SATA的机械盘,系统是Deepin 20,当时安装系统时考虑将SSD作为系统盘,机械盘作为数据盘,Deepin安装时有一个选项可以傻瓜分配空间(那个选项忘记叫啥了,其实是个坑,后面慢慢说),一键将SSD分区为系统盘和交换空间,机械盘作为数据盘。

但实际使用起来会发现系统经常会在打开网页、启动微信时出现卡顿,并且在机械盘有写入操作时尤其明显,经过排查发现问题的根源在于Deepin安装过程中的傻瓜分区的选项,虽然给机械盘直接分了一个ext4分区,并且挂载到了/data下,但是通过查看/etc/fstab后发现这样几行:

也就是说这个傻瓜分区的选项是通过mount –bind命令将/data中的home、opt、var、root直接连接到了根目录下,造成加载程序卡顿的根本原因就是/var目录实际上是在机械盘上,导致软件的缓存和系统日志对机械盘进行了频繁的读写操作。

这里分享一下我的解决方案(可作为热解决方案,无需重启)。

第一步,在根目录下创建一个临时文件夹(实际上是在SSD上创建了新文件夹),这里取名叫/var_tmp:

sudo mkdir /var_tmp

然后将/var内的所有文件(实际上是机械盘上的/data/var上的文件)通过rsync同步到/var_tmp下:

sudo rsync -avP /var/* /var_tmp

这一步结束后,/var_tmp内的内容实际上已经和/var(也就是机械盘上的/data/var)的内容完全一致了。

这里我尝试umount掉/var后再将/var_tmp bind到/var上,然而/var无法直接umount,即便加上force参数

于是曲线救国,将/var_tmp这个目录直接bind到了/data/var下:

mount /var_tmp /data/var --bind

这一步相当于进行了两次映射:/var_tmp → /data/var → /var

此时对/var做的所有读写操作,实际上是在/var_tmp中进行的,也就是回到了SSD上,经测试之前的卡顿问题不再出现了。

但上述步骤均未做持久化,重启后会恢复原状,若想重启后保留改配置,有两个方案:

第一个是直接在fstab中添加/var_tmp到/data/var的映射(丑陋的解决方案,但是简单,而且易于恢复原状):

第二个是使用一个Linux的Live启动U盘(建议用Ubuntu的)启动电脑,在Live系统中将SSD中etc/fstab里的映射/data/var到/var的那行删除,并将SSD上的var_tmp内的内容mv到SSD上的var(注意前面我说的是SSD上的,而不是根目录/里的,千万不要搞错了)

至此问题解决,这里简单讲一下mount –bind和直接mount的区别,最大的区别是mount –bind可以将一个目录映射到另外一个目录,而直接mount(硬链接)只能将块设备挂载到目标目录,(mount –bind有点像软链接,但是目标不是软连接文件而是一个目录),并且在mount –bind后,目标目录中原本存在的内容都看不到了,只能看到源目录里的内容,对目标目录做的所有操作其实都是在源目录中做的,这里我就不细说了,这篇帖子讲的很清楚:https://blog.csdn.net/wang11876/article/details/131204250

发表回复

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