1

我使用 ext4 作为我的根文件系统。我正在使用 OpenWRT Chaos Calmer。当我更改密码时,有时会看到以下错误:

root@US16SIQC:~# passwd 
Changing password for root
New password: 
Bad password: too short
Retype password: 

passwd: can't create '/etc/passwd+': File exists
passwd: can't update password file /etc/passwd

这些事情只是有时会发生。解决方法是什么?

每当我更改 passwd 时,它都会创建 passwd+ 和 passwd- 文件。我不知道 passwd+ 文件被复制到 passwd 文件中,而 passwd- 是一个备份文件。所以当第一个错误出现时,这个文件仍然存在。

请帮助解决这个问题。提前致谢!!

[编辑]:我修复了只读文件系统问题,但仍然看到问题。

重现步骤:

  1. 更改密码(密码更改成功)
  2. 观察里面没有passwd+文件/etc
  3. 进行硬电源重启
  4. 观察到passwd+存在于/etc
  5. 现在我无法更改它,除非我删除passwd+文件

这仅通过硬重启发生,而不是通过软重启发生。

我正在使用基于 imx6dl 的定制板和 eMMC 闪存,其中包含两个分区 - 一个vfat(zImage and dtb)和另一个etx4(rootfs)

4

3 回答 3

1

我有同样的问题。我无法为root设置密码。该文件是只读的。系统启动时有一些安装错误日志。通过重新安装 OpenWRT 解决了问题。显然,这是一个文件系统问题。

于 2018-02-16T20:41:52.843 回答
0

OpenWRT 没有正确安装。

通常,当覆盖文件系统未正确初始化时会发生这种情况。

root@OpenWrt:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                     320       232        88  73% /
/dev/root                 2560      2560         0 100% /rom
tmpfs                    14504        96     14408   1% /tmp
/dev/mtdblock3             320       232        88  73% /overlay
overlayfs:/overlay         320       232        88  73% /
tmpfs                      512         0       512   0% /dev

如果您dfroot提示符下运行,您应该会看到overlays:/overlay文件系统安装在/.

可能的原因之一是尝试安装比闪存更大的映像。或者,可能安装后的重新启动被中断。

于 2017-01-23T12:41:04.637 回答
0

我在不同的嵌入式 linux 系统上遇到了同样的行为。我发现通过重置密码并立即重启电源,问题会突然出现。

查看busybox的实现,我发现该/etc/passwd+文件是新更改的临时文件。成功写入新更改后,将其移回/etc/passwd

因此, 的存在/etc/passwd+表明先前的迭代以某种方式失败,要么是在可以移动(或删除)之前进行电源循环,要么是某种文件系统错误(在嵌入式系统上可能会发生很多情况,例如电源故障,完整的文件系统、损坏的 NAND 闪存、过热等)

如果文件已经存在,busybox 实现会出错:

libbb/update_passwd.c

123     /* Try to create "/etc/passwd+". Wait if it exists. */
124     i = 30;
125     do {
126         // FIXME: on last iteration try w/o O_EXCL but with O_TRUNC?
127         new_fd = open(fnamesfx, O_WRONLY|O_CREAT|O_EXCL, 0600);
128         if (new_fd >= 0) goto created;
129         if (errno != EEXIST) break;
130         usleep(100000); /* 0.1 sec */
131     } while (--i);
132     bb_perror_msg("can't create '%s'", fnamesfx);
133     goto close_old_fp;
于 2018-04-24T21:05:37.853 回答