«

»

Apr 18 2019

在 Linux 桌面系统上进行硬盘分区的一些想法

先说结论:

本文的最终目的,是将 Linux 原本的几个独立的目录,挂载到同一个分区下以共享磁盘空间(比如将 /var/home 挂载到同一个分区下),核心思想是 Bind mount operation

觉得没悬念的就可以不用继续往下读了,省得文章写得像《走近科学》。

前言

Linux 命令行下是没有回收站概念的,这并不适合桌面用户,所以要尽可能的发挥回收站功能。而回收站概念又与卷密不可分。

如何分区,分多大,分给谁,怎么分,这些都是问题。

(注:本文有点把 分区 和 卷 的混到一起了,别太在意)

回收站与分区

回收站

一般的 Linux 系统用户都是 Server 用户,对于 rm 命令的杀伤性都心知肚明,但仍有很多人犯错。所以,更应该提供桌面用户更高的容错率,这也就是 回收站 的存在意义。

(注,我不清楚 MacOS 是怎样的,我也不关心)

Linux 与 Windows 有一大不同点就是分区。

Windows 依靠盘符,而盘符则 完全没什么特别意义 ,用户可以随便存储,记得住就行。结果是越来越多的不聪明的用户不知道如何管理文件。文件到处存放,那就到处找不着。 所以微软急着做了一个库。盘符系统有个好处就是,用户可以对非系统文件夹随便操作,删除行为(指移动到回收站)的实质是移动到盘符根目录下的 $RECYCLE.BIN

Linux 的分区完全不一样。Linux 逻辑上只有一个根节点 / ,所有分区均可 载到上面。非 root 用户对除自己 Home 目录下的任何文件或目录都没啥操作权利。回收站的本质是 「删除→移动」,如果用户没有对回收站目录的访问权限,这事情就有点闹笑话了。

但说到底为什么要分区呢?

分区

传统的必须分区的理由有很多,比如:

  • 主板不能引导存在于过大容量卷的操作系统
  • 操作系统不能识别过大的卷,或文件系统不支持过大的卷
  • 碎片影响性能
  • 逻辑损坏丢失数据
  • 多操作系统
  • 单独的临时分区或日志分区防止撑爆整个磁盘
  • 簇大小优化与节省硬盘空间
  • 硬链接攻击

上面这些理由,估计知道的人不多,毕竟都很过时,拿 1995 年 Win95 的分区思想来衡量 2019 年的软硬件相当不合理。虽说现今连 3T 以上硬盘都已经平民化了,但还是有很多人是强制自己使用 BIOS 而非 UEFI ,3T 硬盘是靠特殊分区工具划分成 2T + 1T 使用,不过这种人就不要放在讨论范围内了。

工作中单硬盘用机,如果是 Win 系统的话我一般都会分三个区,系统 C + 应用 D + 数据 E。C 只装操作系统,D 只装应用,E 只存放数据。这样拍屁股走人时直接把 D 和 E 的分区删掉合并,瞬间删除两个分区所有文件,文件粉碎都不用做,光是猜你之前把文件存在哪就要废一番功夫。

说白了,除了 多操作系统 和 硬链接攻击,当今分区的唯一目的,就只剩下方便管理了。像 Win 都打算使用 概念来降低分区的概念了,这年头一个分区就行,市面上还有很多几乎实现了多块硬盘一个分区(这里指的可不是 Raid)。只不过,当操作系统出现问题的时候,你的唯一修复手段就是重装系统,也就是说要把整个分区都格式化掉(那些在屎上又拉一层屎的请按 Ctrl + W)。

如果有一个的分区,专门负责操作系统,有另一个分区,专门负责存放用户文件,那就再好不过了。很可惜,Linux 目前无法直接简单的实现。

一般用户的分区与开发者的分区

Linux 的分区完全不一样。Linux 逻辑上只有一个根节点 / ,所有分区均可 载到上面。如果用户文件都单纯的储存于 /home 目录下,那是最简单的了,只要给 /home 目录单独分区就可以了,以后就算重装系统,只要还把这个分区挂载到 /home ,星星就还是那个星星,月亮就还是那个月亮。

目前市面上多数有 Linux 桌面端的软件,均以 /home$USER 作为基础目录来保存数据,像 Steam 等软件,均是把库放在这里(Steam for Linux 没有同分区下只能有一个库的限制),这样用户和应用均拥有所有操作权限。

说到这里,如果你只是个一般用户的话,给 /home 目录单独分区,Case Close。

但对于开发者而言就不一样了。

DSC_2349

“I keep telling everybody they should move on. Some do, but not us.”

