![systemd 和蓝牙进程都使用已删除的 rfkill 文件 - 可能位于明显的完整磁盘后面](https://linux22.com/image/221846/systemd%20%E5%92%8C%E8%93%9D%E7%89%99%E8%BF%9B%E7%A8%8B%E9%83%BD%E4%BD%BF%E7%94%A8%E5%B7%B2%E5%88%A0%E9%99%A4%E7%9A%84%20rfkill%20%E6%96%87%E4%BB%B6%20-%20%E5%8F%AF%E8%83%BD%E4%BD%8D%E4%BA%8E%E6%98%8E%E6%98%BE%E7%9A%84%E5%AE%8C%E6%95%B4%E7%A3%81%E7%9B%98%E5%90%8E%E9%9D%A2.png)
我的 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 上的文件
经验教训:我应该在不安装外部驱动器的情况下检查所有内容
对于未来我已经遵循了答案这里防止写入挂载失败的目录