loopdev를 사용하여 zRAM 쓰기 저장 기능 구현

loopdev를 사용하여 zRAM 쓰기 저장 기능 구현

문서에는 zRAM 쓰기 저장 기능이 스왑 파티션만 지원한다고 명시되어 있습니다 backing_dev. 그러나 스왑 파일을 사용하여 루프 장치에 연결하는 것도 성공했습니다.

losetup /dev/loop0 /swapfile
cd /sys/block/zram0
echo /dev/loop0 > backing_dev
echo 8G > disksize
mkswap /dev/zram0
swapon /dev/zram0

그 후, swapon -szRAM 장치가 활성화되어 cat /sys/block/zram0/backing_dev반환되어 정상적으로 작동하고 /dev/loop0쓰기 가 실제로 성공했음을 확인합니다.echo huge > /sys/block/zram0/writebackcat /sys/block/zram0/bd_stats

이것을 사용할 수 있습니까? 아니면 이 방법에 몇 가지 불쾌한 단점이 있습니까?

답변1

괜찮아요. Android에서는 루프백 파일을 사용하여 쓰기 저장을 활성화합니다.

static bool PrepareZramBackingDevice(off64_t size) {

    constexpr const char* file_path = "/data/per_boot/zram_swap";
    if (size == 0) return true;

    // Prepare target path
    unique_fd target_fd(TEMP_FAILURE_RETRY(open(file_path, O_RDWR | O_CREAT | O_CLOEXEC, 0600)));
    if (target_fd.get() == -1) {
        PERROR << "Cannot open target path: " << file_path;
        return false;
    }
    if (fallocate(target_fd.get(), 0, 0, size) < 0) {
        PERROR << "Cannot truncate target path: " << file_path;
        return false;
    }

    // Allocate loop device and attach it to file_path.
    LoopControl loop_control;
    std::string loop_device;
    if (!loop_control.Attach(target_fd.get(), 5s, &loop_device)) {
        return false;
    }

    ConfigureIoScheduler(loop_device);

    ConfigureQueueDepth(loop_device, "/");

    // set block size & direct IO
    unique_fd loop_fd(TEMP_FAILURE_RETRY(open(loop_device.c_str(), O_RDWR | O_CLOEXEC)));
    if (loop_fd.get() == -1) {
        PERROR << "Cannot open " << loop_device;
        return false;
    }
    if (!LoopControl::EnableDirectIo(loop_fd.get())) {
        return false;
    }

    return InstallZramDevice(loop_device);
}

원천:https://android.googlesource.com/platform/system/core/+/refs/tags/android-12.1.0_r2/fs_mgr/fs_mgr.cpp#2051

관련 정보