论坛的md编辑器格式样式有问题,本地看好好的,发上去就变了,附件是原始的md文件
顺便说一下,磐石已经关闭了
磐石系统主要保护的是 /usr、/bin、/lib 这类系统核心目录,用户自己的家目录 /home 是不在保护范围的。
你的家目录 /home 只读,更可能是你自己做了什么特殊配置或遇到了其它异常导致的。
你上面的 adb 报错 Read-only file system,原因是你把 adb 程序放在了 /home/Run/tools/... 这个路径下,而这个路径正常的deepin用户也是没有权限的哦,你需要放到你自己的用户目录下,是用户目录才有权限(/home/用户名/),/home 目录下普通用户是没有权限操作的。当然,如果你的用户名是 Run 的话,那就需要看看是不是做了什么特别的配置了。
你上面列出的MTP报错很多只是 dde 文件管理器已知的噪音日志。
Deepin 的磐石系统并不会妨碍 Android 手机的正常 USB 连接和 adb 使用,毕竟我就经常使用,你那个应该只是把 adb 放在了一个特殊且不可写的位置(/home目录)也有可能存在其它系统可能的异常状态,才导致了现在的现象。
跟磐石没啥关系,adb是走/dev和网络的。
70 31 259:4 / /home rw,relatime shared:66 - ext4 /dev/nvme0n1p4 rw
正常情况下应该是rw的(磐石开启状态)

磐石系统主要保护的是 /usr、/bin、/lib 这类系统核心目录,用户自己的家目录 /home 是不在保护范围的。
你的家目录 /home 只读,更可能是你自己做了什么特殊配置或遇到了其它异常导致的。
你上面的 adb 报错 Read-only file system,原因是你把 adb 程序放在了 /home/Run/tools/... 这个路径下,而这个路径正常的deepin用户也是没有权限的哦,你需要放到你自己的用户目录下,是用户目录才有权限(/home/用户名/),/home 目录下普通用户是没有权限操作的。当然,如果你的用户名是 Run 的话,那就需要看看是不是做了什么特别的配置了。
你上面列出的MTP报错很多只是 dde 文件管理器已知的噪音日志。
Deepin 的磐石系统并不会妨碍 Android 手机的正常 USB 连接和 adb 使用,毕竟我就经常使用,你那个应该只是把 adb 放在了一个特殊且不可写的位置(/home目录)也有可能存在其它系统可能的异常状态,才导致了现在的现象。
-
Run 确实是用户名
-
偶发这种情况,发生这种情况 和 未发生这种情况的时候,ls -l 命令看都是有权限的,一直是如下:
Run@Run-PC:~/tools/Android-SDK/platform-tools$ ls -l 总计 20232 -rwxrwxr-x 1 Run Run 10642368 7月25日 15:06 adb -rwxrwxr-x 1 Run Run 302096 7月25日 15:06 etc1tool -rwxrwxr-x 1 Run Run 3333552 7月25日 15:06 fastboot -rwxrwxr-x 1 Run Run 13632 7月25日 15:06 hprof-conv drwxrwxr-x 2 Run Run 4096 7月25日 15:06 lib64 -rwxrwxr-x 1 Run Run 284120 7月25日 15:06 make_f2fs -rwxrwxr-x 1 Run Run 284104 7月25日 15:06 make_f2fs_casefold -rwxrwxr-x 1 Run Run 1008464 7月25日 15:06 mke2fs -rw-rw-r-- 1 Run Run 1157 7月25日 15:06 mke2fs.conf -rw-rw-r-- 1 Run Run 1175837 7月25日 15:06 NOTICE.txt -rw-rw-r-- 1 Run Run 18656 9月 6日 15:26 package.xml -rw-rw-r-- 1 Run Run 38 7月25日 15:06 source.properties -rwxrwxr-x 1 Run Run 3618896 7月25日 15:06 sqlite3 Run@Run-PC:~/tools/Android-SDK/platform-tools$ cd .. Run@Run-PC:~/tools/Android-SDK$ ls -l 总计 40 drwxrwxr-x 6 Run Run 4096 7月28日 09:50 build-tools drwxrwxr-x 3 Run Run 4096 9月 6日 15:19 cmake drwxrwxr-x 3 Run Run 4096 9月 6日 15:19 cmdline-tools drwxrwxr-x 9 Run Run 4096 7月25日 15:07 emulator drwxrwxr-x 3 Run Run 4096 7月31日 15:51 fonts drwxrwxr-x 2 Run Run 4096 7月25日 15:06 licenses drwxrwxr-x 5 Run Run 4096 9月 6日 15:26 ndk drwxrwxr-x 5 Run Run 4096 7月28日 09:52 platforms drwxrwxr-x 3 Run Run 4096 7月25日 15:06 platform-tools drwxrwxr-x 3 Run Run 4096 7月25日 15:06 sources
70 31 259:4 / /home rw,relatime shared:66 - ext4 /dev/nvme0n1p4 rw
正常情况下应该是rw的(磐石开启状态)

