模块 :L01 心智模型与命令入口
篇号 :L01-03 / 38
预计阅读 :35 分钟
主线:Linux 设备与存储
文章目录
-
- 本篇目标
- [30 秒速览](#30 秒速览)
- 正文
-
- [1. 两种环境各干什么](#1. 两种环境各干什么)
- [2. Android:从 adb 进 shell](#2. Android:从 adb 进 shell)
- [3. 远程服务器:先确认工具在不在](#3. 远程服务器:先确认工具在不在)
- [4. 服务器安全练法:文件 + loop](#4. 服务器安全练法:文件 + loop)
- [5. 同一问题,两边怎么对照练](#5. 同一问题,两边怎么对照练)
- [6. 权限与「命令在不在」的决策](#6. 权限与「命令在不在」的决策)
- [7. 本专栏后续练习落点(预告)](#7. 本专栏后续练习落点(预告))
- [Android 对照](#Android 对照)
- 检查清单
- 练习
-
- [判断题(对 / 错)](#判断题(对 / 错))
- [操作题 A(Android)](#操作题 A(Android))
- [操作题 B(远程服务器)](#操作题 B(远程服务器))
- 读输出题
- 本篇边界
- 下一篇预告
- [L01 模块小结](#L01 模块小结)
本篇目标
把后续练习落到两处:Android 设备 负责看真机对象与挂载现象;远程 Linux 服务器 负责练完整命令选项,并用文件 + losetup 安全模拟块设备。学完能判断「这条命令该在哪跑、缺权限时怎么办、危险操作碰谁」。
30 秒速览
- Android:
adb shell,常见实现是 toybox;适合观察/dev/block、mount、df、by-name。 - 远程服务器:util-linux / e2fsprogs 等更全;适合
lsblk、findmnt、losetup、mkfs、镜像工具。 - 精通标准按完整工具链;板上缺的命令到服务器练,概念两边通用。
- 服务器上练块设备:默认用普通文件 + loop ,不要对系统盘
dd/mkfs。 - Android 镜像主机工具可从 AOSP
out/host/linux-x86/bin拷到服务器使用。
正文
1. 两种环境各干什么
| 环境 | 擅长 | 不擅长 / 注意 |
|---|---|---|
| Android 设备 | 真实分区名、by-name、多挂载点、产品路径 | 命令选项常被裁剪;部分操作需 root |
| 远程 Linux 服务器 | 完整选项、反复试验、做/拆 loop 镜像 | 通常没有手机那套 by-name;勿伤系统盘 |
对象模型两边是同一套(L01-01 / L01-02)。差别主要在:探针齐不齐、路径长什么样、有没有权限。
分工原则:
- 看现象、对产品路径 → Android
- 练选项、做可重复实验 → 远程服务器
- 危险写操作 (
mkfs、dd写设备、wipefs)→ 只对 loop 或明确的练习文件,不对系统根盘、不对量产用户数据分区做「练手」
2. Android:从 adb 进 shell
主机已装好 adb、设备已连接时:
bash
adb devices
adb shell
需要更高权限时(视设备与 userdebug/eng 配置而定):
bash
adb root
adb shell
# 或在 shell 内:
su
本专栏常用的观察入口:
bash
adb shell ls -l /dev/block/by-name | head
adb shell mount | grep ' /data '
adb shell df -h /data
adb shell id
| 现象 | 常见原因 |
|---|---|
adb devices 无设备 |
未授权、驱动、线材、未开调试 |
Permission denied |
当前 uid 不够;试 adb root 或设备是否允许 root |
| 找不到某命令 | toybox 未提供该工具或未链到 PATH |
Android shell 里的许多命令来自 toybox :名字眼熟,选项往往比完整 util-linux / coreutils 少 。
后文归属篇会给「常用选项清单」;表中标明 Android 不具备的,以服务器练习为准。
3. 远程服务器:先确认工具在不在
登录服务器后自检(包名因发行版而异,命令名如下):
bash
which lsblk findmnt losetup blockdev blkid mkfs.ext4
lsblk -V 2>/dev/null || true
mount --version 2>/dev/null || true
| 用途 | 常见命令 | 备注 |
|---|---|---|
| 块设备拓扑 | lsblk |
Android 上常无 |
| 挂载查看 | findmnt、mount |
findmnt 板上常无 |
| loop | losetup |
服务器练镜像/块设备的核心 |
| 容量 | blockdev、df、du |
blockdev 板上可能需 root |
| FS 识别 | blkid |
视镜像是否带 |
| 创建 FS | mkfs.ext4 等 |
只对练习文件/loop |
缺包时按发行版安装 util-linux、e2fsprogs 等(具体 apt/yum 命令以服务器文档为准)。
Android 专用主机工具(如 simg2img、e2fsdroid、lpdump)可从已编译的 AOSP 树拷贝:
text
out/host/linux-x86/bin/
放到服务器某目录后,把该目录加入 PATH,或写全路径调用。
4. 服务器安全练法:文件 + loop
目标:得到一个「长得像块设备」的节点,而不去动 /dev/sda、/dev/vda 等系统盘。
示意流程(路径可自定;需要时加 sudo):
bash
# 1)准备一个空文件当「假磁盘」(这里 64MiB)
dd if=/dev/zero of=/tmp/storage-lab.img bs=1M count=64 status=progress
# 2)挂到空闲 loop 设备
sudo losetup -f --show /tmp/storage-lab.img
# 假设打印:/dev/loop0
# 3)此时 /dev/loop0 就是可练习的块设备对象
ls -l /dev/loop0
sudo blockdev --getsize64 /dev/loop0
# 4)练完释放(先 umount 若已挂载)
sudo losetup -d /dev/loop0
rm -f /tmp/storage-lab.img
硬规矩:
mkfs/dd of=/wipefs的目标必须是自己创建的 loop 或明确练习镜像。- 对
lsblk里挂着/、/boot、/home的磁盘,不做格式化练习。 - 共享服务器上,文件放自己的家目录或
/tmp下带用户名的路径,避免踩别人的实验文件。
后续 L05~L08 的破坏性步骤,默认都建立在这种 loop 之上。
5. 同一问题,两边怎么对照练
以「看见块设备与挂载」为例:
| 问题 | Android | 远程服务器 |
|---|---|---|
| 有哪些块设备 | ls -l /dev/block |
lsblk;或 ls -l /dev/sd* /dev/vd* /dev/loop* |
| 某路径挂在谁上 | `mount | grep ' /data '` |
| 空间 | df -h /data |
df -h / |
| 精确字节容量 | blockdev --getsize64 <节点>(常需 root) |
对 loop:blockdev --getsize64 /dev/loopN |
| 按名找分区 | /dev/block/by-name/... |
一般无 by-name;用 lsblk -f / 分区名列 |
对照目的:确认对象关系一致,而不是强求两边路径字符串相同。
6. 权限与「命令在不在」的决策
text
命令失败
├─ 提示 not found / No such file → 换环境或安装/拷贝工具
├─ 提示 Permission denied
│ ├─ Android:adb root / su;仍不行则换只读观察或服务器练等价项
│ └─ 服务器:sudo;或检查文件属主
└─ 提示 busy / target is busy → 先 umount / 查占用(L07)
读输出时仍用 L01-02 的规矩:先定对象,再解释探针结果。
7. 本专栏后续练习落点(预告)
| 模块主题 | 优先环境 |
|---|---|
| by-name、真机多挂载点、产品路径 | Android |
ls/stat/chmod 语义 |
两边都可;完整选项偏服务器 |
lsblk/findmnt/parted 查看 |
服务器 |
mkfs/fsck/losetup/dd 实验 |
服务器 + loop |
e2fsdroid/simg2img/lpdump |
服务器(主机工具) |
| 排障五题收口 | Android 现象 + 服务器复现实验 |
Android 对照
| 项 | 说明 |
|---|---|
| 进入方式 | adb shell;调试机常见 adb root |
| 命令实现 | 多为 toybox |
| 块设备入口 | /dev/block、/dev/block/by-name |
| 与服务器差异 | 路径与工具集不同;分区/FS/挂载对象模型相同 |
检查清单
- 能说清:真机观察与服务器练选项分别解决什么问题
- 会用
adb devices/adb shell做 L01 级观察 - 服务器上会用文件 +
losetup得到练习用块设备,并会losetup -d释放 - 明确:不对系统盘、不对量产用户数据做格式化练手
- 遇到 not found / Permission denied 时,知道换环境、提权或换探针
练习
判断题(对 / 错)
- Android 上没有
lsblk,就不需要再学这条命令。 - 远程服务器上练习
mkfs时,可以对挂载了/的磁盘直接格式化以便「更真实」。 losetup把普通文件当成块设备来用,适合安全做存储实验。- 两边路径不同,所以分区、文件系统、挂载的概念也不通用。
参考答案
- 错。完整选项在服务器练;概念与排障仍要会。
- 错。会对系统造成破坏;只用 loop/练习文件。
- 对。
- 错。对象模型通用,路径与工具集不同。
操作题 A(Android)
bash
adb devices
adb shell ls -l /dev/block/by-name | head
adb shell mount | grep ' /data '
adb shell df -h /data
记下:by-name 里是否有 userdata(或等价名)、/data 的设备与 type。
操作题 B(远程服务器)
按第 4 节创建 64MiB 文件并 losetup,然后:
bash
ls -l /dev/loopN # N 换成实际编号
sudo blockdev --getsize64 /dev/loopN
sudo losetup -a | grep loopN
sudo losetup -d /dev/loopN
rm -f /tmp/storage-lab.img
确认:getsize64 结果为 67108864(64×1024×1024),释放后 loop 不再占用该文件。
读输出题
text
$ which findmnt lsblk
/usr/bin/findmnt
/usr/bin/lsblk
$ adb shell which findmnt lsblk
/system/bin/sh: findmnt: inaccessible or not found
findmnt/lsblk应在哪边练常用选项?- 在 Android 上要用什么命令看「
/data挂在谁上」?
参考答案
- 远程服务器。
mount | grep ' /data '(或设备上其它等价查看方式)。
本篇边界
- 不讲各发行版装包的完整手册
- 不讲
adb驱动与公司内网接入流程 - 不讲
losetup/mkfs的完整选项清单(L08/L06 归属篇) - 不讲量产烧录与解锁策略
下一篇预告
L02-01 :《文件类型全景:普通文件、目录、符号链接、设备节点》--- 从路径行首字母把对象类型认全,为 stat/ls 精读打底。
L01 模块小结
| 篇 | 收获 |
|---|---|
| L01-01 | 一条存储链路 + 会读 ls -l / mount / df |
| L01-02 | 对象是主体,命令是探针 |
| L01-03 | Android 观察、服务器练选项与 loop 安全实验 |
从 L02 起,按对象深挖;命令常用选项在各自归属篇收束到「必会清单」。