BV1AL 之無所不記

2022-12-30

Linux Live系統20年

從開始接觸KNOPPIX開始到現在,大概20年有了,我一直都是使用Live的Linux,而不是把Linux系統以『正常』方式(system tree有幾千幾萬個檔案)安裝到電腦裡,就是我用的整個Linux系統只有單一個檔案,這個檔案可能是用squashfs或其他方式壓縮的單一檔,這樣的系統也叫做frugal installation。

Live的系統還可以把它整個丟到RAM裡面跑,速度很快,就是在boot option加上一個toram的參數,它就會全部都copy進RAM裡,不過以ubuntu系統來說,它會把整個儲存體(例如整支USB碟)都copy,這不是我要的(因為可能RAM比我的USB碟小),我在單一USB碟裡面可能裝了好幾個不同的Linux,所以需要改一下initrd裡面的scripts/casper,讓它在copy時只把存放我要的Linux的目錄copy到RAM裡。

以ubuntu的initrd裡面的scripts/casper來說,就是
parse_cmdline() 加上一個
usize=*) export USIZE="${x#usize=}" ;;

copy_live_to()
把原本的
size=$(fs_size "" ${copyfrom} "used")
改成
size="${USIZE}000"

把原本的
cp -a ${copyfrom}/* ${copyto}
改成
cp -a ${copyfrom}/$LIVE_MEDIA_PATH/ ${copyto}

do_snap_copy ()
也跟上面一樣改一下成為
size="${USIZE}000"

然後在boot option 加上 usize=NNNN 例如: usize=1630
就是先du 一下你的Linux目錄看多少?例如 1620360 再少掉三位數,再加一點。

這樣就不會把整個USB碟全都copy進RAM。但是這裡還是有一個很大的浪費,就是
/lib/modules/
/lib/firmware/
這兩個目錄下真正用到的東西很少,可能不到百分五,所以如果只把用得到的放在系統裡,可以省下不少空間,特別是要丟到RAM裡跑的話,以squashfs壓縮檔來說可以縮小500MB以上。

要怎麼知道系統用到哪些/lib/modules/跟/lib/firmware/下的東西呢?
lsmod看看就知道了!
lsmod|awk '{print $1}' 可以找出用到哪些kernel modules
從找出來的list再經由modinfo來查
modinfo $MODULE|grep filename:|cut -b17- 找出在 /lib/modules/ 的對應位置
建立一個名單,再用tar 把名單裡的東西全都打包

要找/lib/firmware/ 之下哪些東西是有用到?一樣是先問lsmod
從找出來的list裡去問modinfo大神
modinfo $MODULE|grep ^firmware:|awk '{print "/lib/firmware/"$2}'
就知道系統用到哪些firmware

frugal大概就這樣玩!

標籤: , ,