从如何放文件说起

记得在介绍 Windows 与 Unix-like 文件系统对于普通用户来说最大的区别,就是文件路径了。 Winddows 把分区在系统都作为一个单独的根路径,例如常见的 C:\ D:\ 等, Unix-Like 则不这这个层面上的区分,只认为一个根目录 / ,其余的节点都在根目录下面。这样一比较, Unix-Like 这样的设计就浮现出来:如果分区或磁盘容量不足需要迁移数据时,只需要挂载新的节点即可。而不像 Windows 那样需要改变路径。(当然,后来 Windows 也支持将分区挂载到目录,但会产生其他问题,比如兼容性,还有及时查看容量等等)

对于用户来说,莫过于自己常用的文件了。一般情况下, Windows 使用 C:\Users\UserName 作为用户主目录,等效于 Unix-Like 的 /home 目录。作为一个经常使用 Windows 并踩过坑的用户,会有意地将 C:\ 分区分开,为了在系统出现异常不得不重装的情况下不轻易损失其他数据;同样的道理, Unix-Like 用户也会将 /home 单独挂载分区甚至硬盘。

不过习惯使用 Linux 后,某个人就喜欢上了这种将东西按习惯放在 /home 下的手法,于是揣摩这个做法。将 D:\home 作为主目录(当然也不是真正意义上的,因为 Windows 下迁移用户主目录会出现很多问题),然后将其他硬盘挂载到这个位置。当然这并没实质性解决扩容的问题,因为还是需要面对一块硬盘用满的情况。

在 Linux 下有 LVM2 (请参考某之前写的那篇“ LVM 简单实践”) , Windows 下面是否有类似的技术呢?答案是有的,那就是 LDM 中的 Spanned Volume ,从字面意思看就是跨多个硬盘卷,除了一些其他要求外,总体兼容性还是非常好的。并且由此还能发现可以做 Soft RAID 即 Stripped Volume ,相当于 Linux 下的 mdadm 。

于是某就做到了如下图中这样的结构(请无视当中那块盘XD)

一个 Spanned Volume 做放容量大的数据,比如音乐、下载等。一个 Stripped Volume 用来加速常用的东西,比如安装游戏和软件。

不过一直以来还剩一个烦恼没有解决,那就是这样做的分区,在 Linux 下面使用非常困难。写代码没音乐听?还是挺郁闷的。

ldmtool

这个意思不是指没有 ldmtool 前就没有解决办法,这里就有一个,不过和 LDM 分区的数据存放方式有关系。LDM 在建立在 Dynamic 磁盘上,用一个在开头的小分区(在 Windows 下看不到)来记录整块硬盘的分区(有别于 MBR 将分区表放在头几个字节里。),也就是说要自己根据这个信息计算分区在磁盘上的分布位置,然后再根据数值进行挂载,算错的话就……

所以后来有了 libldm 这个东西,这个根据自动扫描硬盘后根据前面所说的原理解决那些反反复复的计算并建立新的硬件文件,同样放在 /dev/mapper 下。

如果要直接使用,可能需要对它进行 patch ,新的源代码某已经 fork 到自己的仓库下。 ArchLinux 用户可以使用 AUR 里的 ldmtool 包。 Gentoo 用户可以使用某的 Overlay 中的 sys-fs/ldmtool 包。

具体使用方法:

在命令行下使用 ldmtool 命令,然后参考下面的操作。

这样就会在 /dev/mapper/ 下建立相应的设备文件,使用适当的参数挂载即可。

可惜这个工具比较长时间没更新维护了,否则可以像 device-mapper 一样进入内核。现阶段可能更现实的做法是将它集成进 busybox 等 initramfs 阶段,开机的时候即准备好设备。

参考资料