先说结论:
本文的最终目的,是将 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。
但对于开发者而言就不一样了。
“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
这些我想指定的分区就好了。
This is Linux, do whatever you feel like to do.
开始分区
注,不论你打算接下来如何操作,如果目的主机上有重要文件,一定要先使用外置存储备份,并用其他主机确认外置存储备份已经成功后,再进行以下操作。
基本安装
首先按照基本思路安装系统。Linux 将作为唯一系统,所以不再保留 Windows 和厂家附带的任何第三方分区。
硬件配置是 512G 的 SSD ,16G 的内存,所以这里分配如下:
- 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
的设备名
/dev/nvme0n1p2
和 /dev/nvme0n1p5
。
创建临时目录(/tmp/thisislinux/
),挂载这两个分区。
进入 /dev/nvme0n1p5
,建立目录 home
、 www
、 apt_cache
、 storage
四个目录。
/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
下的 home
、 www
、 apt_cache
绑定到接下来将要启动的系统对应的目录下。
编辑 /tmp/thisislinux/root/etc/fstab
文件
增加三行
好了,现在可以重启了。
重启
如果启动没问题的话,打开命令行,执行 df -ah
可以看到 /mystorage
、home
、 www
、 apt_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
13 comments
Skip to comment form ↓
夏目贵志
2019 年 4 月 20 日 在 下午 4:49 (UTC 8) Link to this comment
Mozilla/5.0 (Linux; U; Android 8.1.0; zh-CN; 1807-A01 Build/OPM1) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 Quark/3.0.4.946 Mobile Safari/537.36
linux用的少,不过学习了
石樱灯笼
2019 年 4 月 20 日 在 下午 5:04 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
主要是 Win10 实在是无法接受,只能把日常生活和工作逐步往 Linux 上面搬,然而 Linux 离真正适合一般用户使用还差的太远了。
Sam.Z
2019 年 4 月 22 日 在 下午 3:43 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
唯一在用的就是黑群辉,一个硬盘一个目录,主要用于存储文件,执行文件甚少,喜欢用mount –bind来规范不同盘之间的目录,文章所提的分区暂时用不到,先学习了,谢谢~
FROYO
2019 年 4 月 26 日 在 下午 7:34 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
我不用UEFI我骄傲,硬盘只有256,哈哈
删除文件、合并分区、拍屁股走人,很不保险,Windows下有几个数据恢复软件挺好用的,下班后扔那扫一晚上第二天都找出来了
石樱灯笼
2019 年 4 月 27 日 在 上午 2:22 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
数据恢复的前提是得知道需要恢复什么……
不用EFI其实也没什么,现在很多服务器跑EFI都不正常呢,何况家用设备。
笛声
2019 年 7 月 16 日 在 上午 8:57 (UTC 8) Link to this comment
Mozilla/5.0 (iPad; CPU OS 9_3_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G34 Safari/601.1
删除文件、合并分区、拍屁股走人,很不保险,扫描分区表,如果你的硬盘只分过两次区,第一次是你分的c d e第二次是你合并了d e,能很简单的重建分区表,所有数据完美重现。
石樱灯笼
2019 年 7 月 16 日 在 下午 1:02 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
参见你上面那条留言的回复。
笛声
2019 年 7 月 16 日 在 下午 5:32 (UTC 8) Link to this comment
Mozilla/5.0 (iPad; CPU OS 9_3_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G34 Safari/601.1
我不需要知道要恢复的是什么,因为我重建一模一样的分区表后,你那些文件全部会出现,没有“数据恢复”这个过程,整个d盘的数据全部完美重现,连一个逗号都不会丢,你压根就没删除文件,只不过删除了文件系统上面的索引,我重建索引后,文件就出来了,你虚拟机里面试试就知道了
石樱灯笼
2019 年 7 月 16 日 在 下午 5:49 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
典型的 XY problem 我不做回应。
GlacJAY
2019 年 8 月 21 日 在 下午 3:04 (UTC 8) Link to this comment
Mozilla/5.0 (Android 9; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0
学习了……不过确实,我们的测试服务器也有类似的需求,然后我就直接软链接一把梭了,也就没去想过会不会有这种高级玩法了😂
testme
2019 年 11 月 23 日 在 下午 6:29 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
我直接一个分区/
archer
2020 年 2 月 14 日 在 下午 6:24 (UTC 8) Link to this comment
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:73.0) Gecko/20100101 Firefox/73.0
每次看你写的东西都会有些新的收货,已于今年1月份格了双系统,现在用linuxmint,一些工作用软件ps、cad都用虚拟机去实现。希望我能慢慢的去熟悉好使用好linux,哈哈!
石樱灯笼
2020 年 2 月 15 日 在 上午 10:43 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36
感谢阅读。
PS和CAD这些专用软件是Win用户转向Linux上的一大阻碍。根据我的了解,Adobe 和 Autodesk 的产品虽说不是没有其他开源或支持多平台的商业软件替代,但他们在行业内具有的无可比拟的特性优势也真不是吹牛,是真本事。我最近一阵子在做NLE的研究,发现PR几乎找不到多少替代品,虽然NLE的产品非常多,开源、个免或商免的可替代品都很多,但是 PR 这种软件的优势是无可比拟的(当然价格也是一般用户承受不了的)。