簡記initramfs使用

2022-09-07 17:42:19 字數 1804 閱讀 9562

網上都是各種介紹,流程咋走咋走,rootfs怎麼做怎麼做

但用起來是真沒跑起來(雖然不是我自己弄,但是我看了一圈下來也是暈)

最後負責弄的同學倒騰出來了,發現不太像網上說的那麼回事,甚至原始碼也覺得怪怪的

大概是沒有通讀**流程就想自己折騰一下initramfs

總之簡單記錄一下

注意點:

1. 使用的專案有打包rootfs,自己額外做反而因為動態庫啥的放得不對跑不起來

2. 編譯期間以為要開啟選項config_blk_dev_ram,結果並不需要

實際只要開啟initramfs/initrd支援,然後指定rootfs資料夾,還有cpio的壓縮就好了

目前cpio壓縮只驗證了xz能用,gz不知為啥解壓失敗,提示什麼padding有問題

3. 之前一直弄不出來,看流程都以為第一步 unpack_to_rootfs

(__initramfs_start, __initramfs_size);

是解壓initramfs,然後第二步 unpack_to_rootfs

((char

*)initrd_start,

initrd_end - initrd_start);是解壓cpio

甚至**內解壓失敗都是提示你這不像initramfs,像initrd,具體原因是junk in compressed

archive

結果不是,第一步的unpack_to_rootfs已經解壓好根檔案系統了,後面的操作就是確認initrd在這個initramfs裡還是需要怎麼使用

像目前使用的專案,只會編譯initramfs_data.cpio.xz,沒有initrd,那只要第一步就可以了

而**流程進入到第二步完全是意外:同學在dts裡指定了chosen: linux:initrd-start

這個位址,它被核心匯入為initrd_start了;這個位址實際不該使用。

好想和linux專案提issue……太混淆了

附自己加點log的initram.c部分**

static

int__init

populate_rootfs

(void){

char

*err =

unpack_to_rootfs

(__initramfs_start,

__initramfs_size);

if(err)

panic

("%s"

,err);

if(initrd_start) {

#ifdef

config_blk_dev_ram

intfd;

printk

(kern_info

"trying to unpack rootfs image as

initramfs...__initramfs_start=%p, initrd_start=%p

initrd_end=%p\n"

,__initramfs_start,

(void

*)initrd_start, (

void

*)initrd_end);

err =

unpack_to_rootfs

((char

*)initrd_start,

initrd_end -

initrd_start);

// err =

unpack_to_rootfs(__initramfs_start, __initramfs_size);

if(!err) {

free_initrd

();

Git使用簡記

匯出檔案 git 標籤 新增標籤 git tag,例 git tag v1.0 新增帶有說明的標籤 git tag a v0.1 m 第一次提交 a指定標籤名,m指定說明文字 檢視標籤 git tag 為歷史提交打標籤 先檢視歷史提交的 commit idgit log pretty oneline...

mongoose使用簡記

mongodb中集合相當於表,常用指令 mongo 進入資料庫 use yourdatabase 來選擇你的資料集,這個跟關係型中的一樣 show collections 來檢視你資料集中的表,collection就是關係型中的表 db.createcollection name,option na...

git使用簡記

git是分布式的 版本控制工具,當年linus為了管理好linux核心 搞出來的東西。雖一直聽說git合併 很方便,但卻沒怎麼用過,公司一直還在用svn來管理 最近註冊了個github賬號,用來看原始碼,當然自己也要寫一點,這裡順便把一些最基礎的git命令記下來。1.建立本地版本庫 建立新的 庫 g...