当您升级或重新安装一个包dpkg
(以及最终使用它的任何东西,如 apt-get 等)时,它会通过在替换之前创建文件的硬链接来备份现有文件。这样,如果解包失败,它可以轻松地放回现有文件。这很棒,因为它可以保护操作系统免受 Bad Things™ 的影响。
除了...它仅在您的文件系统支持硬链接时才有效。并非所有文件系统都如此——例如 FAT 文件系统。
我正在为特定的嵌入式 ARM 平台开发 Debian 发行版,并且引导环境要求某些文件(包括内核)位于 FAT 文件系统上,以便引导代码能够定位和加载它们。
当您升级内核包(或在该 FAT 分区中有文件的任何其他包)时,安装失败:
dpkg: error processing archive linux-image3.18.11+_3.18.11.2.armadillian_armhf.deb (--install):
unable to make backup link of `./boot/vmlinuz-3.18.11+' before installing new version: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
并且整个升级失败。
我在网上搜索过,我能找到的唯一参考是在进行特定升级时遇到特定问题的特定人员,其答案通常是“删除 /boot/vmlinuz-3.18.11+ 并重试”,是的,那个解决了那个特定的问题。
但这不是我的答案。我是 OS 分销商,而不是 OS 用户,因此我需要一种解决此问题的方法,该方法不涉及最终用户在升级之前手动删除其内核文件。我需要一种方法来告诉 dpkg 对 /boot 上的文件(或所有我关心的所有文件,尽管这会减慢升级操作的速度)“复制,而不是硬链接”,或者更好的是“如果硬链接失败,不要抱怨,只需复制它”。
我已经尝试过诸如--force-unsafe-io
甚至--force-all
标志 之类的事情dpkg
,但没有任何效果。
我正在尝试将虚拟 PTY 与接受端口 23 上的 TCP 连接的远程设备链接。目标设备上套接字的打开和关闭是一个重要事件,也是设备操作的一部分。
我目前正在尝试使用socat
以下方法来完成这项工作:
socat pty,link=/dev/ttyACM99,raw tcp:192.168.0.15:23
Run Code Online (Sandbox Code Playgroud)
它可以工作,因为我可以打开/dev/ttyACM99
设备并读取/写入数据 - 但是一旦socat
运行命令,TCP 端口就会打开,并且仅在socat
终止时才会关闭。
我需要的是 TCP 端口只有在其他软件(什么不重要)打开后才打开/dev/ttyACM99
。当/dev/ttyACM99
关闭时,TCP 连接应该断开。
我在手册页或谷歌搜索中找不到任何东西socat
(尽管用谷歌搜索是一件相当棘手的事情),说这甚至可以用socat
,而且我真的不想去麻烦地编写自己的东西管道程序(尽管如果我真的需要的话我可以)。
更新:
我找到了wait-slave
PTY 管道的参数,它可以完成我想要的操作 - 但它现在socat
在关闭 PTY 时终止,这远非理想。
socat pty,link=/dev/ttyACM99,raw,wait-slave tcp:192.168.0.15:23
Run Code Online (Sandbox Code Playgroud)
是否有类似wait-slave
或 之类的选项可以与之配合wait-slave
,仅关闭目标套接字而不是关闭整个程序?目前我正在运行它,while 'true'
目前看来可行,但并不理想。