将 Firefox 配置文件保存在 ramdisk 上的最佳实践

将 Firefox 配置文件保存在 ramdisk 上的最佳实践

我有足够的 RAM,我想用它来加快浏览器的速度。

目标:

  1. 将配置文件和缓存完全存储在内存中,因此浏览时不会大量使用 HDD,也fsync不会到达实际的 HDD 或文件系统。
  2. 在后台不断更新配置文件的 HDD 副本,以便在突然断电的情况下不会丢失超过 X 分钟的浏览数据;
  3. 保持备份一致(没有损坏的 sqlite 数据库等)

即,在崩溃的情况下,用一些可用内存和一些最近的浏览会话来换取速度。

如何组织这样的计划?

我现在的想法是这样的:

  1. 使用zram创建ramdisk modprobe zram;;
  2. 在其上创建 LVM 卷losetup /dev/zram0 /dev/loop1; pvcreate /dev/loop1; ...; mke2fs -t ext4 -O ^has_journal /dev/mapper/ffvg-ffvol
  3. 将 Firefox 配置文件放在此卷上;
  4. 定期(每 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。

仍在寻找如何改进它的想法或我未能找到的既定解决方案。

相关内容