[Bug Report] Android手机USB连接反复报错,疑似ostree只读根导致adb无法写
Tofloor
poster avatar
大风
deepin
2026-11-08 21:51
Author
# [求助] Deepin 下 Android 手机 USB 连接反复报错,根因疑似 ostree 只读根导致 adb 无法写配置

> 版本:Deepin 25(内核 6.18.48-amd64-desktop-rolling,`ostree=auto` 部署)
> 设备:HUAWEI STK-AL00(Android 10 / HarmonyOS 底层)
> 现状:USB 传输可用,但 adb 每次重启都报错,MTP 偶发掉挂载

---

## 一、现象

1. 手机 USB 插上后,文件管理器偶尔能打开 MTP,但**频繁提示各种错误**;
2. `adb devices` 有时只剩 `192.168.238.25:5555`(WiFi 无线调试),**USB 设备行消失**;
3. 日志中反复出现:

# [求助] Deepin 下 Android 手机 USB 连接反复报错,根因疑似 ostree 只读根导致 adb 无法写配置

> 版本:Deepin 25(内核 6.18.48-amd64-desktop-rolling,`ostree=auto` 部署)
> 设备:HUAWEI STK-AL00(Android 10 / HarmonyOS 底层)
> 现状:USB 传输可用,但 adb 每次重启都报错,MTP 偶发掉挂载

---

## 一、现象

1. 手机 USB 插上后,文件管理器偶尔能打开 MTP,但**频繁提示各种错误**;
2. `adb devices` 有时只剩 `192.168.238.25:5555`(WiFi 无线调试),**USB 设备行消失**;
3. 日志中反复出现:

adb: main.cpp:238 failed to write server path to
/home/Run/tools/Android-SDK/platform-tools/adb: Read-only file system


4. 文件管理器日志持续刷:

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")


> 注:`.protodev` 在手机上实际不存在(`ls /sdcard/.protodev` → No such file)。它是 dde 文件管理器 MTP 后端(dfm-mount/jmtpfs)产生的代理/占位等虚拟节点,手机在 MTP 模式下会隐藏点文件,故该路径必然“找不到”。这一条属于 dde 的已知噪音,不是根因,但会放大“一直在报错”的观感。**这一点我判断不确定,欢迎知情者补充。**

---

## 二、排查过程与关键证据

### 1. 先排除硬件、线材、供电

- `lsusb` 显示设备稳定在 `Bus 003 Device 014: ID 12d1:107e Huawei Technologies Co., Ltd. P10 smartphone`,USB 2.0 端口(`speed 480`),供电 `bMaxPower 500mA`;
- 手机端 `sys.usb.state` = `hisuite,mtp,mass_storage,adb`,三个接口齐全:

| 接口 | Class/Sub/Proto | 对应功能 |
|---|---|---|
| `3-2.2.2:1.0` | `ff/ff/00` | ADB(Vendor Specific) |
| `3-2.2.2:1.1` | `08/06/50` | Mass Storage → `sr0`(虚拟光驱) |
| `3-2.2.2:1.2` | `ff/42/01` | MTP / hisuite |

- USB adb 恢复后连跑 30 次命令全通过,`adb kill-server && adb start-server` 3 轮均能稳定重连;
- MTP 真实文件读测试成功(`dd` 读取 `/sdcard/DCIM/.tmfs/.turing.dat`)。**故 USB 物理链路、内核识别、手机端功能都正常。**

### 2. 真正的问题藏在挂载选项里

$ 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


但 `fstab` 与 systemd 记录的却是 **rw**:

$ 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


**这三组证据互相矛盾**:fstab 写 rw,systemd 认为 rw 且挂载成功,但实际生效的是 ro。

### 3. 不是磁盘故障,也不是容器

$ cat /sys/fs/ext4/nvme1n1p1/errors_count
0
$ cat /sys/fs/ext4/nvme1n1p1/first_error_time
0

$ ls /.dockerenv /run/.containerenv
(均不存在)


结论:**不是内核 ext4 出错后的自动 `remount-ro` 保护**(errors_count 为 0),也不是 Docker/容器权限问题。

