ドキュメントには、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 -s
zRAMデバイスがアクティブになりcat /sys/block/zram0/backing_dev
返され、正常に動作し、書き込み/dev/loop0
が実際に成功したことを確認します。echo huge > /sys/block/zram0/writeback
cat /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);
}