本帖最后由 中关村东路 于 2022-10-15 21:39 编辑
3. overlay+tmpfs/zram实现
3.1 overlay+tmpfs实现
直接上代码吧。首先是创建内存目录:
- mkdir -p /opt/roon/{tmpfs,1b1abcdefg230980fd1234567a13}
- mount -t tmpfs -o rw,noatime,nodiratime,size=12g tmpfs /opt/roon/tmpfs
- mkdir -p /opt/roon/tmpfs/{upper,work}
复制代码
之后是构造overlay提供给Roon Core,注意后面两行是自动换行了,其实是一行:
- mount --bind /var/roon/RoonServer/Database/Core/1b1abcdefg230980fd1234567a13 /opt/roon/1b1abcdefg230980fd1234567a13
- mount -t overlay -o rw,lowerdir=/opt/roon/1b1abcdefg230980fd1234567a13/broker_3.db,upperdir=/opt/roon/tmpfs/upper,workdir=/opt/roon/tmpfs/work overlay /var/roon/RoonServer/Database/Core/1b1abcdefg230980fd1234567a13/broker_3.db
复制代码
这一套拳法打完就可以启动roon了。启动速度一如既往的慢。但启动之后的操作就快了。除此之外,上一节说了,需要在每天半夜四点(按你的生物钟定)让cron或者systemd把数据从内存硬同步回硬盘。一定注意这里的几个斜杠别打错了。
- rsync -az --delete /var/roon/RoonServer/Database/Core/1b1abcdefg230980fd1234567a13/broker_3.db/ /opt/roon/1b1abcdefg230980fd1234567a13/broker_3.db
复制代码
如果想要在你的系统上跑起来,首先需要确定的是 ROON_DATAROOT=/var/roon ,这个是你的roon数据根目录,是你机器的具体环境决定的,我不知道,上节说的方法你可以试试,也可以去你电脑上找找哪个目录大;其次要查那个诡异的1b1abcdefg230980fd1234567a13,这个数字是我虚构的,你也可以按前面的方法查一下,在 ROON_DATAROOT 下翻翻就能找到。
3.2 overlay+tmpfs实现解释(可选)
下面简单解释一下原理吧,第一段三行建立了tmpfs/upper,tmpfs/work,还有逻辑上的lowerdir,1b1abcdefg230980fd1234567a13目录。为了方便,我们称呼最后这个目录为opt-db,如果你想理解这个方案需要记得,后面还会提到。
第二段,我们先搞了个小trick,没让这个opt-db直接存数据,而是把实际硬盘上的/var/roon/RoonServer/Database/Core/1b1abcdefg230980fd1234567a13 bind过来。为了方便,我们称呼这个目录为var-db吧。这个操作差不多就是windows的快捷方式,以后往opt-db写东西就直接写进var-db了。最后一句代码,再把这个bind过来的opt-db/broker_3.db目录作为lowerdir(实际存储数据的目录),加载回var-db/broker_3.db,这正是Roon Core所需的那个目录,供其读写。这样我们就用这段简短的代码实现了想要的逻辑——当Roon尝试从var-db/broker_3.db读写时候,实际上他操作的是tmpfs/upper,如果这里没有想要的东西,overlay模块会从lowerdir也就是opt-db/broker_3.db同步过来,然而回忆一下,这个opt-db并不是真的存了数据,而是我们从硬盘上的var-db bind过来的,所以读到的是硬盘上的var-db/broker_3.db目录。换句话说,Roon看起来是从逻辑上的var-db/broker_3.db读取东西,但这个目录是我们把好些东西组合起来的,但最终他读到的居然还是var-db/broker_3.db这个硬盘目录。我的天,这个逻辑是不是很酷。
第三段,每天半夜同步的这一步,会从逻辑上的var-db,读取数据同步到opt-db。有意思的是,这个opt-db实际上是从var-db bind过来的,看起来是不是好像从var-db同步到var-db?其实不是,因为这个opt-db是在第二段第一行从硬盘bind过来的,而现在逻辑上的var-db却不再是真正的存储在硬盘上var-db,而是overlay之后的,也就是说,先从内存中读取,内存找不到就去lowerdir找,而lowerdir是opt-db自己,是不是很呵呵,这样同步过来的就只有内存中的数据了。
怎么样,是不是绕糊涂了?下面你有两个选择,糊涂着用,看懂了之后再用,以及不用。是不是这回真糊涂了?开了个冷笑话,希望看懂的同学在弹幕上扣1。
3.3 overlay+zram实现思路(可选)
和3.1的overlay+tmpfs的实现完全类似,只要改第一段第二句为zram就可以了,具体代码可参考【7】。
|