systemd 和蓝牙进程都使用已删除的 rfkill 文件 - 可能位于明显的完整磁盘后面

systemd 和蓝牙进程都使用已删除的 rfkill 文件 - 可能位于明显的完整磁盘后面

我的 ASUS Tinkerboard (Debian 10) 上的 systemd 和蓝牙进程都在利用已删除的rfkill文件。我怀疑这可能是检查时存储显示为 100% 已满的原因df -h

如何恢复有效rfkill文件或停止正在使用此已删除文件的进程?

我无法删除并重新安装rfkill,因为我收到此错误(磁盘已满,删除的文件正在使用中):

dpkg: unrecoverable fatal error, aborting:
 unable to fill /var/lib/dpkg/updates/tmp.i with padding: No space left on device

停止进程的替代方法对于蓝牙来说很容易,但是 systemd 是一个核心进程(它的 pid 号为 1),我无法想象如何做到这一点:

lsof +L1
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NLINK NODE NAME
systemd   1 root   89u   CHR 10,242      0t0     0 1171 /dev/rfkill (deleted)

磁盘为 16GB,显示已满df -h,但du -kx / | sort -rn | less仅显示 3.5GB。以下是大约前 50 行:

3455876 /
2498820 /usr
1174128 /usr/lib
1054352 /usr/share
806276  /usr/lib/aarch64-linux-gnu
556544  /var
247288  /var/cache
238792  /var/cache/apt
225056  /usr/share/locale
198740  /home
198736  /home/linaro
190568  /usr/share/doc
187660  /usr/lib/aarch64-linux-gnu/dri
183944  /usr/bin
179352  /var/lib
177304  /var/cache/apt/archives
148316  /home/linaro/.cache
147356  /home/linaro/.cache/chromium
147352  /home/linaro/.cache/chromium/Default
146584  /home/linaro/.cache/chromium/Default/Code Cache
146564  /home/linaro/.cache/chromium/Default/Code Cache/js
122204  /var/lib/apt
122132  /var/lib/apt/lists
112628  /usr/share/fonts
104228  /var/log
102284  /lib
84692   /usr/share/fonts/truetype
77888   /usr/share/icons
74312   /usr/share/emacs
74264   /usr/share/emacs/26.1
73184   /usr/lib/python2.7
72984   /usr/lib/gcc
72980   /usr/lib/gcc/aarch64-linux-gnu
72976   /usr/lib/gcc/aarch64-linux-gnu/8
65860   /usr/lib/python3
65856   /usr/lib/python3/dist-packages
59900   /usr/share/emacs/26.1/lisp
56344   /lib/modules
56340   /lib/modules/4.19.193
56240   /lib/modules/4.19.193/kernel
56236   /lib/modules/4.19.193/kernel/drivers
54708   /lib/modules/4.19.193/kernel/drivers/net
54704   /lib/modules/4.19.193/kernel/drivers/net/wireless
52280   /usr/lib/python2.7/config-aarch64-linux-gnu
50100   /home/linaro/.config
49876   /home/linaro/.config/chromium
48744   /usr/include
48280   /usr/share/scratch
44276   /var/lib/dpkg
41632   /usr/share/icons/Adwaita
41396   /var/lib/dpkg/info
41316   /home/linaro/.config/chromium/Default
40312   /usr/lib/python3/dist-packages/scipy
39964   /lib/modules/4.19.193/kernel/drivers/net/wireless/rockchip_wlan
39952   /usr/lib/python3.7
37324   /usr/share/fonts/truetype/arphic
35040   /home/linaro/.config/chromium/Default/Service Worker

答案1

/dev/rfkill应该是字符设备,而不是常规文件。因此,它实际上不会导致磁盘变满,除非它首先(错误地)被常规文件替换。您的lsof +L1结果还表明正在systemd使用正确的/dev/rfkill设备节点: TYPECHR和 DEVICE10,242就像真正完整的一样/dev/rfkill

ls -l /dev/rfkill
crw-rw-r-- 1 root netdev 10, 242 Jun 14 20:59 /dev/rfkill

请注意,c第一个字符表示这不是常规文件,而是一个字符设备节点,以及主要和次要设备号(分别为 10 和 242)代替文件大小 - 因为设备节点本质上只是一个目录条目,所以它没有有意义的大小。这些数字告诉内核该设备节点应该与哪个内核设备驱动程序通信。

Linux 内核文档中的设备节点号列表可以告诉我们这/dev/rfkill应该是一个主设备 10 和次设备 242 的字符设备节点。

您可以重新创建已删除的/dev/rfkill 设备节点非常简单,以 root 身份使用两个命令:

mknod -m 664 /dev/rfkill c 10 242
chgrp netdev /dev/rfkill

(RAM 中的所有内容/dev都不在任何实际磁盘上:它们会在每次启动时重新创建。)

另一方面,如果/usr/sbin/rfkill 命令已被删除,需要dpkg重新安装。但如果您的磁盘已 100% 满,则必须先腾出一些可用磁盘空间才能执行此操作。

您是否lsof +L1指出任何其他已删除但仍在使用的文件(类型REG=常规文件)?

如果您可以轻松地从 Debian 存储库重新下载内容,那么运行apt-get clean可以是快速获得一些可用空间的简单方法:它将清除下载的软件包的本地缓存,而不影响任何已安装的软件。

答案2

将 Tinkerboard 2S 的根移动到 Micro SD 而不是内置 eMMC 并设置镜像系统后,我注意到有近 12GB 的文件本应位于已安装的驱动器上,而不是位于 eMMC 本身上

挂载显然在某个时候失败了,下载软件没有注意到这一点,因此将文件保存到本地存储而不是远程挂载

我之所以注意到这一点,是因为我已将挂载移动到 Micro SD 卡,只留下了本地保存在 eMMC 上的文件

经验教训:我应该在不安装外部驱动器的情况下检查所有内容

对于未来我已经遵循了答案这里防止写入挂载失败的目录

相关内容