1. 程式人生 > >【Linux】【cmdline】uboot傳遞給核心的root裝置序號動態變化導致啟動失敗

【Linux】【cmdline】uboot傳遞給核心的root裝置序號動態變化導致啟動失敗

現象

板子上插入SD卡啟動Linux系統後,emmc的裝置名稱是/dev/mmcblck1;板子上沒有插入SD卡,Linux啟動後,emmc的裝置名稱是/dev/mmcblck0.

uboot傳遞給核心的cmdline引數bootargs 中root=/dev/mmcblck0p14,這個配置在沒有插SD卡的時候工作正常,但是插入SD卡後,就無法正常啟動Linux系統,因為無法找到root裝置。

思考解決方案

要麼改核心,使得emmc的裝置名稱固定;要麼改bootargs,使root不依賴裝置名稱。

過程

root=       [KNL] Root filesystem
            See name_to_dev_t comment in
init/do_mounts.c. rootdelay= [KNL] Delay (in seconds) to pause before attempting to mount the root filesystem rootflags= [KNL] Set root filesystem mount option string rootfstype= [KNL] Set root filesystem type rootwait [KNL] Wait (indefinitely) for root device to
show up. Useful for devices that are detected asynchronously (e.g. USB and MMC devices).
183 *   Convert a name into device number.  We accept the following variants:
184 *
185 *   1) <hex_major><hex_minor> device number in hexadecimal represents itself
186 *         no leading 0
x, for example b302. 187 * 2) /dev/nfs represents Root_NFS (0xff) 188 * 3) /dev/<disk_name> represents the device number of disk 189 * 4) /dev/<disk_name><decimal> represents the device number 190 * of partition - device number of disk plus the partition number 191 * 5) /dev/<disk_name>p<decimal> - same as the above, that form is 192 * used when disk name of partitioned disk ends on a digit. 193 * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the 194 * unique id of a partition if the partition table provides it. 195 * The UUID may be either an EFI/GPT UUID, or refer to an MSDOS 196 * partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero- 197 * filled hex representation of the 32-bit "NT disk signature", and PP 198 * is a zero-filled hex representation of the 1-based partition number. 199 * 7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to 200 * a partition with a known unique id. 201 * 8) <major>:<minor> major and minor number of the device separated by 202 * a colon. 203 * 204 * If name doesn't have fall into the categories above, we return (0,0). 205 * block_class is used to check if something is a disk name. If the disk 206 * name contains slashes, the device name has them replaced with 207 * bangs. 208 */ 209 210dev_t name_to_dev_t(char *name)

嘗試

嘗試使用<hex_major><hex_minor> device number方式。插SD卡和不插SD卡進入系統後,分別檢視mmcblck0p14的裝置號對應什麼。

  • 插入SD卡的情況
[email protected]:/dev/block # ls -l mmc*
brw------- root     root     179,   8 1970-01-02 07:06 mmcblk0
brw------- root     root     179,  16 1970-01-02 07:06 mmcblk0boot0
brw------- root     root     179,  24 1970-01-02 07:06 mmcblk0boot1
brw------- root     root     179,   9 1970-01-02 07:06 mmcblk0p1
brw------- root     root     179,  10 1970-01-02 07:06 mmcblk0p2
brw------- root     root     179,  11 1970-01-02 07:06 mmcblk0p3
brw------- root     root     179,  12 1970-01-02 07:06 mmcblk0p4
brw------- root     root     179,  13 1970-01-02 07:06 mmcblk0p5
brw------- root     root     179,  14 1970-01-02 07:06 mmcblk0p6
brw------- root     root     179,  15 1970-01-02 07:06 mmcblk0p7
brw------- root     root     259,   0 1970-01-02 07:06 mmcblk0p8
brw------- root     root     259,   1 1970-01-02 07:06 mmcblk0p9
brw------- root     root     179,  32 1970-01-02 07:06 mmcblk0rpmb
brw------- root     root     179,   0 1970-01-02 07:06 mmcblk1
brw------- root     root     179,   1 1970-01-02 07:06 mmcblk1p1
  • 未插入SD卡時候的情況
