![将 Firefox 配置文件保存在 ramdisk 上的最佳实践](https://linux22.com/image/1391645/%E5%B0%86%20Firefox%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%BF%9D%E5%AD%98%E5%9C%A8%20ramdisk%20%E4%B8%8A%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.png)
我有足够的 RAM,我想用它来加快浏览器的速度。
目标:
- 将配置文件和缓存完全存储在内存中,因此浏览时不会大量使用 HDD,也
fsync
不会到达实际的 HDD 或文件系统。 - 在后台不断更新配置文件的 HDD 副本,以便在突然断电的情况下不会丢失超过 X 分钟的浏览数据;
- 保持备份一致(没有损坏的 sqlite 数据库等)
即,在崩溃的情况下,用一些可用内存和一些最近的浏览会话来换取速度。
如何组织这样的计划?
我现在的想法是这样的:
- 使用zram创建ramdisk
modprobe zram
;; - 在其上创建 LVM 卷
losetup /dev/zram0 /dev/loop1; pvcreate /dev/loop1; ...; mke2fs -t ext4 -O ^has_journal /dev/mapper/ffvg-ffvol
; - 将 Firefox 配置文件放在此卷上;
- 定期(每 N 分钟)创建 LVM 快照并将其备份到 HDD,然后删除快照。
对于这项任务来说,这(尤其是 LVM 部分)看起来有点繁重。有没有更好/更成熟/更简单的方法?
答案1
根据相关想法为 Firefox 配置了一个卷。
- 启动时会创建两个 zram 设备。HDD 卷的内容会复制到第一个设备。第二个设备用作快照的写时复制设备;
- Firefox 配置文件目录符号链接到保存在 zram0 中的卷。
- 脚本(如下)会定期创建内存设备的快照(使用 zram1 作为写时复制)、HDD 卷的快照,并将内存快照复制到 HDD 卷。
每次更新大约需要10秒(变化较少的情况下);完整更新需要40秒。
更新脚本:
#!/bin/bash
set -e
SOURCE_DEVICE=/dev/zram0
COW_DEVICE=/dev/zram1
SOURCE_SNAPSHOT_NAME=ffsnap
DESTINATION_VG=cryptie3
DESTINATION_VOL=ff
HASH_FILE=/tmp/ff.md5
MS=$(blockdev --getsize "$SOURCE_DEVICE")
WS=$(blockdev --getsize "$COW_DEVICE")
MN=$(printf '%d:%d' `stat -c '0x%t 0x%T' "$SOURCE_DEVICE"`)
WN=$(printf '%d:%d' `stat -c '0x%t 0x%T' "$COW_DEVICE"`)
dmsetup create $SOURCE_SNAPSHOT_NAME --table "0 $MS snapshot $MN $WN N 8"
trap "dmsetup remove --force --retry $SOURCE_SNAPSHOT_NAME" EXIT
T=$(date "+%s")
lvcreate $DESTINATION_VG/$DESTINATION_VOL --snapshot --name ${DESTINATION_VOL}_$T -L 100M
# You can just use "cat /dev/mapper/$SOURCE_SNAPSHOT_NAME > /dev/mapper/$DESTINATION_VG-$DESTINATION_VOL" here if you don't want to use hashed_update
if [ -e "$HASH_FILE" ]; then
/usr/local/bin/hashed_update /dev/mapper/$SOURCE_SNAPSHOT_NAME "$HASH_FILE" \
/dev/mapper/$DESTINATION_VG-$DESTINATION_VOL "${HASH_FILE}".new 65536
mv "${HASH_FILE}".new "$HASH_FILE"
else
/usr/local/bin/hashed_update /dev/mapper/$SOURCE_SNAPSHOT_NAME NULL \
/dev/mapper/$DESTINATION_VG-$DESTINATION_VOL "$HASH_FILE" 65536
fi
lvremove --force ${DESTINATION_VG}/${DESTINATION_VOL}_$T
hashed_update 在这里:https://github.com/vi/hashed_update
一些更新:1. 不要忘记挂载,SOURCE_DEVICE
不是snapshot-origin
直接挂载;2. 现在我使用持久 CoW 区域手动管理目标快照,dmsetup
而不是重复执行 lvcreate/lvremove。
仍在寻找如何改进它的想法或我未能找到的既定解决方案。