### 4. 真凶:ostree 不可变根

`/proc/self/mountinfo` 暴露了部署结构:

$ 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


(为便于阅读,省略了 mountinfo 的 parent ID / maj:min / root 字段与 lowerdir/upperdir 完整路径)

- 底层分区 `ext4 ... rw`,但**挂载点被以 `ro` 挂出**,这正是 Deepin 的 **ostree 不可变根**(immutable root)机制;
- `/usr`、`/opt`、`/etc` 都是 `ro` 挂载的 overlay(`lowerdir` 指向 ostree 部署 + `upperdir` 指向上层可写层);
- `/home` 虽独立分区(`/dev/nvme1n1p1`),但同样被以 `ro` 挂出(`master:11`);
- `/run/user/1000`(tmpfs)同样是 `ro`,且写入实测失败;
- 注意:同一路径存在**多层挂载叠加**(mount stack)。例如 `/tmp` 在 mountinfo 中先有一条 `ro,nosuid,nodev master:51`,其上又叠了一条 `rw,nosuid,nodev,relatime`,实际写入测试通过(rw)。所以判断是否可写**必须以写入测试为准**,不能只看 `findmnt`:

```bash
$ for p in / /home /run/user/1000 /tmp /dev/shm; do
    touch "$p/.rt_$$" 2>/dev/null && { echo "$p rw"; rm -f "$p/.rt_$$"; } || echo "$p ro"
  done
/ ro
/home ro
/run/user/1000 ro
/tmp rw
/dev/shm rw
  • ostree admin status 因权限(fstatat(boot/loader): 权限不够)无法直接读部署信息;/proc/cmdline 含 ostree=auto,/ostree/deploy/deepin 存在,确认为 ostree 部署。

三、问题闭环:只读根如何导致“USB 一直报错”

链路 后果
adb 二进制位于 /home/Run/tools/Android-SDK/platform-tools/(在 ro 的 /home 上) adb server 启动时需向同目录写 server path →Read-only file system
adb 需在 ~/.android/ 写 adb.5037、adbkey 等运行态文件 运行态被冻结在开机瞬间,任何 server 重启/重连都无法刷新状态
adb 无法正常写状态 → USB 传输通道重建失败 adb devices 掉成只剩 WiFi 行,看起来像“USB 坏了”
dde 的 MTP 后端与 UDisks 交互时读 sr0(手机 mass_storage 暴露的虚拟光驱) UDisksObject is not valid / Failed to create block device 持续刷日志

一句话:USB 硬件没坏,手机没坏;是 ostree 只读根让 adb 无法在运行期落盘运行态,从而反复报错并表现为 USB 掉线。

想验证的下一条命令(需要 root):
mount | grep -E " / | /home "
# 预期看到 / 与 /home 为 ro,而底层 ext4 ro 属性为 rw

四、当前临时缓解(已生效,但治标不治本)

# 1. USB adb 掉线时重建通道
adb kill-server && adb start-server && adb devices

# 2. MTP 列表空 / 报错时重挂
gio mount -u "mtp://HUAWEI_STK-AL00_7PRDU19B20015852/"
gio mount -a "mtp://HUAWEI_STK-AL00_7PRDU19B20015852/"

# 3. 证明是只读导致:改用可写 HOME 启动 adb,不再报 server path 错误
mkdir -p /tmp/adb_home/.android
cp ~/.android/adbkey ~/.android/adbkey.pub /tmp/adb_home/.android/
HOME=/tmp/adb_home adb kill-server && HOME=/tmp/adb_home adb start-server
HOME=/tmp/adb_home adb devices        # USB 设备行正常出现

另外手机侧建议:开发者选项里把 USB 默认配置设为 “传输文件(MTP)”,不要同时启用 mass_storage,可减少 sr0 带来的 dde 报错噪音。


五、想请教大家的问题

  1. Deepin 的 ostree 不可变根下,/home 为什么也被以 ro 挂出? 这是设计如此,还是部署异常?正常设备应如何恢复 /home 为 rw?
  2. 如果确实要长期 rw,正确姿势是 ostree admin unlock(或 unlock --hotfix)吗?还是应该把 adb/SDK 等运行态目录迁出 ro 分区(例如放到 /var 或 /persistent)?
  3. etc-overlay/usr-overlay 的 upperdir 在 /root/persistent/overlay/,如果只需让部分目录可写(如 ~/.android),是否有官方推荐的 overlay/绑定挂载方案?
  4. 有没有人遇到 sudo: /etc/sudo.conf is owned by uid 65534 + no new privileges 同时出现?(本环境无法直接 sudo,这可能是 ro 下 /etc 元数据异常导致)

六、环境信息

$ uname -r
6.18.48-amd64-desktop-rolling

$ grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Deepin 25"

$ cat /proc/cmdline | tr ' ' '\n' | grep ostree
ostree=auto

$ adb --version
Android Debug Bridge version 1.0.41 / Version 37.0.1-15733141

$ dpkg -l | grep -E "dde-file-manager|gvfs-backends|libmtp"
dde-file-manager 6.6.3
dde-file-manager-services-plugins 6.6.3
gvfs-backends 1.54.2-2deepin3
libmtp9 1.1.21-3.1deepin1

附:adb 是自建 SDK(version 37.0.1),未安装发行版 android-tools 包;/usr/bin/adb 不存在,PATH 中仅有 /home/Run/tools/Android-SDK/platform-tools。


结论:优先确认 ostree 只读根是否属于预期行为,再决定是“解锁可写根”还是“把 adb 运行态迁出只读区”。谢谢大家。


Reply Favorite View the author
All Replies
avatar
大风
deepin
2026-11-08 21:54
#1

论坛求助-USB连接异常根因分析.txt

论坛的md编辑器格式样式有问题,本地看好好的,发上去就变了,附件是原始的md文件

Reply View the author
avatar
大风
deepin
2026-11-08 21:55
#2

顺便说一下,磐石已经关闭了

Reply View the author
avatar
Feelup
deepin
2026-11-09 09:37
#3

磐石系统主要保护的是 /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目录)也有可能存在其它系统可能的异常状态,才导致了现在的现象。

Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-11-09 10:53
#4

跟磐石没啥关系,adb是走/dev和网络的。

Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-11-09 11:00
#5

70 31 259:4 / /home rw,relatime shared:66 - ext4 /dev/nvme0n1p4 rw

正常情况下应该是rw的(磐石开启状态)

image.png

Reply View the author
avatar
大风
deepin
2026-11-09 11:11
#6
Feelup:

磐石系统主要保护的是 /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目录)也有可能存在其它系统可能的异常状态,才导致了现在的现象。

  1. Run 确实是用户名

  2. 偶发这种情况,发生这种情况 和 未发生这种情况的时候,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
    
    
Reply View the author
avatar
大风
deepin
2026-11-09 11:18
#7
neko:

70 31 259:4 / /home rw,relatime shared:66 - ext4 /dev/nvme0n1p4 rw

正常情况下应该是rw的(磐石开启状态)

image.png

偶发的,找deepseek帮忙查,给出这个结论,但是我用 ls -l 的命令 ,返回都是 rwx的

Reply View the author
avatar
Feelup
deepin
2026-11-09 11:32
#8
大风:
  1. Run 确实是用户名

  2. 偶发这种情况,发生这种情况 和 未发生这种情况的时候,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
Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-11-09 11:35
#9

论坛帖《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。

作者的证据链:

  1. 排除硬件:lsusb 稳定显示 12d1:107e,三个接口齐全(ADB ff/ff/00、Mass Storage 08/06/50→sr0、MTP ff/42/01);恢复后连跑 30 次命令全通过。
  2. findmnt -T / → / 为 ext4 nvme0n1p3、ro;findmnt -T /home → ext4 nvme1n1p1、ro。
  3. 但 /etc/fstab 写的是 rw,systemctl show home.mount 的 Options=rw、Result=success → "三处证据互相矛盾"。
  4. ext4 errors_count=0 排除内核 remount-ro;无 /.dockerenv、/run/.containerenv 排除容器。
  5. 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/shm rw。
  6. ostree admin status 报 fstatat(boot/loader): 权限不够;/proc/cmdline 含 ostree=auto。
  7. 结论:ostree 只读根导致 adb 无法在运行期落盘运行态 → USB 通道重建失败 → 表现为 USB 掉线。
  8. 另一异常: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 因此能反推出什么

  1. 那句 Read-only file system 说明的是 ~/.android 目录存在、但其中文件不可写(局部不可写),不是"整块 /home 只读";否则报的会是 (C) 的 Cannot mkdir … 且 daemon 起不来。
  2. 该写失败是 PLOG(ERROR) 非致命,注释写明只是"so that older clients can exec us"的兼容指针文件,与 USB 传输列表、与设备握手无关。
  3. adbkey 生成失败也只是 ERROR,后果是设备显示 unauthorized,设备仍会出现在列表里。
  4. USB 传输的真实路径(client/usb_linux.cpp):find_usb_device("/dev/bus/usb", …) 每 1 秒轮询一次,与 $HOME 无任何关系。
  5. 因此"ro 根 → adb 状态写不进 → USB transport 重建失败 → USB 掉线"这条链,在"USB 枚举与 HOME 无关"这一环断裂。
  6. 作者用 HOME=/tmp/adb_home 后"USB 又回来了",最简解释是换了 HOME 让 server 重新启动、重新完整初始化并重新扫描 usbfs——即"重启 server 顺带修好",与其自己的另一条证据(恢复后连跑 30 次全通过、kill-server && start-server 3 轮都能稳定重连)完全吻合。重启能修好,恰恰说明不是持久性的只读根问题。

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

四个特征同时出现:

  1. master:N —— 这些挂载是从父命名空间以 slave 方式接收的,不是本命名空间自己挂的;
  2. 整棵树都被 ro(/、/home、/opt、/etc 全 ro),而 fstab/systemd 说 rw —— 这正是"在另一个 mount namespace 里把整树 bind 成只读"的典型表现:systemd 读的是宿主配置,findmnt 看的是本命名空间的 remap;
  3. /tmp、/dev/shm 是独立的 rw tmpfs(沙箱会在这两个位置新挂 tmpfs),而 /run/user/1000 仍是 ro(它只是被整树 ro 覆盖,没人替它重挂);
  4. 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. 给帖子作者的最小复现/自证清单

  1. 先证明自己在哪个命名空间:cat /proc/self/uid_map、grep NoNewPrivs /proc/self/status、比较 /proc/self/mountinfo 与 /proc/1/mountinfo 中 / 的选项。
  2. 用裸机终端(非沙箱)重跑 findmnt -T /、findmnt -T /home、mount | grep -E ' / | /home ',并加 touch 写测试;此时若为 rw,则"只读根"结论作废。
  3. 看 /etc 的真实属主:stat -c '%u %g %a %n' /etc/sudo.conf /etc/sudoers(裸机应为 0 0 644/440)。
  4. 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. 局限与无法验证项

  1. 本机没有那台手机:无任何 12d1 设备,无法复现 adb devices 掉 USB 行、sr0 虚拟光驱、MTP 抖动,也无法验证手机端 sys.usb.state。
  2. 本机与帖子不是同一装法:/ 文件系统类型、/home 分区号都不同,故"不一致"只表示本机基线不呈现该现象,不是对其机器的直接反驳。
  3. 无法观测对方机器的真实挂载:帖子给出的 mountinfo 支持"只读 bind 沙箱"解释,但无法在其机器上验证;同样无法确认其磐石开关状态。
  4. 属主信息受 userns 影响:本沙箱内主机文件一律显示 65534,无法据此确认主机真实属主;但 sudo 包、setuid 位、配置文件齐全,无异常迹象。
  5. 未做主机写测试:出于不向主机写入的约束,主机侧可写性由 mountinfo rw + superblock rw + systemd Options=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:参考

Reply View the author
avatar
neko
deepin
Ecological co-builder
Q&A Team
2026-11-09 11:36
#10

这是我让AI根据我笔记本生成的基线对比报告,你可以让你的AI看看,然后让它对比一下。

Reply View the author