与一般用户不同的一点,开发者需要更多的参与基于 Linux 而存在的项目中,Apache、MySQL、Docker,这些既不是为一般用户存在的软件,也不是为桌面环境而存在的软件,所以理所当然的也和 /home 没什么太大的瓜葛。当然,也不需要考虑回收站。

Apache 的 HTML 目录默认是 /var/www/html ,MySQL 和 Docker 把 /var/lib 当做存储空间。Linux 还有 /var/cache 这个用来做缓存的目录。如果把 /var 单独做一个分区,却又把像 /var/log 这种根本用不着为安全备份而另起一个分区(如果要是开发能力有限经常因日志写爆导致系统瘫痪的,好好回家种地,别在这研究这些跟娶媳妇没啥关系的事情)。

对于一个数据分区来讲,分多大比较容易考虑。但如果是两个数据分区,一个挂载 /home 一个挂载 /var ,就有分配比例的问题了。到底谁多谁少,在没经历过长期稳定使用之前,谁也没有个把握。(难道还能到知乎上去提问不成?想都想得出来能得到什么答案了)

如果能只分两个区,一个分区负责 /,另一个分区则负责 /home /var/lib /var/cache 这些我想指定的分区就好了。

DSC_2350

DSC_2351

This is Linux, do whatever you feel like to do.

开始分区

注,不论你打算接下来如何操作,如果目的主机上有重要文件,一定要先使用外置存储备份,并用其他主机确认外置存储备份已经成功后,再进行以下操作。

基本安装

首先按照基本思路安装系统。Linux 将作为唯一系统,所以不再保留 Windows 和厂家附带的任何第三方分区。

硬件配置是 512G 的 SSD ,16G 的内存,所以这里分配如下:

DSC_1610

  • 536MB 的 EFI 引导区(如果选默认分区,就是分这么个大小,不过实际使用看似只有 33M)
  • 100GB 的 /,用于一般 Linux 包的安装
  • /mystorage 我们的目标。名字其实无所谓,但是尽量不要使用 storage 或者比较正式的单词,防止和系统自带的搞混了。
  • 16G + 2G 的 SWAP 空间。16G 是为了接下来的休眠功能,而不是网上说的那些破玩意。2G 是为了休眠预留的,稍微大一点为了安全保险,反正 2G 空间也不差。
  • 10% 的 SSD 预留空间

手动输入数值,系统会进行一些微调,有点偏差,但是差不了多少。

小技巧:对于预留空间,可以先在盘尾部创建一个 10% 的不格式化的分区,等所有区都分配好了,删除这个空分区。

安装完成后,不要重启

(如果重启了,就得重新用 Live CD 引导继续的操作。传闻单用户下也可以进行,但是我遇到过目录无法卸载的问题,没有成功)

分配

我们接下来,要将指定的目录,挂载到 /mystorage 分区上,让他们共同使用者约 300G 的空间。

我们接下来,将把 /var/www//home/var/cache/apt/ 几个目录挂载到 /mystorage 分区上。

打开命令行,执行 sudo fdisk -l ,找到 //mystorage 的设备名

DSC_1612

/dev/nvme0n1p2/dev/nvme0n1p5

创建临时目录(/tmp/thisislinux/),挂载这两个分区。

DSC_1615

进入 /dev/nvme0n1p5 ,建立目录 homewwwapt_cachestorage 四个目录。

/home

/dev/nvme0n1p1 中的 /home 下的所有文件复制到 /dev/nvme0n1p5 中的 home 下。

