Yocto Hardknott版本useradd添加用户失败问题求助
Yocto Hardknott版本添加用户失败问题分析与解决
问题原因分析
从日志useradd: listing attributes of /etc/skel/.bashrc: No data available可以定位核心问题,结合你的配方细节,原因如下:
- useradd类执行时机冲突:useradd类在
do_prepare_recipe_sysroot阶段运行,此时系统rootfs的基础结构尚未构建完成,/etc/skel这类由base-files包提供的目录还未被同步到sysroot中。而useradd创建带家目录的用户时,默认会尝试从/etc/skel复制配置文件(如.bashrc),找不到文件就会报错退出。 - USERADD_PARAM参数格式错误:配方中
USERADD_PARAM_${PN} = "--user nfi --password nfi --create-home --groups sudo"不符合useradd命令语法,正确格式是useradd [选项] 用户名,--user并非合法选项,需将用户名放在参数末尾。 - 两类用户管理类混用:useradd和extrausers类的执行阶段、作用逻辑不同,混用容易导致时序或逻辑冲突。
解决方案
优先推荐使用extrausers类完成用户配置,它在rootfs构建后期执行,此时基础文件系统已完备,不会出现依赖缺失问题。修改后的配方如下:
DESCRIPTION = "Add a new user 'nfi' with sudo privileges and change root password" LICENSE = "CLOSED" # 仅继承extrausers类即可 inherit extrausers # 配置组、用户与密码(使用加密密码避免明文风险) EXTRA_USERS_PARAMS = "\ groupadd -f sudo; \ useradd -m -d /home/nfi -G sudo -p $(openssl passwd -1 nfi) nfi; \ usermod -p $(openssl passwd -1 toor) root; \ " do_install() { echo 'nfi ALL=(ALL) NOPASSWD:ALL' >> ${D}${sysconfdir}/sudoers.d/nfi # 必须设置正确权限,否则sudo会拒绝加载该配置 chmod 0440 ${D}${sysconfdir}/sudoers.d/nfi } FILES_${PN} += "${sysconfdir}/sudoers.d"
关键修改说明
- 移除useradd类,仅保留extrausers类,规避时序冲突。
- 在
EXTRA_USERS_PARAMS中直接调用标准useradd命令,参数说明:-m:自动创建用户家目录-d /home/nfi:指定家目录路径-G sudo:将用户添加到sudo组-p $(openssl passwd -1 nfi):生成SHA-1加密密码,替代明文密码
- 添加
chmod 0440确保sudoers配置文件权限符合要求,避免sudo忽略该规则。
如果一定要使用useradd类,需做以下调整:
- 添加依赖确保sysroot中存在/etc/skel:
DEPENDS += "base-files" - 修正USERADD_PARAM格式:
USERADD_PARAM_${PN} = "-m -d /home/nfi -G sudo -p nfi nfi"
但这种方式仍可能因sysroot构建时序出现异常,因此优先推荐extrausers方案。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