偶发的,找deepseek帮忙查,给出这个结论,但是我用 ls -l 的命令 ,返回都是 rwx的
-
Run 确实是用户名
-
偶发这种情况,发生这种情况 和 未发生这种情况的时候,ls -l 命令看都是有权限的,一直是如下:
Run@Run-PC:~/tools/Android-SDK/platform-tools$ ls -l 总计 20232 -rwxrwxr-x 1 Run Run 10642368 7月25日 15:06 adb -rwxrwxr-x 1 Run Run 302096 7月25日 15:06 etc1tool -rwxrwxr-x 1 Run Run 3333552 7月25日 15:06 fastboot -rwxrwxr-x 1 Run Run 13632 7月25日 15:06 hprof-conv drwxrwxr-x 2 Run Run 4096 7月25日 15:06 lib64 -rwxrwxr-x 1 Run Run 284120 7月25日 15:06 make_f2fs -rwxrwxr-x 1 Run Run 284104 7月25日 15:06 make_f2fs_casefold -rwxrwxr-x 1 Run Run 1008464 7月25日 15:06 mke2fs -rw-rw-r-- 1 Run Run 1157 7月25日 15:06 mke2fs.conf -rw-rw-r-- 1 Run Run 1175837 7月25日 15:06 NOTICE.txt -rw-rw-r-- 1 Run Run 18656 9月 6日 15:26 package.xml -rw-rw-r-- 1 Run Run 38 7月25日 15:06 source.properties -rwxrwxr-x 1 Run Run 3618896 7月25日 15:06 sqlite3 Run@Run-PC:~/tools/Android-SDK/platform-tools$ cd .. Run@Run-PC:~/tools/Android-SDK$ ls -l 总计 40 drwxrwxr-x 6 Run Run 4096 7月28日 09:50 build-tools drwxrwxr-x 3 Run Run 4096 9月 6日 15:19 cmake drwxrwxr-x 3 Run Run 4096 9月 6日 15:19 cmdline-tools drwxrwxr-x 9 Run Run 4096 7月25日 15:07 emulator drwxrwxr-x 3 Run Run 4096 7月31日 15:51 fonts drwxrwxr-x 2 Run Run 4096 7月25日 15:06 licenses drwxrwxr-x 5 Run Run 4096 9月 6日 15:26 ndk drwxrwxr-x 5 Run Run 4096 7月28日 09:52 platforms drwxrwxr-x 3 Run Run 4096 7月25日 15:06 platform-tools drwxrwxr-x 3 Run Run 4096 7月25日 15:06 sources
不是文件权限(rwx)问题,而是文件系统层面的可写性问题。
在 Linux 里,ls -l 显示的 rwxrwxr-x 只是权限位,它和“这个目录当前是否以 ro 挂载”是两回事,一个目录的权限位可以是 rwx,但所在文件系统如果被 mount -o ro 挂载,此时写入会返回 EROFS(Read-only file system)。
但是吧,只凭现在的信息继续下去,大家也只能是猜各种可能性。
你可以在报错时,执行下面的命令,然后将结果和现象贴给小U同学,它会帮你解决的(毕竟它能直接看到你的本机系统环境)。
findmnt -T /home
findmnt -T /home/Run/tools/Android-SDK/platform-tools
论坛帖《Android 手机 USB 连接反复报错,疑似 ostree 只读根导致 adb 无法写》——本机基线对比复核报告
| 项 | 内容 |
|---|---|
| 被复核对象 | https://bbs.deepin.org.cn/post/302877(作者 TofloorGo,2026-11-08,Deepin 25 / 6.18.48-amd64-desktop-rolling / ostree=auto) |
| 本机 | Deepin 25,内核6.18.48-amd64-desktop-rolling(与帖子同一内核构建串),ostree=auto |
| 复核时间 | 2026-11-09 11:02–11:15(Asia/Shanghai) |
| 方法与口径 | 命令实际运行在Linglong 沙箱容器内。因此"本机主机"事实一律取自:主机 PID 1 的 /proc/1/mountinfo、主机 systemd D-Bus、主机 /etc/fstab、主机 udev / dpkg 数据库、AOSP adb 源码 + 本机 adb 实测 |
| 写入范围 | 仅写本工作区:本报告 +evidence/ 两份证据。未修改主机任何文件 |
0. 结论摘要(先看这里)
一句话:这台机器不存在帖子描述的任何故障。帖子把"取证终端所处的只读沙箱/命名空间"当成了"整个系统被 ostree 挂成只读",由此推出的 adb 因果链在技术上不成立。
| # | 帖子的核心主张 | 判定 | 一句话理由 |
|---|---|---|---|
| 1 | 磐石/ostree 不可变根使 / 与 /home 都变成只读 |
不成立(本机反证) | 同内核、同 ostree=auto、磐石处于激活态的本机上,/ 是 xfs rw、/home 是 ext4 rw;全局只有 /usr 与三个 ostree 仓库挂载是 ro |
| 2 | "fstab 说 rw、systemd 说 rw、实际却 ro"三处互相矛盾 | 本机不存在该矛盾 | 本机 fstab / systemd / 内核 mountinfo三方一致 rw。该矛盾组合是"整树只读 bind + 独立 mount 命名空间"的指纹,不是发行版默认行为 |
| 3 | adb: main.cpp:238 failed to write server path to …/adb: Read-only file system 说明 adb 写不进自己的目录 |
字符串真实,解读错误 | 该串是 AOSP 真实代码;但打印的路径是 /proc/self/exe(adb 二进制自身),真正写失败的是 $HOME/.android/adb.,且这是非致命 PLOG(ERROR) |
| 4 | 只读根 → adb 状态写不进 → USB transport 重建失败 → USB 掉线 | 因果链断裂 | USB 枚举由 adb 每 1 秒轮询 /dev/bus/usb 完成,与 $HOME 无关;adb. 写失败无功能影响,adbkey 失败只导致 unauthorized(设备仍在列表) |
| 5 | sudo: /etc/sudo.conf is owned by uid 65534 + no new privileges 是 ro /etc 导致 |
因果错误 | ro 挂载不会改变 inode 属主;65534 是 root 未映射的用户命名空间溢出 uid,no_new_privs 是容器标志。本机这份健康系统在沙箱内同样显示 65534 |
| 6 | 作者环境里 /、/home、/opt、/etc、/run/user/1000 同时只读 |
唯一真实异常,但不在本机 | 本机这些路径全部 rw;/tmp、/dev/shm rw 而其余全 ro 的组合,最可能是只读 bind 沙箱,而非磁盘/文件系统故障 |
本机与帖子的软件栈高度重合(同内核构建、同 dde/MTP 四包版本、同为
ostree=auto部署),但磁盘布局不同(本机/为 xfs、/home在 nvme0n1p4,而帖子/为 ext4、/home在 nvme1n1p1)。因此下文"不一致"的含义是本机基线不呈现该现象,并不等于"帖子那台机器上不可能出现"。
1. 帖子在说什么
现象:华为 STK-AL00(Android 10)插 USB 后,文件管理器 MTP 偶发掉挂载并持续刷 dde 报错;adb devices 有时只剩 192.168.238.25:5555(WiFi),USB 行消失;日志反复出现 failed to write server path to …/platform-tools/adb: Read-only file system。
作者的证据链:
- 排除硬件:
lsusb稳定显示12d1:107e,三个接口齐全(ADBff/ff/00、Mass Storage08/06/50→sr0、MTPff/42/01);恢复后连跑 30 次命令全通过。 findmnt -T /→/为 ext4nvme0n1p3、ro;findmnt -T /home→ ext4nvme1n1p1、ro。- 但
/etc/fstab写的是rw,systemctl show home.mount的Options=rw、Result=success→ "三处证据互相矛盾"。 - ext4
errors_count=0排除内核 remount-ro;无/.dockerenv、/run/.containerenv排除容器。 - mountinfo 显示
/usr、/opt、/etc都是 ro overlay,lowerdir 指向/root/ostree/deploy/deepin,upperdir 在/root/persistent/overlay/…;/与/home的挂载点 ro 但底层 superblock rw;/run/user/1000亦 ro;/tmp、/dev/shmrw。 ostree admin status报fstatat(boot/loader): 权限不够;/proc/cmdline含ostree=auto。- 结论:ostree 只读根导致 adb 无法在运行期落盘运行态 → USB 通道重建失败 → 表现为 USB 掉线。
- 另一异常:
sudo: /etc/sudo.conf is owned by uid 65534+no new privileges,sudo 不可用,疑为 ro/etc元数据异常。
回帖:
- #2 作者补充:"顺便说一下,磐石已经关闭了"。
- #3 Feelup:磐石只保护
/usr、/bin、/lib,/home不在保护范围;adb被放在/home/Run/tools/...才是问题;MTP 那些日志是 dde 已知噪音。 - #4 neko:跟磐石没关系,adb 走
/dev和网络。 - #5 neko:贴出自己的
/home为rw,relatime shared:66 - ext4 /dev/nvme0n1p4 rw,"正常情况下应该是 rw(磐石开启状态)"。
2. 取证口径:为什么不能直接采信容器里的 findmnt
本机命令跑在 Linglong 沙箱里,容器自己的挂载视图就是只读 overlay 的根:
$ findmnt -T /
/ overlay ro,relatime,lowerdir=/var/lib/linglong/cache/…,upperdir=/run/user/1000/linglong/…
$ findmnt -T /home
/home tmpfs tmpfs rw,nosuid,nodev,relatime,mode=700,uid=1000,gid=1000
如果据此下结论,就会得到"本机 / 只读"的错误答案。所以本报告改用四个互不依赖的主机侧来源:
| 来源 | 命令 / 路径 | 作用 |
|---|---|---|
| A 主机 PID 1 视图 | /run/host/rootfs/proc/1/mountinfo(PID 1 = /sbin/init splash,与容器 PID 1 不同 inode) |
内核真身的挂载选项与 superblock |
| B 主机 systemd | gdbus ... org.freedesktop.systemd1.Mount Options/Result(DBUS_SYSTEM_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket) |
挂载单元配置与实际结果 |
| C 主机 fstab / udev / dpkg | /run/host/rootfs/etc/fstab、/run/udev/data、/var/lib/dpkg/status |
配置意图、分区类型、软件版本 |
| D 源码 + 实测 | AOSP packages/modules/adb 源码 + 本机运行 adb 二进制 |
判定报错语义与 USB 机制 |
容器只是观测工具,不是观测对象。主机根文件系统以只读方式挂在
/run/host/rootfs,本次复核未向其写入任何内容。
3. 本机真实基线
3.1 系统身份(与帖子一致性高)
| 项 | 本机 | 帖子 | 判定 |
|---|---|---|---|
| 发行版 | Deepin 25(crimson) | Deepin 25 | 一致 |
| 内核 | 6.18.48-amd64-desktop-rolling |
同 | 完全一致 |
| 启动参数 | … ostree=auto … |
同 | 完全一致 |
| 磐石组件 | deepin-immutable-boot/-ctl 1.0.39、ostree 2024.6-1deepin12 |
未列 | 本机可查 |
磐石处于激活态(不是"只装未用"):ostree=auto;/run/ostree-booted 存在(内容 sysroot-ro);/usr 为 ro overlay;/ostree/deploy/deepin/deploy/ 下有两个部署;每个开机执行 deepin-immutable-ctl admin deploy --auto-refresh --wait-boot(最近一次 2026-11-09 11:02:41)。
说明:
/etc/deepin-immutable-ctl/writable.json里enable:false是**"可写模式"开关**(对应deepin-immutable-writable的writable enable/disable),不代表磐石被关闭。磐石是否生效以 ro/usr+ ostree 启动 + 开机自动部署为准。
3.2 挂载基线(主机 PID 1 内核视图)
| 挂载点 | 设备/源 | 类型 | 实际选项 | 读/写 |
|---|---|---|---|---|
/ |
/dev/nvme0n1p3 |
xfs | rw,relatime,inode64,… |
rw |
/home |
/dev/nvme0n1p4 |
ext4 | rw,relatime |
rw |
/usr |
usr-overlay(lowerdir /root/ostree/deploy/deepin/…) |
overlay | ro,relatime |
ro |
/etc |
etc-overlay(upperdir /root/persistent/overlay/…) |
overlay | rw,relatime |
rw |
/opt |
opt-overlay |
overlay | rw,relatime |
rw |
/var |
nvme0n1p3:/persistent/var |
xfs | rw,relatime |
rw |
/boot/efi |
/dev/nvme0n1p1 |
vfat | rw,relatime |
rw |
/tmp、/dev/shm、/run/user/1000 |
tmpfs | tmpfs | rw |
rw |
/ostree、/sysroot/ostree、/persistent/ostree |
nvme0n1p3 子目录 |
xfs | ro,relatime |
ro |
原始关键两行:
31 1 259:3 / / rw,relatime shared:1 - xfs /dev/nvme0n1p3 rw,inode64,logbufs=8,logbsize=32k,noquota
70 31 259:4 / /home rw,relatime shared:66 - ext4 /dev/nvme0n1p4 rw
全机唯一被标 ro 的挂载只有 4 条:/usr、/ostree、/sysroot/ostree、/persistent/ostree。
主机 systemd 独立复核(与 mountinfo 一致):
-.mount Options=rw,relatime,inode64,… Result=success
home.mount Options=rw,relatime Result=success
usr.mount Options=ro,relatime,lowerdir=/root/ostree/deploy/deepin/…,upperdir=/root/persistent/overlay/…
etc.mount Options=rw,relatime,lowerdir=… opt.mount Options=rw,…
三方一致性:fstab xfs rw / ext4 rw /home = systemd Options=rw + Result=success = 内核 mountinfo rw。帖子所说"三处矛盾"在本机一个都不存在。 另外 home.mount 是由 fstab generator 生成(/run/systemd/generator/home.mount),/etc/systemd/system/home.mount 不存在 —— 没有"systemd 偷偷改成 ro"的痕迹。
3.3 磁盘布局(与帖子不同)
| 分区 | 大小 | 标签 | 文件系统 | 本机用途 |
|---|---|---|---|---|
| nvme0n1p1 | 300 MiB | EFI | vfat | /boot/efi |
| nvme0n1p2 | 16 GiB | SWAP | swap | — |
| nvme0n1p3 | 49.2 GiB | Roota | xfs | / |
| nvme0n1p4 | 411 GiB | _dde_data | ext4 | /home |
| nvme1n1p1 | 100 MiB | SYSTEM | vfat | 未挂载(Windows ESP) |
| nvme1n1p3 | 945 GiB | OS | ntfs | /media/master/OS1 |
| nvme1n1p4 | 8.3 GiB | Recovery | ntfs | 未挂载 |
关键点:帖子称 /home 在 /dev/nvme1n1p1,而本机该分区是 100 MiB vfat 的 Windows ESP,物理上承载不了 /home。本机与帖子不是同一块盘的同一个装法,所以两者的"目录级结论"只能做机制对照,不能做逐字节对照。
3.4 adb / USB / dde / sudo 基线
| 项 | 本机 | 帖子 | 判定 |
|---|---|---|---|
| adb 来源 | 发行版包 adb 1:34.0.5-12deepin1(源包 android-platform-tools) |
自建 SDK 37.0.1-15733141 |
本机是包 |
| adb 路径 | /usr/bin/adb → ../lib/android-sdk/platform-tools/adb(在 ro 的 /usr 上) |
/home/Run/tools/Android-SDK/platform-tools/adb,称 /usr/bin/adb 不存在 |
本机相反 |
| adb 版本串 | Android Debug Bridge version 1.0.41 / 34.0.5-debian |
1.0.41 / 37.0.1 |
1.0.41 是硬编码 ADB_SERVER_VERSION 41,不能证明自建 |
| udev 规则 | android-udev-rules 0~20250314+ds-5,/usr/lib/udev/rules.d/51-android.rules(含 12d1 华为分支) |
未提 | 本机齐备 |
| USB 设备现状 | 仅鼠标 1c4f:0034、蓝牙 8087:0032、摄像头 1bcf:2ced;无任何 12d1 |
有 12d1:107e | 本机无手机,无法做设备侧验证 |
| adb 状态目录 | ~/.android/adb.5037(内容=/usr/lib/android-sdk/platform-tools/adb)、adbkey、adbkey.pub |
声称写不进 ~/.android |
本机该目录可写、文件齐全 |
| dde-file-manager | 6.6.3 | 6.6.3 | 完全一致 |
| dde-file-manager-services-plugins | 6.6.3 | 6.6.3 | 完全一致 |
| gvfs-backends | 1.54.2-2deepin3 | 1.54.2-2deepin3 | 完全一致 |
| libmtp9 | 1.1.21-3.1deepin1 | 1.1.21-3.1deepin1 | 完全一致 |
| sudo | 1.9.16p2-3deepin3,/usr/bin/sudo 4755,/etc/sudoers 440 |
报 owned by uid 65534 | 本机健康 |
旁证:本机 journal 里同样存在帖子引用的 dde 噪音(无手机接入时也刷):
11月 06 09:30:51 X16D dde-file-manager-daemon[…]: UDisksObject is not valid for "/org/freedesktop/UDisks2/block_devices/sr0"
11月 06 09:30:51 X16D dde-shell[…]: UDisksObject is not valid for "/org/freedesktop/UDisks2/block_devices/sr0"
且 .protodev 这个字符串确实存在于 dde 6.6.3 的 libdfm-computer-plugin.so / libdfm-sidebar-plugin.so / libdfm-smbbrowser-plugin.so 中 —— 证实它是 dde 侧的虚拟/占位节点,不是手机上的真实路径(与帖子作者自己的脚注一致)。
4. 逐条对比表
判定口径:一致=本机观察到同样现象;不一致=本机观察到相反事实;无法验证=本机缺条件(如无手机)或对方机器不可观测。
| # | 帖子主张 | 本机实测 | 判定 |
|---|---|---|---|
| 1 | Deepin 25 / 6.18.48-amd64-desktop-rolling | 同 | 一致 |
| 2 | /proc/cmdline 含 ostree=auto |
同 | 一致 |
| 3 | / 是 ext4 nvme0n1p3,挂 ro |
xfs nvme0n1p3,挂 rw |
不一致 |
| 4 | /home 是 ext4 nvme1n1p1,挂 ro |
ext4 nvme0n1p4,挂 rw;nvme1n1p1 是 100 MiB vfat ESP |
不一致 |
| 5 | fstab 把 /、/home 都写成 rw |
同(xfs / ext4 rw) | 一致 |
| 6 | home.mount Options=rw、Result=success |
同 | 一致 |
| 7 | 但"实际挂载是 ro"→ 三方矛盾 | 本机三方一致 rw,无矛盾 | 不一致 |
| 8 | /usr 是 ro overlay,lowerdir 在 /root/ostree/deploy/deepin,upperdir 在 /root/persistent/overlay |
完全同构 | 一致 |
| 9 | /opt 也是 ro overlay |
/opt 为 rw overlay |
不一致 |
| 10 | /etc 也是 ro overlay |
/etc 为 rw overlay |
不一致 |
| 11 | /run/user/1000 ro(写入失败) |
rw tmpfs | 不一致 |
| 12 | /tmp rw、/dev/shm rw |
同 | 一致 |
| 13 | 写测试:/ ro、/home ro、/run/user/1000 ro |
/、/home、/run/user/1000 全部可写 |
不一致(仅 /tmp、/dev/shm 吻合) |
| 14 | /sys/fs/ext4/nvme1n1p1/errors_count=0 排除内核 remount-ro |
本机无该路径(那是 vfat);本机 /home 的 ext4 是 nvme0n1p4,errors_count=0 |
无法验证(且结论只对原机有效) |
| 15 | 无 /.dockerenv、/run/.containerenv ⇒ 不是容器 |
本沙箱两者也没有,却明确是容器(/proc/1/cmdline = /run/linglong/container-init) |
判据不可靠 |
| 16 | ostree admin status 报 fstatat(boot/loader): 权限不够 |
本机健康系统上以非 root 运行宿主 ostree可一字不差复现;根因 /boot 是 0700 root |
现象一致,归因不成立 |
| 17 | /ostree/deploy/deepin 存在 |
存在(两个部署) | 一致 |
| 18 | 手机 12d1:107e、三接口并存 |
本机无任何 12d1 设备 |
无法验证 |
| 19 | adb 报错串 failed to write server path to …: Read-only file system |
该串在 AOSP 与本机 adb 34.0.5 二进制中真实存在,并可精确复现 | 一致(字符串真实) |
| 20 | 该报错 = 写不进 adb 自己所在目录 | 打印的是 /proc/self/exe;实际写的是 $HOME/.android/adb. |
不一致 |
| 21 | adb 为自建 SDK、/usr/bin/adb 不存在、PATH 只有 SDK 目录 |
本机 /usr/bin/adb 存在(发行版包),adb 状态目录可写 |
本机不一致 |
| 22 | 1.0.41 可证明"自建 SDK" |
硬编码常量,与来源无关 | 不一致 |
| 23 | dde/MTP 四包版本 | 4/4 完全相同 | 完全一致 |
| 24 | dde/MTP 日志是噪音 | 本机无手机时同样刷 sr0 噪音;.protodev 存在于 dfm 插件 |
一致(支持) |
| 25 | sudo: /etc/sudo.conf is owned by uid 65534 + no new privileges |
本机沙箱内同样显示 65534;属 userns 未映射 root + NNP | 现象同源,归因错误 |
| 26 | 作者结论:ostree 只读根 → adb 写不进 → USB 掉线 | 本机同内核 + 磐石激活,/、/home、/etc、/opt、/var、/tmp、/dev/shm、/run/user/1000 全 rw |
不成立 |
5. 技术复核:因果链断在哪
5.1 那条 adb 报错:字符串是真的,但打印的路径骗人
AOSP packages/modules/adb/client/main.cpp(server 主流程,master 第 228–239 行):
// Write our location to .android/adb.$PORT, so that older clients can exec us.
std::string path;
if (!android::base::Readlink("/proc/self/exe", &path)) { … }
std::optional server_executable_path = adb_get_server_executable_path();
if (server_executable_path) {
if (!android::base::WriteStringToFile(path, *server_executable_path)) {
PLOG(ERROR) << "failed to write server path to " << path;
}
}
client/adb_client.cpp:243–251:
std::optional adb_get_server_executable_path() {
…
return adb_get_android_dir_path() + OS_PATH_SEPARATOR + "adb." + std::to_string(port);
}
WriteStringToFile(内容, 路径) 的参数序是 (content, path),所以真实动作是:
把
/proc/self/exe解析出的 adb 可执行文件路径(内容) 写入$HOME/.android/adb.<端口>(文件)。
而日志里 << path 打印的是 /proc/self/exe —— 即 adb 二进制自己的路径,不是写失败的那个文件。帖子把"消息里出现的路径"当成了"写入目标",这是整条因果链的起点错误。
本机双向实测(adb 34.0.5):
- (A) 正常:可写 HOME 下
~/.android/adb.5037落盘内容恰为/…/platform-tools/adb(39–55 字节)——与源码注释一致;宿主真实用户~/.android/adb.5037内容正是/usr/lib/android-sdk/platform-tools/adb。 - (B) 精确复现帖子同款:把
$HOME/.android/adb.5038置为0444后起 server →
E adb : main.cpp:235 failed to write server path to /run/host/rootfs/usr/lib/android-sdk/platform-tools/adb: Permission denied,
而 server 照常启动、照常枚举设备。行号漂移正常(本机 235 / master 237 / 帖子 37.0.1 = 238)。 - (C) 若 HOME 真整体只读且
~/.android不存在,得到的不是这句话,而是:
F adb : adb_utils.cpp:316 Cannot mkdir '…/.android': Read-only file system→failed to start daemon(FATAL,server 直接起不来)。
5.2 因此能反推出什么
- 那句
Read-only file system说明的是~/.android目录存在、但其中文件不可写(局部不可写),不是"整块/home只读";否则报的会是 (C) 的Cannot mkdir …且 daemon 起不来。 - 该写失败是
PLOG(ERROR)非致命,注释写明只是"so that older clients can exec us"的兼容指针文件,与 USB 传输列表、与设备握手无关。 adbkey生成失败也只是ERROR,后果是设备显示unauthorized,设备仍会出现在列表里。- USB 传输的真实路径(
client/usb_linux.cpp):find_usb_device("/dev/bus/usb", …)每 1 秒轮询一次,与$HOME无任何关系。 - 因此"ro 根 → adb 状态写不进 → USB transport 重建失败 → USB 掉线"这条链,在"USB 枚举与 HOME 无关"这一环断裂。
- 作者用
HOME=/tmp/adb_home后"USB 又回来了",最简解释是换了 HOME 让 server 重新启动、重新完整初始化并重新扫描 usbfs——即"重启 server 顺带修好",与其自己的另一条证据(恢复后连跑 30 次全通过、kill-server && start-server3 轮都能稳定重连)完全吻合。重启能修好,恰恰说明不是持久性的只读根问题。
5.3 ostree admin status 的权限报错不是故障
本机在完全健康的主机上以非 root 运行宿主 ostree:
$ /run/host/rootfs/usr/bin/ostree --sysroot=/run/host/rootfs admin status
error: loading sysroot: fstatat(boot/loader): Permission denied
根因:/boot 是 drwx------(0700 root),非 root 无权进入。帖子把这条正常权限提示当成了"磐石损坏/只读"的证据,属于证据链断点。
5.4 sudo … uid 65534 + no new privileges 是"你在容器里"的指纹
- ro 挂载不会改变 inode 属主;
uid 65534不可能由"元数据只读"造成。 65534=nobody,是 root 未映射的用户命名空间里的溢出 uid。本机容器uid_map = 1000 1000 1(root 未映射),于是这份健康系统的/etc/sudo.conf在容器内同样显示65534:65534 644。NO_NEW_PRIVS下 setuid 二进制无法提权,sudo 必然报错 —— 这是容器/flatpak/linglong/unshare的常见组合。- 本机 sudo 包
1.9.16p2-3deepin3、/usr/bin/sudo的 4755 位完好,无任何"被 ro 化"迹象。
5.5 "没有 /.dockerenv 就不是容器"不成立
本沙箱同样没有 /.dockerenv、/run/.containerenv,但 /proc/1/cmdline 明确是 /run/linglong/container-init …。docker/podman 专用标记文件不能作为"是否处在沙箱/容器/命名空间"的判据(bubblewrap、flatpak、linglong、unshare、systemd-nspawn 都不创建它们)。
6. 为什么会看到"全局只读"?最可能是只读 bind 沙箱
帖子自己的 mountinfo 就带着指纹(括号为其 ID 形态):
499 … / ro,nosuid,nodev,relatime master:1 - ext4 /dev/nvme0n1p3 rw
502 … /opt ro,… master:4 - overlay opt-overlay rw,…
503 … /etc ro,… master:5 - overlay etc-overlay rw,…
552 … /home ro,… master:11 - ext4 /dev/nvme1n1p1 rw
四个特征同时出现:
master:N—— 这些挂载是从父命名空间以 slave 方式接收的,不是本命名空间自己挂的;- 整棵树都被
ro(/、/home、/opt、/etc全 ro),而fstab/systemd 说 rw —— 这正是"在另一个 mount namespace 里把整树 bind 成只读"的典型表现:systemd 读的是宿主配置,findmnt看的是本命名空间的 remap; /tmp、/dev/shm是独立的 rw tmpfs(沙箱会在这两个位置新挂 tmpfs),而/run/user/1000仍是 ro(它只是被整树 ro 覆盖,没人替它重挂);sudo报uid 65534+no_new_privs—— 未映射的 userns + NNP,与 read-only bind 是同一套沙箱机制的两个侧面。
把 4 条合起来,最简洁的解释是:作者的取证终端运行在一个"整树只读 bind + 私有 tmpfs + 用户命名空间"的沙箱里(bubblewrap/flatpak 风格,或某个只读挂载的应用容器),而不是裸主机。 这同时解释了:
- 为什么"fstab/systemd 说 rw、实际却 ro"——两者根本不在同一个挂载命名空间;
- 为什么
sudo会看到uid 65534、为什么被no new privileges挡住; - 为什么
ostree admin status说/boot/loader权限不够(非 root + 0700/boot); - 为什么
~/.android存在却写不进去(整树 ro bind,只有局部例外可写)。
备选解释(可能性较低):整机真的发生了 mount -o remount,ro(需要同时 remount /、/home、/run/user/1000 三个独立挂载点,且 /tmp、/dev/shm 恰好逃过);或 ext4 报错后内核 remount-ro(作者自己的 errors_count=0 已排除,前提是他查的是正确的设备)。
最需要补的一条判据(作者可自证):
cat /proc/self/uid_map; grep -E 'NoNewPrivs|Seccomp' /proc/self/status
awk '$5=="/" {print}' /proc/self/mountinfo; echo ---; awk '$5=="/" {print}' /proc/1/mountinfo
若 uid_map 只有一行(root 未映射)、NoNewPrivs: 1,且 /proc/self 与 /proc/1 的 / 选项不同 —— 即可确认"只读"是沙箱视图,系统本身是 rw。
7. 回帖评判
| 回复 | 主张 | 本机基线核查 |
|---|---|---|
| #2(作者) | "磐石已经关闭了" | 与本机相反:本机磐石处于激活态;且即便他那台真的关了,也说明 ro /usr 与磐石无关,反而更削弱其归因 |
| #3(Feelup) | 磐石只保护 /usr、/bin、/lib;/home 不受保护,ro 是自身异常;问题是 adb 放在 /home/Run/… |
前半段基本正确(本机唯一 ro 就是 /usr,/bin、/lib 均在 /usr 下);后半段要修正:失败与"路径"无关,报错里那个路径只是 /proc/self/exe,真正的失败目标在 $HOME 下(但该路径确实泄露了 HOME=/home/Run) |
| #4(neko) | 跟磐石没关系,adb 走 /dev 和网络 |
与源码一致:find_usb_device("/dev/bus/usb") + TCP 5037;这是本报告判定因果链断裂的核心依据 |
| #5(neko) | /home 正常应为 rw,relatime shared:66 - ext4 /dev/nvme0n1p4 rw(磐石开启状态) |
与本机逐字段相同(本机:70 31 259:4 / /home rw,relatime shared:66 - ext4 /dev/nvme0n1p4 rw),唯一差异是 mount id |
结论:回帖方向正确;楼主的核心归因(ostree/磐石只读根)证据不成立。 需要补一句公道话:楼主把 MTP 那堆日志判为"噪音"、并主动标注不确定,这部分判断是对的。
8. 对本机的结论与建议
结论:本机基线正常,无需修复。
/(xfs)与/home(ext4,独立分区)都是 rw;/usr只读是磐石/ostree 的设计行为,不是故障;- adb 是发行版包且位于 ro 的
/usr下,这是受支持的标准装法——恰恰证明"adb 必须能写自己所在目录"这一前提不成立;它的运行时状态全部落在~/.android(本机已有adb.5037/adbkey); - 磐石激活不影响
/home、/tmp、/run/user/1000、/dev/bus/usb;接手机时 adb 的 usbfs 通道在 rw 的 devtmpfs 上; - 若要接 Android 手机:
adb与android-udev-rules(含 12d1 分支)都已就绪,插上即可用;不必为了 adb 去解锁磐石或改/home挂载。
本机可选自检(只读,随时可跑):
# 1. 主机视角的挂载真身(容器内也能看)
awk '$5=="/"||$5=="/home"||$5=="/usr"{print $5, $6, $9}' /run/host/rootfs/proc/1/mountinfo
# 2. 三方一致性
findmnt -T /home -o TARGET,SOURCE,FSTYPE,OPTIONS # 容器内看到的是容器视图,主机需在裸终端跑
# 3. adb 状态目录
ls -l ~/.android/
# 4. 接手机后
lsusb | grep -i android; adb devices
9. 给帖子作者的最小复现/自证清单
- 先证明自己在哪个命名空间:
cat /proc/self/uid_map、grep NoNewPrivs /proc/self/status、比较/proc/self/mountinfo与/proc/1/mountinfo中/的选项。 - 用裸机终端(非沙箱)重跑
findmnt -T /、findmnt -T /home、mount | grep -E ' / | /home ',并加touch写测试;此时若为 rw,则"只读根"结论作废。 - 看
/etc的真实属主:stat -c '%u %g %a %n' /etc/sudo.conf /etc/sudoers(裸机应为0 0 644/440)。 - adb 部分按真实机制排查:
ls -l /dev/bus/usb/*/*、udevadm info -q property -n /dev/bus/usb/...(免 root 依赖 51-android 规则命中107e);- USB 掉线时序:
dmesg -w/journalctl -f看是否发生重新枚举(三功能mass_storage+mtp+adb共用一条 UDC,切换模式最容易掉); - 手机端把默认 USB 配置改为仅"传输文件(MTP)"或仅"USB 调试",不要同时开 mass storage(可同时消掉
sr0噪音); adb kill-server && adb devices能恢复,说明是 server/传输层瞬态,不是文件系统只读;- 若确实需要 adb 状态可写,把
HOME指到可写目录只是绕过(而且它同时重启了 server,属于混淆变量),不能当作"只读根"的证据。
10. 局限与无法验证项
- 本机没有那台手机:无任何
12d1设备,无法复现adb devices掉 USB 行、sr0虚拟光驱、MTP 抖动,也无法验证手机端sys.usb.state。 - 本机与帖子不是同一装法:
/文件系统类型、/home分区号都不同,故"不一致"只表示本机基线不呈现该现象,不是对其机器的直接反驳。 - 无法观测对方机器的真实挂载:帖子给出的 mountinfo 支持"只读 bind 沙箱"解释,但无法在其机器上验证;同样无法确认其磐石开关状态。
- 属主信息受 userns 影响:本沙箱内主机文件一律显示
65534,无法据此确认主机真实属主;但 sudo 包、setuid 位、配置文件齐全,无异常迹象。 - 未做主机写测试:出于不向主机写入的约束,主机侧可写性由 mountinfo
rw+ superblockrw+ systemdOptions=rw+ fstab 四方一致推定;/home另有"本报告成功落盘"的直接实证。
附录 A:证据文件与关键命令
| 文件 | 内容 |
|---|---|
evidence/mount-ostree-baseline.md |
挂载/磁盘/ostree/磐石 全量取证(305 行,逐条含命令与原始输出) |
evidence/adb-mtp-baseline.md |
adb/USB/MTP/dde/sudo 全量取证 + AOSP 源码级核查 + 三组实测(446 行) |
核心命令(本报告结论均可复现):
# 主机真身挂载
awk '$5=="/"||$5=="/home"||$5=="/usr"||$5=="/etc"||$5=="/opt"' /run/host/rootfs/proc/1/mountinfo
awk '$6 ~ /(^|,)ro(,|$)/ {print $5, $6, $9}' /run/host/rootfs/proc/1/mountinfo
# 主机 systemd(容器内 systemctl 不可用,但 D-Bus 可用)
export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket
gdbus call --system --dest org.freedesktop.systemd1 \
--object-path /org/freedesktop/systemd1/unit/home_2emount \
--method org.freedesktop.DBus.Properties.Get org.freedesktop.systemd1.Mount Options
# adb 归属与版本
ls -l /run/host/rootfs/usr/bin/adb; md5sum /run/host/rootfs/usr/lib/android-sdk/platform-tools/adb
grep -A3 '^Package: adb$' /run/host/rootfs/var/lib/dpkg/status
# 宿主 adb 运行时状态
ls -l /run/host/rootfs/home/master/.android/; cat /run/host/rootfs/home/master/.android/adb.5037
附录 B:参考
- 论坛帖:https://bbs.deepin.org.cn/post/302877
- AOSP adb 源码:https://android.googlesource.com/platform/packages/modules/adb/(
client/main.cpp、client/adb_client.cpp、client/usb_linux.cpp、adb_utils.cpp) - 第三方 gitiles 镜像(帖子报错串出现处):https://review.evervolv.com/plugins/gitiles/android_packages_modules_adb/+/f2e342bea539a6187aa2ed9d5866aa4b56f2ea42/client/main.cpp
- android-udev-rules:https://github.com/M0Rf30/android-udev-rules
这是我让AI根据我笔记本生成的基线对比报告,你可以让你的AI看看,然后让它对比一下。
Popular Ranking
ChangePopular Events
More

中文 


adb: main.cpp:238 failed to write server path to
/home/Run/tools/Android-SDK/platform-tools/adb: Read-only file system
dde-file-manager-daemon[2820]: UDisksObject is not valid for "/org/freedesktop/UDisks2/block_devices/sr0"
dde-file-manager-daemon[2820]: Failed to create block device: ".../block_devices/sr0"
dde-file-dialog[135192]: Item not found in cache for removal, url: QUrl("entry:mtp://HUAWEI_STK-AL00_7PRDU19B20015852/.protodev")
$ findmnt -T /
TARGET SOURCE FSTYPE OPTIONS
/ /dev/nvme0n1p3 ext4 ro,nosuid,nodev,relatime
$ findmnt -T /home
TARGET SOURCE FSTYPE OPTIONS
/home /dev/nvme1n1p1 ext4 ro,nosuid,nodev,relatime
$ grep -E "^UUID=.*(/|/home)\s" /etc/fstab
UUID=2c0a4376-... / ext4 rw,relatime 0 1
UUID=7a6e0465-... /home ext4 rw,relatime 0 2
$ systemctl show home.mount -p Options -p Result
Options=rw,relatime
Result=success
$ cat /sys/fs/ext4/nvme1n1p1/errors_count
0
$ cat /sys/fs/ext4/nvme1n1p1/first_error_time
0
$ ls /.dockerenv /run/.containerenv
(均不存在)
$ grep -E " / | /home " /proc/self/mountinfo
499 ... / ro,nosuid,nodev,relatime master:1 - ext4 /dev/nvme0n1p3 rw
500 ... /usr ro,nosuid,nodev,relatime master:2 - overlay usr-overlay rw,lowerdir=/root/persistent/overlay/...,upperdir=...
502 ... /opt ro,nosuid,nodev,relatime master:4 - overlay opt-overlay rw,lowerdir=...,upperdir=...
503 ... /etc ro,nosuid,nodev,relatime master:5 - overlay etc-overlay rw,lowerdir=...,upperdir=...
552 ... /home ro,nosuid,nodev,relatime master:11 - ext4 /dev/nvme1n1p1 rw
ostree admin status因权限(fstatat(boot/loader): 权限不够)无法直接读部署信息;/proc/cmdline含ostree=auto,/ostree/deploy/deepin存在,确认为 ostree 部署。三、问题闭环:只读根如何导致“USB 一直报错”
/home/Run/tools/Android-SDK/platform-tools/(在 ro 的/home上)Read-only file system~/.android/写adb.5037、adbkey等运行态文件adb devices掉成只剩 WiFi 行,看起来像“USB 坏了”sr0(手机 mass_storage 暴露的虚拟光驱)UDisksObject is not valid/Failed to create block device持续刷日志一句话:USB 硬件没坏,手机没坏;是 ostree 只读根让 adb 无法在运行期落盘运行态,从而反复报错并表现为 USB 掉线。
想验证的下一条命令(需要 root):
四、当前临时缓解(已生效,但治标不治本)
另外手机侧建议:开发者选项里把 USB 默认配置设为 “传输文件(MTP)”,不要同时启用
mass_storage,可减少sr0带来的 dde 报错噪音。五、想请教大家的问题
/home为什么也被以ro挂出? 这是设计如此,还是部署异常?正常设备应如何恢复/home为 rw?ostree admin unlock(或unlock --hotfix)吗?还是应该把 adb/SDK 等运行态目录迁出 ro 分区(例如放到/var或/persistent)?etc-overlay/usr-overlay的 upperdir 在/root/persistent/overlay/,如果只需让部分目录可写(如~/.android),是否有官方推荐的 overlay/绑定挂载方案?sudo: /etc/sudo.conf is owned by uid 65534+no new privileges同时出现?(本环境无法直接sudo,这可能是ro下/etc元数据异常导致)六、环境信息
结论:优先确认 ostree 只读根是否属于预期行为,再决定是“解锁可写根”还是“把 adb 运行态迁出只读区”。谢谢大家。