[email protected]:/dev/block # ls -l mmc*                                       
brw------- root     root     179,   0 1970-01-02 07:16 mmcblk0
brw------- root     root     179,   8 1970-01-02 07:16 mmcblk0boot0
brw------- root     root     179,  16 1970-01-02 07:16 mmcblk0boot1
brw------- root     root     179,   1 1970-01-02 07:16 mmcblk0p1
brw------- root     root     179,   2 1970-01-02 07:16 mmcblk0p2
brw------- root     root     179,   3 1970-01-02 07:16 mmcblk0p3
brw------- root     root     179,   4 1970-01-02 07:16 mmcblk0p4
brw------- root     root     179,   5 1970-01-02 07:16 mmcblk0p5
brw------- root     root     179,   6 1970-01-02 07:16 mmcblk0p6
brw------- root     root     179,   7 1970-01-02 07:16 mmcblk0p7
brw------- root     root     259,   0 1970-01-02 07:16 mmcblk0p8
brw------- root     root     259,   1 1970-01-02 07:16 mmcblk0p9
brw------- root     root     179,  24 1970-01-02 07:16 mmcblk0rpmb

可以看到,同樣地分割槽,major和minor並不固定。當然有些是固定的,比如p8,p9.
碰巧我們使用的分割槽在兩種情況下Major和Minor是固定沒有變化的。所以我們設定bootargs root=259:1,然後成功兩種情況下都啟動了。

附錄

相關推薦

Linuxcmdlineuboot傳遞核心root裝置序號動態變化導致啟動失敗

現象 板子上插入SD卡啟動Linux系統後,emmc的裝置名稱是/dev/mmcblck1;板子上沒有插入SD卡,Linux啟動後,emmc的裝置名稱是/dev/mmcblck0. uboot傳遞給核心的cmdline引數bootargs 中root=/de

Linux探索之旅第一部分第三課:測試並安裝Ubuntu

