【ATU Book-i.MX 系列-Yocto】設定 Root 密碼及新增使用者

前言

Linux 替 root 加上密碼及新增其他的使用者,通常的作法是進到系統後,透過 useradd 及 passwd 等指令去建立使用者及密碼。

但如果每片板子都要開機到系統,然後執行指令,這會是一件非常麻煩的事情。因此本篇文章提供一個解決的方案,讓 Yocto 能在編譯階段就完成建立使用者及密碼等動作。

Yocto 設定

為了將密碼加入到 Yocto,這裡會透過設定 conf/local.conf 的方式去完成

conf/local.conf

EXTRA_USERS_PARAMS 功能必須加上 INHERIT += " extrausers" 才可以使用

Linux 是使用 hash 對密碼(明碼)進行加密並以固定的格式 $id$salt$hashed 存在 /etc/shadow

密碼格式會透過 $ 去區隔 id、salt 及 hash 值

填入 conf/local.conf 時,需要加上跳脫字元 \ ,避免編譯過程中被當成特殊符號,下方的 檢查結果 內,會有個錯誤範例

下方是修改 root 密碼的示範

INHERIT += " extrausers"
EXTRA_USERS_PARAMS = "\
usermod -p '\$6\$FIumPDif04\$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0' root; \
"

下方是新增使用者 user 的示範

INHERIT += " extrausers"
EXTRA_USERS_PARAMS = "\
useradd -p '\$6\$FIumPDif04\$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0' user; \
"

conf/local.conf 內,可以使用 usermod 去修改使用者的密碼,而 useradd 則是新增使用者及密碼,範例如下:

# 修改 root 密碼
usermod -p '$id$salt$hashed' root;

# 新增使用者 user 及密碼
useradd -p '$id$salt$hashed' user;

下方會介紹如何產生 $id$salt$hashed

Linux 使用者密碼

這邊簡單介紹一下密碼格式的內容:

  1. id
  2. salt
    • 是一個隨機字串,每次產生都會不一樣,會跟密碼一起加密成 hash 值
  3. hashed
    • 加密後的值

製作密碼的 hash 值

$id$salt$hashed 可以利用 mkpasswd 指令去建立

這邊範例的密碼為 password

$ mkpasswd -m sha512crypt --stdin <<< "password"

如果用同樣的密碼多試幾次會發現,每次的 hash 值都不相同,如下:

$ mkpasswd -m sha512crypt --stdin <<< "password"
$6$FIumPDif04$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0

$ mkpasswd -m sha512crypt --stdin <<< "password"
$6$dtWhG8iWNH.TS$sGUl8aq.3RwamUIrhRYTGEK3SRLdztfpUn8OzyRtCIeJ.DHPcuIjQe6zmt2tiOcCNl/WabWqQFualHIEqUtFz.

這也是前面有提到的,hash 值是由 salt 及 密碼一起加密而成,而 salt 是隨機字串,每次都會不同。因此,想要固定 hash 值的話,可以用 --salt 去設定 salt

$ mkpasswd -m sha512crypt --salt FIumPDif04 --stdin <<< "password"
$6$FIumPDif04$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0

執行編譯

設定完成後,重新編譯 core-image-minimal

bitbake core-image-minimal

此時,core-image-minimal 便會根據 conf/local.conf 的設定新增使用者 user 及其密碼 password,請參考上方 conf/local.conf 的範例

useradd -p '$id$salt$hashed' user;

檢查結果

以 i.MX8MP 為例,加入新使用者後,請檢查下方路徑的檔案

tmp/work/imx8mp_lpddr4_evk-poky-linux/core-image-minimal/1.0-r0/rootfs/etc/shadow

可以看到 user 已經被加入 Yocto 的 /etc/shadow 了,其 $id$salt$hashed mkpasswd 產生的也是相同的

root::15069:0:99999:7:::
daemon:*:15069:0:99999:7:::
bin:*:15069:0:99999:7:::
sys:*:15069:0:99999:7:::
sync:*:15069:0:99999:7:::
games:*:15069:0:99999:7:::
man:*:15069:0:99999:7:::
lp:*:15069:0:99999:7:::
mail:*:15069:0:99999:7:::
news:*:15069:0:99999:7:::
uucp:*:15069:0:99999:7:::
proxy:*:15069:0:99999:7:::
www-data:*:15069:0:99999:7:::
backup:*:15069:0:99999:7:::
list:*:15069:0:99999:7:::
irc:*:15069:0:99999:7:::
gnats:*:15069:0:99999:7:::
systemd-bus-proxy:!:15069:0:99999:7:::
systemd-timesync:!:15069:0:99999:7:::
systemd-resolve:!:15069:0:99999:7:::
systemd-network:!:15069:0:99999:7:::
messagebus:!:15069:0:99999:7:::
_apt:!:15069:0:99999:7:::
user:$6$FIumPDif04$LdFmxWbmmV68cLSDqpryllQvMr6CkIF9DYudcd4AgfJpfZ1BA3Ls3nulh2kOXv/F3OboputiaxPi3WkTZ5j3M0:15069:0:99999:7:::
nobody:*:15069:0:99999:7:::

錯誤範例

如果沒有使用跳脫字元的話,會導致整個密碼格式錯誤

user:/F3OboputiaxPi3WkTZ5j3M0:15069:0:99999:7:::

進入系統測試

完成燒錄後,即可進到系統檢查新使用者及密碼是否可以登入

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

參考來源

評論