atmos/kernel/fs/storage_policy.rs
1//! ストレージの用途別振り分けポリシー(純粋ロジック)。
2//!
3//! ## なぜこのモジュールがあるか
4//!
5//! **一時ファイル(ブラウザキャッシュ等)を SD カードへ書いてはいけない。**
6//! SD カードはフラッシュメモリで書き換え回数に上限があり、
7//! Web 閲覧のたびにキャッシュを書き込むと**寿命を大きく縮める**。
8//! 一時ファイルは RAM 上(RAMDisk)に置き、電源断で消えてよい。
9//!
10//! 一方、ユーザのデータや設定は電源断で消えては困るので SD カードへ置く。
11//!
12//! ## RAMDisk のサイズ
13//!
14//! Raspberry Pi 3B+ は **1GB の RAM** を搭載する。
15//! カーネルヒープは 512MB 確保している(`main.rs`)。
16//! 従来の RAMDisk 8MB は、5.3MB のフォント 1 本でほぼ使い切る大きさで、
17//! 実機の搭載メモリから見て明らかに過小だった。
18
19/// 保存先の種別。
20#[derive(Debug, PartialEq, Eq, Clone, Copy)]
21pub enum StorageTarget {
22 /// RAM 上。電源断で消えてよい。SD カードを摩耗させない。
23 Volatile,
24 /// SD カード。電源断をまたいで残す必要があるもの。
25 Persistent,
26}
27
28/// 一時ファイルとして扱うパスの接頭辞。
29pub const TEMP_PREFIXES: &[&str] = &["/cache/", "/tmp/"];
30
31/// このパスをどこへ保存すべきかを決める。
32///
33/// キャッシュ・一時ファイルは必ず `Volatile`(RAM)。
34/// **SD カードの寿命を守るため、ここは例外を作らない。**
35pub fn target_for(path: &str) -> StorageTarget {
36 let p = path.trim();
37 for prefix in TEMP_PREFIXES {
38 if p.starts_with(prefix) {
39 return StorageTarget::Volatile;
40 }
41 }
42 StorageTarget::Persistent
43}
44
45/// このパスは電源断で失われてよいか。
46pub fn is_disposable(path: &str) -> bool {
47 matches!(target_for(path), StorageTarget::Volatile)
48}