Linux 根檔案系統的移植(從入門到精通)

浇筑菜鸟發表於2024-04-26

一、簡介

提到作業系統的安裝,還得從大學的時候說起,剛入學的時,朋友的系統本崩了,跑去電腦城換個系統花了40大洋,震驚了貧窮的我。好像發現了商機,果斷開始了折騰自己的電腦,然後用朋友的電腦進行測試,由於對啟動項不瞭解,有次蹦了過後,自己花錢去維修電腦哪裡安裝了一次,偷偷的學習。在這樣的不斷折騰下,慢慢學會了 windows 系統的安裝,因此蹭了不少飯。可能會有小夥伴覺得我們太弱了,確實我們非科班出生,然後又在化工專業下,身邊的人在計算機方面都是小白,只能慢慢的學習。

發現 windows 系統的安裝也不難啊,都是傻瓜式的操作,還是圖形介面,唯一影響小白的就是主機板的啟動項不一樣。後來聽說人家計算機專業的都用 linux 系統,安裝才是麻煩,於是我又開始了對 linux 的折騰,發現操作也差不多,甚至更簡單了(x86架構下)。就這樣機緣巧合的折騰下,被帶到了嵌入式這個行業

有次拿到了一塊 ARM 開發板(正點原子 i.MX6ULL),又回到了系統安裝的道路,先從 uboot 移植到 kernel 移植再到 rootfs 安裝,操作起來確實麻煩多了,教程很詳細,感覺也不是很困難,然後就沒多管了。

直到去年,得到了 RK 平臺的 SDK,發現和我學的不一樣,以前都是 uboot、kernel、rootfs分開的,感覺沒啥難度,現在突然給合在一起,並且晶片的效能提上來了,可以支援 busybox、Debian、ubuntu、android、鴻蒙等,然後一看 SDK 中也沒這些系統啊,也看到很多小夥伴在問,RK3588 怎麼安裝 ubuntu 系統之類的,這下我也開始慌了。

逛了一圈,也沒詳細的教程,但是看到別人都在用不同的種晶片開始裝各種各樣的系統。冷靜下來分析了一下,沒有相應的教程,只能靠自己慢慢琢磨,研究了一下 SDK,終於發現了套路,在這裡記錄一下,也希望能幫助到迷茫的小夥伴。

二、測試環境

下面是我測試過程中使用的開發板和環境,具體的可以更具自己的需求來,不做嚴格要求

  • 開發板:i.MX6ULL、RK3588、RK3288、RV1126
  • roots:busybox、debian、ubuntu、yocto
  • 開發環境:VMware(ubuntu18.04、ubuntu20.04)

三、學習過程