u盤 nco 過程 sans ubunt windows u盤啟動盤 系統 .com 內容簡單介紹 1、第一部分第三課:測試並安裝Ubuntu 2、第一部分第四課預告:磁盤分區 測試並安裝Ubuntu 大家好,經過前兩個比較偏理論(是否

Linux數據庫Redis安裝配置

con debug top size 日誌 stream oca mono onf 一,Redis配置 1、下載安裝 $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz $ tar xzf re

Linux探索之旅第四部分第三課:文件傳輸,瀟灑同步

命令行 上傳文件 文件夾 images lsh wget命令 ace 目標 wechat 內容簡單介紹 1、第四部分第三課:文件傳輸。瀟灑同步 2、第四部分第四課:分析網絡。隔離防火 文件傳輸。瀟灑同步 這一課的內容相

3、Linux系統編程系統目錄詳解

升級 user ssa pci edi 靜態 描述 com 沒有 Linux系統目錄詳解 一、Linux系統目錄結構 1、根目錄/   這就是根目錄。對你的電腦來說,有且只有一個根目錄。所有的東西,我是說所有的東西都是從這裏開始。舉個例子:當你在終端裏輸入“/home”,

5、Linux系統編程環境變量

第一次 的區別 nvi 用戶目錄 mail 操作 key 推薦 一行 前言   1. 環境變量是操作系統環境設置的變量,適用於整個系統的用戶進程;   2. 環境變量可以在命令中設置,但是用戶註銷的時候將會丟失這些設置值;   3. 若要重復適用,則最好在.profile中

Linux學習筆記11移動檔案,目錄的mv命令以及關於檢視檔案的技巧

首先給大家分享一下移動檔案、目錄的命令—mv命令(move) (這裡不會像前面那麼詳細地說,因為與前一篇的cp命令有很多相同點,重頭戲在檢視檔案的技巧) mv命令:用於移動檔案或者目錄 mv /tmp/CJlinux/1/2/1.txt /t

Linux之旅-1VMware虛擬機器中的Centos和windows共享資料夾

一、開啟虛擬機器,進入安裝好的centos系統,點選VM頂部導航欄中的“虛擬機器”按鈕,進入子選單選擇“安裝VMware Tools”,如下圖(我的已安裝過,因此顯示的是重新安裝) 二、在cent

Linux之旅-3vi和vim編輯器

一、vi和vim介紹 所有的Linux系統都會內建vi文字編輯器。vim具有程式編輯能力,可看作是vi的增強版,可以主動的以字型顏色辨別程式碼語法的正確性,方便程式設計,程式碼補充、編譯及錯誤跳轉等方便程式設計的功能豐富。 二、vi和vim的三種常見模式 2.1正常模式

Linux之旅-4Linux關機重啟和遠端登入登出

一、關機與重啟相關命令的使用 關機與重啟相關命令 命令 功能 shutdown -h now 立即關機 shutdown -h 1 1分鐘後關機 shutdown -r

Linux之旅-7Linux使用者和組的配置檔案

一、使用者(user)的配置檔案 1.1配置檔案位置 /etc/passwd 1.2作用 記錄使用者的各種資訊。 1.3檔案每行的含義 使用者名稱:口令:使用者標識號:組標識號:註釋性描述:

Linux之旅-8Linux執行級別和找回root密碼

一、Linux執行級別 在Linux系統中,我們可以開啟/etc/inittab檔案檢視,Linux共有七個執行級別(有一個級別4為保留級別)下面是檔案內容; # inittab is only u

Linux之旅-10Linux(Centos6.8)安裝Java環境(JDK)

一、下載JDK 1.1進入oracle官網,選擇需要的jdk版本,進入詳情頁 二、安裝步驟 2.1將下載的壓縮包上傳到Linux系統的/opt目錄 2.2將壓縮包解壓,使用命令:

Linux/Android開發記錄學習、記錄、分享Linux/Android開發技術

專欄達人 授予成功建立個人部落格專欄

shell命令進階Linux-shell基本操作

shell 1.萬用字元: 萬用字元: *:表示任意長度的字串,如:ls ~/* #列舉家目錄下所有檔案或子目錄 ?:表示任意一個字元,如: ls

Linux系統引導過程

*** 第一步 開機自檢 根據主機板BIOS中的啟動順序,移交系統控制權。 當你開啟計算機電源,計算機會首先載入BIOS資訊,BIOS資訊是如此的重要,以至於計算機必須在最開始就找到它。 這是因為BIOS中包含了CPU的相關資訊、裝置啟動順序資訊、硬碟資訊、記憶體資訊、時鐘資訊、PnP特性等等。在此

linux備忘筆記Linux root 從bash-3.2回到[email 

1.進入目錄 cd /etc/skel 2.顯示隱藏檔案 ls -a   .bash_logout  .bash_profile  .bashrc  拷貝這些隱藏檔案到/home  接

Linux多執行緒三個經典同步問題

在瞭解了《同步與互斥的區別 》之後,我們來看看幾個經典的執行緒同步的例子。相信通過具體場景可以讓我們學會分析和解決這類執行緒同步的問題,以便以後應用在實際的專案中。 一、生產者-消費者問題 問題描述: 一組生產者程序和一組消費者程序共享一個初始為空、大

linux學習--工具篇串列埠除錯工具

1、minicon , 下載:sudo apt-get install minicom , 介面如下: 是不是感覺和puty很像,  退出是ctrl+a , 按X或者Q 2、cutecom,圖形化的介面

Linux運維入門SonarQube和Jenkins的整合之路

安裝配置完sonar後就需要與專案在用的Jenkins進行集成了,Jenkins和Sonar整合的原理大概是這樣的,Jenkins在其外掛管理中心,下載sonar外掛並進行配置,與sonar關聯上。然後