【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次,发文人进小黑屋喔~

评论