開始之前,先回顧一下 ARM 開發板的學習過程,慢慢的去發現其中的奧秘。

  1. 系統架構分析
    在開始之前,先看一下 linux 的架構圖

    注意: 從圖可以看出來,這是 Android 系統的機構圖,同理,不論是 busybox、Debian、ubuntu 等作業系統都是在 linux 之上的。

  2. 系統移植
    不論選擇的作業系統是什麼,但是在移植之前,需要先把 uboot 和 kerner 移植完成,這裡不是重心,準確說這個兩個的移植也不是很難,不論是分開的,還是合在一起的 SDK,官方都會提供相應的教程,再不濟也有廠商進行指導。

    可以說作業系統的移植相反變成最簡單的了,但是沒有相應的教程,然後又有各種各樣的作業系統,會出現各種奇怪的問題,導致小夥伴們覺得這是最難的。不要慌,這裡我做了一系列的筆記,接著往後看。

    之所以說作業系統的移植是最簡單的,因為他是公用的,並不會因為晶片的差異進行改動,準確是作業系統的核心基本上都是能跑起來的,移植也是沒任何難度,百度隨便搜搜都能出來,如果 SDK 中沒有的,可以模仿模仿,裝個系統沒有難度。有的小夥伴就會害怕,不知從和下手,我得到的結論就是隨便去找一個對應系統的移植,然後跟著操作,最後燒寫到對應的空間即可。

    學習嵌入式,最忌諱的就是隻看不練,一番操作下來,就會發現問題了,雖然作業系統是移植成功了。可能會出現各種外設不能使用,甚至介面都起不起來等各種問題。別慌只需要將遇到的問題解決了即可,解決這些問題也很簡單的,接著往後看。

  3. busybox 移植
    移植 busybox 還挺簡單的,因為沒有過多的元件,甚至連圖形介面都沒有,所以不論什麼晶片,一般不會遇到問題,這裡就不過多介紹了,需要的看後面的筆記。

  4. ubuntu 移植
    應該很多小夥伴都嘗試過移植 ubuntu 的,雖然操作起來比 busybox 還簡單,但是會遇到各種各樣的問題,比如有的網路卡不能工作,圖形介面起不來等。遇到問題後,直接慌了,很多都找不到解決辦法。接著往下看,慢慢的掌握解決問題的辦法,剩下的就是時間問題了。

  5. 元件移植
    這裡我們以 busybox 為例,開始處理各種問題,移植過的小夥伴會發現,busybox 的操作很簡單,基本不會遇到啥問題,但是它移植成功後,只有作業系統的核心元件,其他啥都沒有,需要我們一個個的移植,這裡我有以 QT 環境的移植為例,請參考合集後面的筆記

  6. buildroot 和 yocto 使用
    操作完就會發現,每個工具都這樣的移植也挺麻煩的,並且元件多了也很費時,所以出現了 buildroot 和 yocto 這樣的工具,來解決這個比較困難的問題,這裡我用過 buildroot,請參考合集後面的筆記,yocto 我使用過後,再附上。

  7. deb 檔案打包
    在瞭解打包 deb 檔案之前,先觀察一下之前所經歷的事情,我們都知道 busybox 是簡單的工具集,只能滿足常規的linux 工具需求,像需要 QT 環境之類的,還得需要自己手動移植過來。為了解決這個麻煩,buildroot 和 yocto 工具實現了快速定製的過程,減少了自己手動移植的時間。

    可能細心的小夥伴已經發現了,像板子需要的檔案,都是透過工具的形式出現的,比如 GPU、NPU、各種外設等,每家的晶片都有一定的卻別,想要在根檔案系統中呼叫對應的硬體,需要將廠商提供的工具,編譯成對用的 .so 和 .a 檔案,然後放到系統中,再根據對應的 API 即可呼叫。

    明白了這一步,那基本掌握了,移植時,外設不能使用等問題的解決辦法。同理,每個開發板都會提供對應的 SDK,我們便可以參考 SDK 解決自己的問題,比如我移植 ubuntu 時,發現 GPU 不能用,便可以去廠商提供的 SDK,找到對應的檔案,複製到系統中即可解決。

    但是一直這樣不斷的去複製檔案,也是比較麻煩了,為了以後同類晶片的問題簡單話,每個環境需要的檔案整理好,打包成 deb 需要的時候直接安裝即可。

  8. 寫指令碼
    哪怕我們將需要的檔案都打包成了 deb 檔案,檔案多了,操作起來也是很麻煩的,所以可以參考廠家提供的 SDK,直接將自己需要的流程編寫成一個指令碼,然後一條命令便可解決複雜的問題。

三、總結

現在在整體回顧一下流程,將會發現移植自己需要的系統也是挺簡單的,流程如下

  1. 選擇自己需要的系統
  2. 整理自己需要的外設和工具檔案
  3. 打包成系統能識別的工具包
  4. 編寫指令碼並打包成 img 檔案
  5. 燒寫驗證

** 注意:** 雖然看起來挺簡單的,但是需要各位小夥伴多多練習,徹底掌握其中奧秘。
筆記還沒寫完,後續我會持續新增,有寫得不好的地方望大佬指出,有也我一樣還在學習過程中的,可以一起相互討論。

相關文章