sudo rsync -a --info=progress2 /tmp/thisislinux/root/home/* /tmp/thisislinux/mystorage/home/

/var/cache/apt/

不用复制,因为这些 cache 文件在 update 时会重建。

www

因为 /var/www/html 是 HTTP 引擎用户权限,而 www 是 root 权限,所以这里我们折腾 www 而不是 html。

因为新系统上还没有安装任何 HTTP 引擎,所以要手动建立目录。

sudo mkidr /tmp/thisislinux/root/var/www

可以将 /tmp/thisislinux/root/home/tmp/thisislinux/root/var/cache/apt/ 删除了。如果不放心,先备份。

Bind mount operation

接下来是重点,我们要使用 Bind mount operation ,将 /dev/nvme0n1p5 下的 homewwwapt_cache 绑定到接下来将要启动的系统对应的目录下。

编辑 /tmp/thisislinux/root/etc/fstab 文件

DSC_1618

增加三行

DSC_1619

好了,现在可以重启了。

重启

如果启动没问题的话,打开命令行,执行 df -ah

DSC_1623

可以看到 /mystoragehomewwwapt_cache 均是 300G 空间。

为什么还有个 storage 目录 ,Docker 和 MySQL 哪里去了?

像 MySQL 这种安装过程中会创建 /var/lib/mysql 并设定权限的应用,如果提前把目录准备好,可能会导致安装错误,一般情况下,不要冒这种险,因为冒险很浪费时间,而且几乎没有收获。

MySQL 和 Docker 在安装之后均可以再指定其存储路径,这也是为什么 /mystorage 下还有准备了个 storage 的原因,你可以将这些应用的数据都存储到这里。虽然也可以直接存到 /mystorage 下,不过还是做得干净一点比较好。

缺陷

没有使用到 LVM 是非常大的一个遗憾。如果能使用 LVM 的话,按照这种分区方法,在使用一段时间之后,还可以调整 //mystorage 的大小。

主要是我虽然很久之前就知道 LVM 是怎么回事,还做过一段时间的相关开发,然而岁数大了已经忘得一干二净,所以感觉很多名词和逻辑实在不适合一般的用户。

LVM 这玩意之所以在名义上难让人接受,可能还是因为一般用户几乎不会经常性的对硬盘进行 调整 操作,即使有,首先想到的也是分区软件。能接触到 LVM 用户的估计只有接触存储设备的,而这些玩意也都有其自己的傻瓜式管理系统(我就做过),用户反而没什么权利去深入了解 LVM 的各种概念,更别说自己敲代码了。

要是咯嘣一下分区整块硬盘挂个 / 可能比较容易接受,但把 PV VG LV 的名词加上来再搞 bind mount,估计就算搞出来了也搞不明白是怎么回事。

文章目的

这篇文章写起来的时候思路很好玩,但是知道了原理和实现方式之后,开头那一段就总感觉像《走近科学》。我要是再添加几个因为存储空间问题导致用户损失的案例,严肃一点,会不会更像《今日说法》?撒贝宁的那个严肃脸和机关枪般的口吻我也是会模仿的。

这篇文章其实是面向对刚接触 Linux 并有兴趣使用 Linux 桌面版的朋友的,所以并不是什么高深的大学问,相信经常捣鼓 Linux 服务器的人读起来都没有压力。我更希望是只要懂一点 Linux 的朋友就能看懂。而且这些风险操作也都可以在虚拟机里瞎搞,只不过由于是重点关注硬盘使用空间的,所以在虚拟机里没有实现价值。

文章的目的还是希望读者能对这些概念有一个初步的了解,而不是上来就复制粘贴。

另外说一个非常非常可怕的事实:这种麻烦的需求其实靠 Linux 的软链接就可以做,根本不需要这么麻烦

参考资料

https://serverfault.com/questions/737333/home-opt-tmp-usr-var-on-a-single-partition-of-another-hard-drive-debian-8
https://serverfault.com/questions/429937/how-to-move-var-to-another-existing-partition

相关文章列表

Linux 桌面系统相关文章列表

10 comments

Skip to comment form

  1. 夏目贵志

    linux用的少,不过学习了

    1. 石樱灯笼

      主要是 Win10 实在是无法接受,只能把日常生活和工作逐步往 Linux 上面搬,然而 Linux 离真正适合一般用户使用还差的太远了。

  2. Sam.Z

    唯一在用的就是黑群辉,一个硬盘一个目录,主要用于存储文件,执行文件甚少,喜欢用mount –bind来规范不同盘之间的目录,文章所提的分区暂时用不到,先学习了,谢谢~

  3. FROYO

    我不用UEFI我骄傲,硬盘只有256,哈哈
    删除文件、合并分区、拍屁股走人,很不保险,Windows下有几个数据恢复软件挺好用的,下班后扔那扫一晚上第二天都找出来了

    1. 石樱灯笼

      数据恢复的前提是得知道需要恢复什么……
      不用EFI其实也没什么,现在很多服务器跑EFI都不正常呢,何况家用设备。

  4. 笛声

    删除文件、合并分区、拍屁股走人,很不保险,扫描分区表,如果你的硬盘只分过两次区,第一次是你分的c d e第二次是你合并了d e,能很简单的重建分区表,所有数据完美重现。

    1. 石樱灯笼

      参见你上面那条留言的回复。

      1. 笛声

        我不需要知道要恢复的是什么,因为我重建一模一样的分区表后,你那些文件全部会出现,没有“数据恢复”这个过程,整个d盘的数据全部完美重现,连一个逗号都不会丢,你压根就没删除文件,只不过删除了文件系统上面的索引,我重建索引后,文件就出来了,你虚拟机里面试试就知道了

        1. 石樱灯笼

          典型的 XY problem 我不做回应。

  5. GlacJAY

    学习了……不过确实,我们的测试服务器也有类似的需求,然后我就直接软链接一把梭了,也就没去想过会不会有这种高级玩法了😂

发表评论

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据