特别备注 由于Dora OS等的 崭新的"面向AI时代的新型机器人操作系统"的复杂性,我们这次没有用Dora OS作为案例;
我们只是演示cnb.cool与Qemu虚拟机的结合
演示的只是 Debian 12 bookworm 与 alpine 3.22.0 两个版本

特别说明
本模式只适合 广大计算机学院,软件学院,网络学院学生学习 操作系统试验课程 通过qemu虚拟机软件 做技术试验
通过qemu虚拟机 调试 自己的 linux内核源代码 这个 调试 环节是必须用到 qemu虚拟机的
在操作系统试验中, 有一个 准备根文件系统 步骤 必须使用 qemu虚拟机
类似编译 RISC-V 指令集上的 linux 内核源代码,在cnb.cool主工作空间进行,速度更快,编译 linux内核源代码,不要在qemu虚拟机内进行
编译 RISC-v指令集上的linux源代码 也可以通过直接使用 相应的 docker镜像与容器,更快的进行
本案例,仅用来自 debian 官方的 debian 12 qcow2镜像作为案例, "这个镜像 在cnb.cool的qemu虚拟机中 '调试操作系统内核' 与 '构建轻型的根文件系统' 速度还是不错的"


仿照优秀的cnb.cool团队提出的 git分支 就是不同的 deepseek 大语言模型的
下图2个标有"虚拟机"后缀的分支,选中该分支以后,点击"学习笔记"(橙色)按钮,就可立即启动CNB的工作空间,按照配置自动启动Qemu虚拟机
debian-12-qemu-vm-虚拟机 [用户名 root 用户密码是 123456]
alpine-3.2.20-docker容器中通过qemu-2层结构-虚拟机 [用户名 root 没有密码]

这个模式是,计算机学院学子们,做操作系统试验的 最佳选择

直接进入qemu虚拟机_快捷_便利

可以看到 debian 12 qemu 虚拟机使用的 独立的内核 启动的 这样就有条件做 操作系统内核的 调试试验了

这个方式网络比较复杂,不适合 计算机学院的学子们 做操作系统试验 我们放在这里,是演示一些这个模式也是存在的(过于复杂)

alpine-3.2.20-qemu-vm 虚拟机 用户名 root 没有密码 可以直接进入

**通过noVNC web页面方式(6080端口) 可以访问alpine-3.2.20-qemu-vm 虚拟机的命令行

其他分支都是方便,直接运行虚拟机 main分支,是进行 操作系统内核试验的 主要工作分支
main分支 由于灵活与强大的.cnb.yml配置能力,进入了 CNB_WELCOME_EXECUTE_COMMAND 执行后的界面 如下图 做计算机操作系统试验的 学子们 可以 根据屏幕显示的信息 输入 "make de60" 启动实验相关的qemu虚拟机 去进行操作

上图的核心配置如下
main:
vscode:
- docker:
image: docker.cnb.cool/8888/cnbcnb/imadesk/cnb_xfce_qemu/cnb_xfce_qemu/ce12_cnb_qemu_vm_for_os_study:latest
runner:
cpus: 16
# tags: cnb:arch:amd64:gpu
services:
- vscode
- docker
# 开发环境启动后会执行的任务
stages:
- name: 通过make展示帮助信息
script: "[ -f ${HOME}/Makefile ] && make -f ${HOME}/Makefile help"
env:
# NOTE 如下是选择分支后_展示_帮助信息
CNB_WELCOME_EXECUTE_COMMAND: |
[[ -f "${HOME}/Makefile" ]] && make -f ${HOME}/Makefile help && echo -e "\n位于_git分支_main"
在main分支中 "cd && make && make de60" 快速启动 de60-debian-12-qemu-vm 虚拟机


cd ${HOME} && make help && make de60
ps aux | grep qemu | grep 'name'
方法一 (安全关闭): 通过ssh登录到 上述虚拟机内部,通过shutdown -h now模式关闭
cd ${HOME} && make help && make de60_stop
方法二(虚拟机失去反应,暴力关闭) 在cnb.cool主工作空间中,通过killall 杀死qemu进程,暴力关闭
cd ${HOME} && make help && make de60_hard_stop
特别提示: 通过方法二暴力关闭失去反应的虚拟机,可能无法再次启动该虚拟机,需要重新关闭cnb.cool工作空间,再次进入,再次启动虚拟机(这样应该可以启动)

方法 01
ssh -p 2222 root@localhost
方法 02
cd ${HOME} && ls -alh *.sh && source 03_ssh_2222端口_用户_root_密码_123456_执行本脚本登录.sh
sshpass -p123456 ssh -p 2222 root@localhost
ssh -p 2222 root@localhost bash -c "ls -lah /root"
ssh -p 2222 root@localhost << 'EOF'
de30_exec_inside_vm() {
ls -alh /root
cd /etc
find . | wc -l
}
de30_exec_inside_vm
EOF
sshpass -p '123456' ssh -p 2222 root@localhost << 'EOF'
de60_exec_inside_vm() {
ls -alh /root
cd /etc
find . | wc -l
}
de60_exec_inside_vm
EOF
如果函数比较复杂,建议先将其写入一个脚本,然后远程执行该脚本.
#!/bin/bash
my_function() {
echo "Hello from remote VM!"
echo "Current user: $(whoami)"
echo "Date: $(date)"
}
my_function
ssh -p 2222 root@localhost 'bash -s' < remote_func.sh
bash -s 表示从标准输入读取并执行脚本.< remote_func.sh 将本地脚本内容传递给远程主机.如果你希望函数内容在运行时动态生成,可以这样写:
FUNCTION_NAME="my_remote_func"
FUNCTION_BODY="echo '这是一个可以通过拼串模式,动态创建的bash函数'; echo '虚拟内执行: \$(whoami)'; ls -lah /root"
sshpass -p '123456' ssh -p 2222 root@localhost << EOF
$FUNCTION_NAME() {
$FUNCTION_BODY
}
$FUNCTION_NAME
EOF

export source_dir=/root
export target_dir=/tmp/cm30_scp_de60_vm_target
mkdir -p ${target_dir}
cd ${target_dir}
scp \
-P 2222 \
-r \
root@localhost:/${source_dir} \
${target_dir}
ls -alh ${target_dir} && pwd
# rsync 从 cnb.cool 到 本地笔记本电脑环境(Linux或 windows 10 WSL环境) 是成功的
export source_dir=/root
export target_dir=/tmp/cm36_rsync_de60_vm_target
mkdir -p ${target_dir}
cd ${target_dir}
apt update && apt install -y rsync lsof tree psmisc && \
rsync \
-avzP \
-e "ssh -p 2222" \
root@localhost:${source_dir} .
ls -lah ${target_dir} && pwd

OpenCamp.cn Learning Qemu Camp 2025 训练营 正在火热报名中

报名链接

debian官网qcow2镜像修改root账号密码,开启ssh,修改源,语法高亮等
wget -c \
https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2
cp debian-12-generic-amd64.qcow2 \
dm30_debian-12-generic-amd64_这里是来自debian官方的原始镜像_需要用guestfish修改root密码为123456.qcow2
cp -f debian-12-generic-amd64.qcow2 \
../de60_debian_12_generic_amd64.qcow2
给cnb.cool制作qemu虚拟机_选择debian官方的_qcow2镜像_里面是安装好的虚拟机_qemu直接使用_最为方便

镜像文件信息
[debian-10.2-cloud] name=Debian 10.2.0 (Buster) Cloud osinfo=debian10 arch=x86_64 file=de60_debian_12_generic_amd64.qcow2 checksum[sha512]=296ad8345cb49e52464a0cb8bf4365eb0b9e4220c47ebdd73d134d51effc756d5554aee15027fffd038fef4ad5fa984c94208bce60572d58b2ab26f74bb2a5de format=qcow2 size=566434304 revision=20191116 notes=Debian 10.2.0 (Buster). This is a Debian installation, suited for running as OpenStack guest.
[root@support01 ~]# openssl passwd -1 123456 $1$0cFL6rLW$aKxksiunPZOskbplB5Uk90
apt update && apt install -y guestfish guestfish --rw -a de60_debian_12_generic_amd64.qcow2
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
> run
> list-filesystems
/dev/sda1: ext4
> mount /dev/sda1 /
>
编辑/etc/shadow
> vi /etc/shadow
root:*:18216:0:99999:7::: daemon:*:18216:0:99999:7::: bin:*:18216:0:99999:7::: sys:*:18216:0:99999:7::: sync:*:18216:0:99999:7::: games:*:18216:0:99999:7::: man:*:18216:0:99999:7::: lp:*:18216:0:99999:7::: mail:*:18216:0:99999:7::: news:*:18216:0:99999:7::: uucp:*:18216:0:99999:7::: proxy:*:18216:0:99999:7::: www-data:*:18216:0:99999:7::: backup:*:18216:0:99999:7::: list:*:18216:0:99999:7::: irc:*:18216:0:99999:7::: gnats:*:18216:0:99999:7::: nobody:*:18216:0:99999:7::: _apt:*:18216:0:99999:7::: systemd-timesync:*:18216:0:99999:7::: systemd-network:*:18216:0:99999:7::: systemd-resolve:*:18216:0:99999:7::: messagebus:*:18216:0:99999:7::: unscd:*:18216:0:99999:7::: ntp:*:18216:0:99999:7::: sshd:*:18216:0:99999:7:::
将root:后面的第一个*替换为第二步加密之后的密码
替换后第一行为/etc/shadow第一行为
root:$1$0cFL6rLW$aKxksiunPZOskbplB5Uk90:18216:0:99999:7:::
编辑/etc/ssh/sshd_config ,在vi中:set number开启行号
> vi /etc/ssh/sshd_config
第32行 左右 许可root用户通过ssh登录
#PermitRootLogin prohibit-password
释放掉注释,并修改值为yes,调整完之后第32行为
PermitRootLogin yes
第38行左右 许可通过ssh证书 免密码登录
# PubkeyAuthentication yes
释放掉注释,调整完之后第56行为
PubkeyAuthentication yes
第56行左右 许可 通过 用户名与用户密码 进行登录
#PasswordAuthentication yes
释放掉注释,调整完之后第56行为
PasswordAuthentication yes
格维开源社区(Gevico Tech Open Community,GTOC ),社区名称寓意**"格物致知,多维创新,技术包容,社区开放"**
以分享模拟器,虚拟化,编译器,操作系统等基础软件技术知识为目标,传播开源技术,布道开源文化.
[格维开源社区交流微信群(审核较为严格) 加微信号: zevorn 说明希望加入格维开源社区 ]
[格维技术交流QQ频道 QQ中搜索 pd87156915 ]

(qcow2注册到OpenStack之后启动虚拟机源还是默认的,目前原因未知,可待虚拟机启动后执行下列修改)
编辑/etc/apt/sources.list ,将替换为以下内容(腾讯源)
# See /etc/apt/sources.list.d/debian.sources deb https://mirrors.tencent.com/debian/ bookworm main non-free non-free-firmware contrib deb-src https://mirrors.tencent.com/debian/ bookworm main non-free non-free-firmware contrib deb https://mirrors.tencent.com/debian-security/ bookworm-security main deb-src https://mirrors.tencent.com/debian-security/ bookworm-security main deb https://mirrors.tencent.com/debian/ bookworm-updates main non-free non-free-firmware contrib deb-src https://mirrors.tencent.com/debian/ bookworm-updates main non-free non-free-firmware contrib deb https://mirrors.tencent.com/debian/ bookworm-backports main non-free non-free-firmware contrib deb-src https://mirrors.tencent.com/debian/ bookworm-backports main non-free non-free-firmware contrib
#!/bin/bash
# 函数:设置静态且不可变的 /etc/resolv.conf
# 功能:
# 1. 强制删除 /etc/resolv.conf(无论是文件还是符号链接)
# 2. 写入自定义的 DNS 服务器地址
# 3. 使用 chattr +i 锁定文件,防止被修改
# 注意:此函数需要 root 权限执行
set_static_resolv_conf() {
# 定义要写入的 DNS 服务器内容
local dns_content="nameserver 10.0.2.3
nameserver 114.114.114.114
nameserver 8.8.8.8"
echo ">>> 开始配置静态 /etc/resolv.conf..."
# 步骤 1: 强制删除现有的 /etc/resolv.conf
# -f 选项可以强制删除文件或符号链接,即使不存在也不会报错
echo ">>> 正在删除现有的 /etc/resolv.conf..."
rm -f /etc/resolv.conf
if [ $? -eq 0 ]; then
echo ">>> 已成功删除旧的 /etc/resolv.conf."
else
echo "!!! 错误:删除 /etc/resolv.conf 失败." >&2
return 1
fi
# 步骤 2: 写入新的 DNS 配置
# 使用 echo 和 > 重定向来创建新文件并写入内容
echo ">>> 正在写入新的 DNS 配置..."
echo -e "$dns_content" > /etc/resolv.conf
if [ $? -eq 0 ]; then
echo ">>> 已成功写入新的 /etc/resolv.conf."
else
echo "!!! 错误:写入 /etc/resolv.conf 失败." >&2
return 1
fi
# 步骤 3: 使用 chattr 锁定文件
# +i 属性(immutable)会让文件不能被修改,删除,重命名,即使是 root 也不行
echo ">>> 正在锁定 /etc/resolv.conf 文件..."
chattr +i /etc/resolv.conf
if [ $? -eq 0 ]; then
echo ">>> 成功!/etc/resolv.conf 已被设为不可变."
else
echo "!!! 错误:使用 chattr 锁定文件失败." >&2
return 1
fi
echo ">>> 所有操作完成!"
return 0
}
sudo hostnamectl set-hostname de60-debian-12-qemu-vm
编辑/root/.bashrc ,1,3,4,8,15行为说明注释,除此之外释放所有注释
> vi /root/.bashrc
编辑之前内容为:
# ~/.bashrc: executed by bash(1) for non-login shells. # Note: PS1 and umask are already set in /etc/profile. You should not # need this unless you want different defaults for root. # PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ ' # umask 022 # You may uncomment the following lines if you want `ls' to be colorized: # export LS_OPTIONS='--color=auto' # eval "`dircolors`" # alias ls='ls $LS_OPTIONS' # alias ll='ls $LS_OPTIONS -l' # alias l='ls $LS_OPTIONS -lA' # # Some more alias to avoid making mistakes: # alias rm='rm -i' # alias cp='cp -i' # alias mv='mv -i'
编辑之后内容为:
# ~/.bashrc: executed by bash(1) for non-login shells.
# NOTE 必须保持这样判断,这样通过scp拷贝内容的时候,不会出现问题
case $- in
*i*) ;;
*) return;;
esac
# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h_虚拟机内部:\w\$ '
# NOTE 用黄色字体显示PS1 提示符
PS1='\[\e[1;33m\]${debian_chroot:+($debian_chroot)}\h_虚拟机内部:\w\$ \[\e[0m\]'
umask 022
# You may uncomment the following lines if you want `ls' to be colorized:
export LS_OPTIONS='--color=auto'
eval "$(dircolors)"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'
# dhclient ens3
ensure_dhclient_running() {
if ! pgrep -f "dhclient.*ens3" > /dev/null; then
echo "dhclient for ens3 is not running. Starting it now..."
/sbin/dhclient ens3
fi
}
# ensure_dhclient_running
de60_exec_inside_vm() {
local lock_file="${HOME}/lc20_de60_debian_12_vm_lock.sh"
# 检查锁文件是否存在
if [ -f "$lock_file" ]; then
# echo "锁文件已存在,跳过执行."
echo "#--> 最后一次执行: $(date)" >> "$lock_file"
return 0
fi
echo "锁文件不存在,开始执行命令..."
# 执行命令序列
echo "正在显示网络接口信息..."
ip a
echo "正在为 ens3 接口获取 IP 地址..."
dhclient ens3
echo "再次显示网络接口信息..."
ip a
echo "正在显示路由表..."
ip route
echo "正在测试网络连通性(ping 8.8.8.8)..."
ping 8.8.8.8 -c 3
echo "正在测试 HTTP 连接(访问 www.baidu.com)..."
curl www.baidu.com
echo -e "\n\n\n"
hostnamectl
# 创建锁文件
touch "$lock_file"
echo "###--> 创建了锁文件: $(date)" >> "$lock_file"
echo "已创建锁文件 :$lock_file"
echo -e "\e[1;32m\n本信息只在第1次登录的时候测试网络联通性,以后登录都不会再测试了\e[0m"
}
# 调用函数
de60_exec_inside_vm
> vi /usr/share/vim/vim81/defaults.vim
78,79,80三行内容为:
if has('mouse') set mouse=a endif
在"="前面添加一个"-",编辑后内容为:
if has('mouse') set mouse-=a endif
最后执行quit命令退出guestfish,将qcow2镜像文件注册到openstack,投递虚拟机实例即可

制作一个 单一qcow2镜像文件 完整的qemu 虚拟机 把所有的虚拟机内部环境整理工作都进行完毕(例如 ssh证书 免密码登录等)
# 必须是切换到 git仓库的 main分支
git switch main
env | grep VSCODE_REMOTE
# 获得类似如下的内容
CNB_VSCODE_REMOTE_SSH_SCHEMA=vscode://vscode-remote/ssh-remote+cnb-11g-1j6caqd5t-001.59900aed-2fcf-469e-8389-2e640dea4227-qmo@remote.cnb.space:2201/workspace/
试验一下是否可以在命令行中,通过ssh登录到cnb.cool的主工作空间中去
#!/bin/bash
# NOTE 如下的URL是拷贝自上面的 CNB_VSCODE_REMOTE_SSH_SCHEMA 环境变量
export URL="vscode://vscode-remote/ssh-remote+cnb-11g-1j6caqd5t-001.59900aed-2fcf-469e-8389-2e640dea4227-qmo@remote.cnb.space:2201/workspace/"
SSH_ADDRESS=$(echo "$URL" | awk -F'+' '{print $2}' | awk -F':' '{print $1}')
export MY_CNB_CURRENT_SSH_ADDRESS="$SSH_ADDRESS"
echo "MY_CNB_CURRENT_SSH_ADDRESS=$MY_CNB_CURRENT_SSH_ADDRESS"
ssh -p 2201 ${MY_CNB_CURRENT_SSH_ADDRESS}
#!/bin/bash
# NOTE 如下的URL是拷贝自上面的 CNB_VSCODE_REMOTE_SSH_SCHEMA 环境变量
export URL="vscode://vscode-remote/ssh-remote+cnb-11g-1j6caqd5t-001.59900aed-2fcf-469e-8389-2e640dea4227-qmo@remote.cnb.space:2201/workspace/"
SSH_ADDRESS=$(echo "$URL" | awk -F'+' '{print $2}' | awk -F':' '{print $1}')
export MY_CNB_CURRENT_SSH_ADDRESS="$SSH_ADDRESS"
echo "MY_CNB_CURRENT_SSH_ADDRESS=$MY_CNB_CURRENT_SSH_ADDRESS"
# NOTE 下面需要修改为你自己的qemu qcow2镜像的地址
export my_source_qemu_vm_filename="my_qemu_vm.qcow2"
export cnb_target_dir="/tmp/cm40_de60_qemu_vm_rsync_workdir"
# NOTE 如下参数是支持断点续传的
apt update && apt install -y rsync lsof tree psmisc && \
rsync \
-avzP \
-e "ssh -p 2201" \
${my_source_qemu_vm_filename} \
${cnb_target_dir}
# NOTE 尝试通过 ssh通道 查看一下 传递到 cnb.cool主工作空间中文件的情况
ssh -p 2201 ${MY_CNB_CURRENT_SSH_ADDRESS} ls -lah "${cnb_target_dir}/${my_source_qemu_vm_filename}"
重新回到cnb.cool主工作空间中,执行类似如下的代码
# NOTE 为了简化本README 我们假设您的qemu虚拟机 只有一个qcow2文件组成
if [[ -f "${cnb_target_dir}/${my_source_qemu_vm_filename}" ]]; then
if [[ -f "/workspace/ho38_qemu_images/de60_debian_12_generic_amd64.qcow2" ]]; then
if [[ ! -f "/workspace/ho38_qemu_images/oe60_de60_debian_12_备份虚拟机/de60_debian_12_generic_amd64.qcow2" ]]; then
# NOTE 通过移动原有的文件_实现备份的目的
mv \
"/workspace/ho38_qemu_images/de60_debian_12_generic_amd64.qcow2" \
"/workspace/ho38_qemu_images/oe60_de60_debian_12_备份虚拟机/de60_debian_12_generic_amd64.qcow2"
fi
# NOTE 更改原有的镜像的名字_方便以后的_操作
echo -e "/workspace/ho38_qemu_images/oe60_de60_debian_12_备份虚拟机/bk30_$(date '+%Y-%m-%d日_%H:%M:%S秒')_虚拟机镜像备份_de60_debian_12_generic_amd64.qcow2"
mv \
"/workspace/ho38_qemu_images/oe60_de60_debian_12_备份虚拟机/de60_debian_12_generic_amd64.qcow2" \
"/workspace/ho38_qemu_images/oe60_de60_debian_12_备份虚拟机/bk30_$(date '+%Y-%m-%d日_%H:%M:%S秒')_虚拟机镜像备份_de60_debian_12_generic_amd64.qcow2"
# NOTE 把上面从您自己的qemu虚拟机的qcow2镜像拷贝到特定的位置
# 并且修改为特定的名称
# 原因是,这里一个简化的README.md 这样可以服用 我们演示仓库中 现有的脚本,更加容易跑通
cp -f \
"${cnb_target_dir}/${my_source_qemu_vm_filename}" \
"/workspace/ho38_qemu_images/oe60_de60_debian_12_备份虚拟机/de60_debian_12_generic_amd64.qcow2"
# 紧接着检查退出状态码
if [ $? -eq 0 ]; then
echo "✅ 上一个命令执行成功!"
else
echo "❌ 20_上一个命令执行失败_原因未知"
fi
else
echo -e "30_情况不明,无法继续进行"
fi
else
echo -e "60_没有发现_需要更新的_qemu_虚拟机的镜像_无法在进行操作"
fi
cd /workspace && git switch main
备份原有的.ssh证书
cd /workspace
if [[ -d "/workspace/ho38_qemu_images/sh60_debian_12_虚拟机的_一些文件/rootfs/root/.ssh" ]]; then
cp -r -f \
"/workspace/ho38_qemu_images/sh60_debian_12_虚拟机的_一些文件/rootfs/root/.ssh" \
"/workspace/ho38_qemu_images/sh60_debian_12_虚拟机的_一些文件/rootfs/root/bk30_$(date '+%Y-%m-%d日_%H:%M:%S秒')_上一个虚拟机镜像_配合的_ssh证书备份_ssh"
else
echo -e "70_没有找到原有的_ssh证书的目录_无法继续"
fi
需要把如下目录中 .ssh证书 替换为你自己的 .ssh证书, 否则 后继 无法使用 ssh证书 免密码登录 因为 证书 不一致 无法登录
cd /workspace/ho38_qemu_images/sh60_debian_12_虚拟机的_一些文件/rootfs/root/.ssh
# 手动替换这些证书
➜ .ssh git:(main) ✗ pwd
/workspace/ho38_qemu_images/sh60_debian_12_虚拟机的_一些文件/rootfs/root/.ssh
➜ .ssh git:(main) ✗ ll
total 20K
-rw-r--r-- 1 root root 748 Sep 29 08:01 authorized_keys
-rw-r--r-- 1 root root 3.4K Sep 29 08:01 id_rsa
-rw-r--r-- 1 root root 748 Sep 29 08:01 id_rsa.pub
-rw-r--r-- 1 root root 1.1K Sep 29 08:01 known_hosts
-rw-r--r-- 1 root root 714 Sep 29 08:01 readme.md
在cnb.cool主工作空间_继续进行如下操作 需要修改多个文件
我们提供了一个bash脚本 帮助进行这些改动
下面是本步骤的 主要环节
cd /workspace
# TODO 下面要特别注意_替换为您自己的docker镜像的地址
bash de93_replace_cnb_docker_image_full_path.sh \
"docker.cnb.cool/1111/os/cnb_qemu_vm:latest" \
"docker.cnb.cool/测试组织/fe30_目标仓库:latest"
# 或者如下的命令(注意:下述的方法,有可能失败)
bash de93_replace_cnb_docker_image_full_path.sh \
"docker.cnb.cool/1111/os/cnb_qemu_vm:latest" \
"$CNB_DOCKER_REGISTRY/$CNB_REPO_SLUG_LOWERCASE:latest"
下面更为完整的操作步骤
cd /workspace
git switch main
git status
# TODO 仔细看这行,这里有一个最为关键的,您必须手动修改的地方
# /workspace/DMakefile
# 大约第11行左右
# 您必须手工的修改为您的docker的地址
# 我没有办法用变量的模式,替您自动完成(经过多次尝试,我们使用变量模式都是失败的)
# 类似如下
# ce12_cnb_qemu_vm_for_os_study_IMAGE_NAME="docker.cnb.cool/1111/os/cnb_qemu_vm:latest"
# 或者如下的命令(注意:下述的方法,有可能失败)
bash de93_replace_cnb_docker_image_full_path.sh \
"docker.cnb.cool/1111/os/cnb_qemu_vm:latest" \
"$CNB_DOCKER_REGISTRY/$CNB_REPO_SLUG_LOWERCASE:latest"
cd /workspace && git add .
git commit -m "我把 de60-debian-12-qemu-vm 虚拟机的 qcow2 镜像文件 替换我自己的版本了"
apt update && apt install -y make lsof
# NOTE 下面将
# 依据main分支中的修改 对另外2个git 分支 进行git merge操作(从main分支到该分支 方向)
# git push --all
# docker build .
# docker push
[[ -f "/workspace/DMakefile" ]] && make -f DMakefile sync
退出 原有的cnb.cool的工作空间(就是那个webide)
# 可以使用如下命令,加速cnb.cool工作空间的关闭
# 不是所有的cnb.cool工作空间中,都安装好了 killall 命令
killall docker-init
等待cnb.cool工作空间完全关闭 重新点击'学习笔记'按钮,就如工作空间 就有可能是您自己的 qemu 虚拟机镜像的版本


https://docs.openstack.org/image-guide/modify-images.html#guestfish
https://blog.51cto.com/superzhangqiang/1705678
https://blog.csdn.net/weixin_42551369/article/details/88946622
http://www.chenshake.com/openstack-mirror-and-password/



原创 白嘉嘉 [财经无忌)(https://mp.weixin.qq.com/s/)
D:\21_视觉日记_新的132首\bm30_第0001阶段
C:\ge21_1111_大学生gs132正式课程\cn07_初中语文

2025年12月26日 19:32 江苏




编者按:
全国509所中小学AI教育基地中,只有1所特教学校。
南京市聋人学校成为这个“唯一”,到底意味着什么?
这是技术普惠的开始,还是个体幸运的孤例?
要回答这个问题,我们需要先走进南聋,看看这所学校到底做对了什么。
在南京市聋人学校(后称“南聋”)的每一天,聋生王汉翔都会在早上六点被震动床准时叫醒。
那是一种近似手机来电话时发出的高频震动,从床板、床架四面八方袭来,枕头和被子都无法阻挡。
但10月4号这天——举国欢度国庆假期的时候,在上海的一家宾馆里,没有震动床的提醒,王汉翔和他的几位同学,还是在副校长花钰锋的带领下早早起了床,开始了ICode国际青少年编程比赛前的热身准备。
今天是他们和全球的青少年一较高下的重要日子,在上海华东师范大学第二附属中学为全球顶尖编程少年打造高规格的竞技舞台上,他们将实现自己的编程梦想。
此刻,他们还不知道南聋将会在一个月之后,入选教育部“中小学人工智能教育基地”名单,并成为全部509所入选学校中唯一一所特殊教育学校。这份荣耀暂时还激励不到他们。
他们沉浸在编程里,老师在赛场外为他们加油,父母通过云直播关注着自己。
在比赛结果揭晓之前,让我们先看看南聋的日常。
南聋因为积极拥抱科技、基础设施完善,在特殊教育圈子里名声远扬。最近,这所学校又因为AI融合教学的诸多尝试受到关注。
12月9号这天下午,花钰锋结束在杭州的培训,刚回到办公室,采访邀约又找上了门。
他们来到南聋,是为了寻找答案:AI能为特殊人群做些什么?将如何影响他们的学习、就业和生活?


如果你在冬至前一天(12月20日,周六)的下午一点半,来到南京御道街和瑞金路的十字路口附近,可能会遇见一队穿着红蓝校服的学生。他们显得有些兴奋,稚气尚未彻底褪去的眼里透着好奇,一双脚接着一双脚走出校门。
王汉翔猜测,这些应该是南聋美术班的学生,正在外出写生,“一学期一次。”
南聋的管理是严格而有秩序的。
除了每两周末一次的外出采购时间,南聋会安排丰富的校外活动,比如外出写生、参观博物馆或社会实践、春秋游等。
对于家远的孩子而言,虽然只能等到寒、暑假或是五一、十一、元旦这样的长假才能回家,但丰富的日常活动也能一解思乡之苦。
刚来到南聋时,王汉翔对学校的“小”感到不适,他不光觉得学校的面积小——占地面积只比标准足球场大一点——就连操场、洗手间、教室也比其他学校小很多。

南聋的教学楼走廊,财经无忌现场拍摄
不过,现在他已经理解了小的原因。
南聋高中部每个年级有5到6个班,每个班只有十几个人,初、小学各一个班。人数少是特殊教育学校的特色,学校小更利于分层教学和个别化管理。
更何况,学校正在努力为学生“打开”世界。
周一到周五,南聋的同学们和所有高中生一样忙于学习。周六开始,他们会进入另一个更丰富的活动场域。
每周六的上午,学校会安排校本活动课程,多年来已经开设了20多个门类,包括排舞、羽毛球、篮球等体艺类项目,也有难得一见的“烙画”、“南京雕漆技艺”等非遗,由非遗传承人王高飞、何桂容亲自授课。
南聋“小艺术家”们的作品已经快把楼道和走廊挂满了,学校到处都是他们的“画廊”。其中一幅名为“南京特教全家福”的学生“雕漆画”作品,如今被放在南聋的随班就读资源中心,作为南京特教一家亲的精神象征。(注:南京市随班就读资源中心是统筹全市随班就读工作的专业机构。)

“全家福”内融合了南京市各所特殊教育学校的logo,
财经无忌现场拍摄
30年多年来本科率超过95%,南聋无需太过担心学生的就业问题,这些活动课的展开,是为了提升学生的综合素养。
近期,为了拓宽学生的就业道路,南聋额外为学生开展了一次咖啡体验活动。
“一是现代人爱喝咖啡;二咖啡师这个职业比较时髦;三授课老师是南聋的毕业生,拿过全国金奖,很受欢迎。”花钰锋介绍了这次活动背后学校的考量。
活动课结束,吃过午饭,时间来到中午十二点。这是一周里同学们最期待的时刻之一。宿管阿姨会把手机还给他们,通过屏幕,他们得以了解外面的世界正在发生怎样的变化。
“我们会玩游戏和看新闻。”王汉翔一边展示同学们的游戏段位,一边倒豆子般谈论起各国的时事,“(同学们)都很好奇外界发生了什么,我们会讨论类似巴以冲突这样的话题。”
但仅仅“打开”还不够。副校长花钰锋正在“主动”为学生争取更多机会。
花钰锋举例,南聋有很多共建单位,包括博物馆、戏剧学校、美术馆等。但在人们的传统观念里,很多人认为自己不会手语,就无法与学生沟通交流。
外界对南聋了解得太少,不知道这些担忧是没必要的。
AI软件已经为课堂“效劳”多年,每一节课,它都会自动将老师的话转译成字幕显示在屏幕最上方。
这两年,南聋还引进了手语数字人。在任意数字终端(比如手机、iPad、电脑屏幕)打开界面,它便会忠实地将老师讲述的信息翻译成手语、汉字、英语中的任意一门或几门语言。
外界也不知道南聋里还有“口语班”,王汉翔就是其中的一员。
和他交流时,你可以像平常一样说话,不用放慢语速。他的口音略带含糊,但并不影响理解。如果你有机会和他深度交流一会儿,或许还会惊讶于他的谦逊和思维缜密。
南聋的大门是打开的,只不过鲜有人知。花钰锋于是抓住每一个机会向同行“安利”自己的“宝藏男孩、女孩”。
11月23日,她和同为教育部“双名计划(名师名校长)”成员的另外两位老师在南聋上了一堂科学教育公开课。同学们积极的反馈给两位老师留下了深刻印象,花钰锋也与有荣焉。
“来这儿上课的老师都很开心。”花钰锋有些得意,“南聋的孩子听课不会‘洋乎洋乎(南京话,懒洋洋)’,都很投入,举手问问题非常踊跃。”

科学聋校行活动合影,从左到右:花钰锋、张怀华、李志尚、居虹涛
图源:豫见物理公众号
从花钰锋身上,你能看到南聋老师们的共性。他们几乎是下意识地表达赞美,慷慨地给予情绪价值。一位老师向花钰锋报告某工作走完了流程,她想也没想就回复对方:“你看,还得是你呀,太厉害了。”对方笑得眼睛眯成了一条缝。
王汉翔来到南聋一个学期之后,才渐渐打开内心。
和很多在普通学校就读的特殊人群一样,他也有过成绩倒数,被同学冷漠对待,自我边缘化的经历。有时老师会因为成绩不好责罚他,他理解这位老师的严苛,但确实学得很吃力。
最初,他担心南聋的老师也会如此,可不知从什么时候开始担忧已经消失了,就像没人知道冬天的浮冰什么时候开始融化,无数细节组成了一个印象:
“生活中有困难的话老师会尽力帮我,学习不会的话,她也会反复教。一遍、两遍、三遍,都没关系。”
走进南聋校园,沿着绿荫小道走到底右转,面前走廊的右手边,设置着一些名师的介绍。第一位就是花钰锋。
就在12月,她的工作室成为了南京首批“AI+名师工作室”。从2022年末AI热兴起开始,她就一直在尝试将AI融入教学。
有段时间,英语老师生病请假,花钰锋主动代课。她把教学设计、视频动画、练习题都交给AI智能体处理,也受到了学生的欢迎。
如果你担心AI生成的课件不够专业,那大可不必——花钰锋保持着教师的严谨。她会把教学环节拍给生病的老师,向对方求证内容是否可靠。请假的老师也乐得如此,因为从中也能获得用AI辅助工作的经验。
影响力一点点蔓延。先是愿意拥抱新技术的老师组成了“数智先锋团队”,在内部开展培训,然后扩大到全校。
一些资深的老师也加入进来了。
他们发现借助AI,制作拼图游戏、连词游戏这些调节课堂气氛的小程序变得轻而易举。课堂也变得有趣。语文、英语课本里干巴巴的故事,可以通过AI变成生动的动画。数学课本也可以。物理课本也可以。
“不能说每节课都会用,但至少保证每位老师都接触和了解到了。”花钰锋表示,南聋不会勉强老师使用AI,但基础的AI使用技巧已经被列入了学校的通识性培训。除此之外,学校还重点组织了一批老师,研究生成式人工智能在“个别化教育”领域的应用。
所谓个别化教育,就是为每位学生量身定制学习计划。即便每个班级只有十余位学生,但学习层级仍有较大的区别。
2024年和2025年,南聋的所有应届生都考上了本科——这已经是超越大多数普通学校的成绩,但很显然,南聋并不打算止步于此。
背后的原因或许在于,一定程度上,南聋学生的升学和就业,代表的是聋人群体进入社会所能达到的群体性上限。
作为全国最顶尖的聋人高中之一,南聋的学生都是优中选优。
每一年,来自全国各地的70多名聋生通过入学测试进入学校。他们能在AI的辅助下取得怎样的进展,在某种程度上也反映了现阶段AI技术改善聋人处境的极限。
花钰锋对AI予以厚望。“AI时代,自学显得特别重要。自学能力强的孩子,AI赋能的力度就会很大。”她鼓励学生多接触AI,“你们现在学会用AI,就能接触到更多知识。”AI会拉大人与人之间的差距,但也是追赶的契机。
她拿学生陈宏元举例。
来到南聋之前,陈宏元在内蒙古的一所特殊教育初中就读,当地没有开设英语课。高考之前,陈宏元满打满算只学了4年英语。即便如此,他还是考上了号称“特殊教育界小清华”的天津理工大学。
“虽然他的高考成绩达不到清华北大的录取分数线,但他的计算机专业水平已经够高了。”花钰锋说,“许多聋生学习能力很强,只是因为客观原因没法去考。随着AI技术进一步发展,这层桎梏可能会被打破。”
陈宏元在手机上向花钰锋报喜,图源:花钰锋提供
但这里有一个值得追问的问题:为什么是花钰锋?
花钰锋的主动和魄力,在全国特教校长中是常态还是例外?如果没有这样的学校领导,南聋还能成为“唯一”吗?
这个“唯一”的分量,或许比我们想象的更重。
截至2023年,全国共有特殊教育学校2345所,其中聋人学校389所、盲人学校26所、培智学校568所。在校生91.2万人,专任教师7.28万人,师生比约为1:12.5。
但在教育部公布的509所AI教育基地中,特教学校只有南京聋校这1所。换句话说,2345所特教学校中,只有0.04%获得了国家级AI教育基地的认证。
这不仅仅是南聋的荣耀,更是2344所学校的缺失。
一项针对美国特教系统的调查显示,80%以上的特教老师缺乏AI设备或技术支持人员,96%的老师缺乏相关培训。中国的情况或许更不乐观。
大多数特教学校面临的困境是:设备采购价格昂贵、运行成本高、师资数字化能力不足、缺乏专业技术支持。
更重要的是,缺乏像花钰锋这样主动争取、系统推进的领导力。
南聋的成功,建立在学校管理层的主动、南京市教育局的支持、科技公司的善意这三个条件的叠加之上。但这三个条件,对全国大多数特教学校来说,都不具备。


如果你向南聋校书记陈源清询问手语数字人,他会向你演示这套系统。这套系统由果不其然无障碍科技(苏州)有限公司研发,法定代表人杨阳本人就是聋人,担任“译语”AI手语项目研发负责人。
这套系统可以将老师讲述的信息翻译成手语、汉字、英语中的任意一门或几门语言,在任意数字终端(手机、iPad、电脑屏幕)打开界面就能使用。被视为“天花板级”AI应用。
但演示完,陈源清会迅速关掉软件。
每小时成本约200元。南聋表示“价格太高,负担不起”,很难引入教学。

南聋手语博物馆内的手语数字人,财经无忌现场拍摄
事实上,即便是南聋,也受到资源不足困扰。花钰锋表示,目前学校里用到的AI工具基本都是免费的,只有智慧体育除外,因为包含硬件设施和数据平台,必须花钱。
这意味着,南聋的AI教学,很大程度上依赖于免费工具和科技公司的善意。一旦这些支持消失,南聋的AI优势也会随之消失。
连南聋这样的顶尖特教学校都“负担不起”的技术成本,对全国其他特教学校意味着什么?
将视野看向校外,资源不足或许还体现在科技公司对手语数字人的研发投入不足、深度不够。
北京师范大学教育学部教授、国家手语与盲文研究中心成员郑璇在文章《手语数字人研发现状与思考》中列出手语数字人遭受“质疑、反感和抗阻”的4条原因,其中两条是:“研发人员对手语的独特语言特性缺乏认知”,“现有技术水平无法匹配聋人用户需求,生成的手语可懂度低,且表情与口型难以做到仿真”。
手语远比许多人想象的要难,这是事实。
中国手语中的手势能与汉语词语一一对应的仅占50%。除了双手动作之外,手语还会使用表情、体态来进行表达,如果缺少了配合,就无法传递出完整的意思。
但值得追问的是,当越来越多宛若真人的数字人主播,开始在直播间里声情并茂地带货,手语真的是一道难以跨越的技术门槛吗?
这是技术的门槛。
更现实的问题是就业。
根据中国残联的数据,截至2023年末,全国持证残疾人8591.4万,持证残疾人就业人数906.1万,刚过十分之一。即使是有工作的残疾人,很多也只能在福利岗位上拿着每月2000多元的工资。
花钰锋显得忧喜参半,语气从轻快变得抑扬顿挫,仿佛吐出压在心里的石头:“学生不愿意去企业福利岗位。他们有思想,希望能在社会里承担一些责任,去做更有意义的事情。”
AI让聋生有能力达到更高的学术水平,但就业市场会因此改变对残疾人的偏见吗?技术突破与社会接纳之间,还有多远的距离需要跨越?
这是社会的门槛。
书记陈源清猜测,特殊教育学校的身份可能为南聋入选AI基地提供了一定的助力。南聋是南京市教育局直属学校,能享受更大力度的资金、政策支持。
但在这些关注背后,是更多沉默的特教学校。
12月,来自四川省绵阳市涪城区特殊教育学校的三位年轻女老师来南聋调研学习。涪城区特教学校是当地唯一一所特教学校,已在教学中初步应用AI技术——用AI结合知识库做教学设计,生成视频“活化课本”,有组织地开展网课。
但她们的资源,远不如南聋。
科技不能只在赚钱时进步,需要承担社会责任时畏缩不前。
这句话的分量,或许需要一些数据来支撑。
2024年,腾讯的研发投入超过700亿元,阿里接近600亿元,科大讯飞的研发费用也达到38.92亿元。这些投入,主要集中在商业化场景——广告、电商、自动驾驶、芯片。
但在特殊教育领域,这些科技公司的专项投入数据,几乎都是“未公开”。
腾讯的99公益日,2023年单日募资超过38亿元,但用于特殊教育的比例,同样是“未公开”。
不是没有钱,而是没有投向这里。
南聋的成功,某种程度上是“主动争取”的结果。花钰锋主动联系科技公司和高等院校,主动接触并推动AI教学。但这种模式能复制吗?
在科技公司的商业版图里,特殊教育从来不是优先级。这是现实。但这个现实,应该被改变吗?
南聋的AI经验具有普适性吗?这个问题的答案,决定了南聋的经验,是会成为全国特教学校的样板,还是会成为一个孤立的“幸运样本”。


科技的“跬步”正在一点点跨越听力障碍,但身处其中的南聋同学们并不仅仅是单纯的受惠者。他们也是探索者。
很多人的探索,是从一台驾驶飞船的机器人开始的。
这是一款名叫“ICode”的编程学习软件,你需要控制机器人翻越各种障碍收集能量,但和其他游戏不同的是,你没有上下左右按钮,每一步都需要编写代码。
为了过关,你需要学会带参数函数、多次递归、多重递归……如果足够有毅力和天赋,一路过关斩将的终点,将会是ICode比赛的领奖台。
谷景奇已经拿过三次国际金奖了。这个一米七九的男孩高高瘦瘦,顶着颇有极客气质的发型,说话彬彬有礼,手指纤长有力。
现在是他在南聋的最后一个学年,还有几个月就将迈入高考考场。为了考上“小清华”,谷景奇连吃饭都带着英语书,但今年10月,他还是抽空准备并参加了ICode比赛——尽管金牌不能带来任何高考加分。
ICode比赛全称ICode国际青少年编程竞赛,包括预选赛、中国区决赛、全球赛三个赛段,参赛选手是来自世界各地6到18岁的青少年。
对南聋的学生来说,这是他们与全球青少年公平竞争的机会,某种程度上,这个机会是他们和副校长花钰锋一起争取来的。
通往领奖台的第一级台阶出现在2022年。
经南京市教学研究室推荐,花钰锋发现ICode很适配特殊教育的需求——难度恰好介于纯代码编程和模块化编程之间,关卡式设计又能及时提供正反馈。于是她添加了ICode工作人员的微信,询问注册方式。没曾想,对方开门第一句就回复她:“你们是特殊教育学校,可以免费使用。”
免费的消息让花钰锋喜出望外。她原本只打算给4到5个同学开通账号(毕竟每年1000元的费用并不便宜),现在则可以让更多学生参与其中。

ICode学习界面,财经无忌现场拍摄
教会任何人编程都不容易,对聋生来说,难度会更大一些。
英语是第一道坎。来到南聋之前,一些特殊教育学校不开设英语课程。因此,要理解以英语为基础的编程语言,他们首先就得下一番苦功夫。其次,教授纯代码编程涉及许多抽象表达,手语教学难免存在局限性,学生理解起来相对困难。
有了合适的工具,同学们的专注天赋被最大程度地激发了。短短十几天,花钰锋的得意门生、谷景奇的“师父”陈宏元就冲到了全球排行榜第84名。
花钰锋向ICode工作人员展示了这一成绩,对方顺势邀请他们参加比赛。于是,同学们获得了与其他青少年同台竞技的机会。从市级到省级、国家级再到国际级,每一年他们都能捧回数块奖牌。
2025年,学校获得ICode中国区组委会“优秀组织金奖”。
这些奖牌和奖杯如今陈列在学校四楼的Steam课程基地——这里配置了苹果电脑、3D打印机、激光雕刻机、机器人以及各种电子元件,并且对学生保持开放。这意味着,只要他们愿意,随时都能接触到前沿科技。

南聋的Steam课程基地,财经无忌现场拍摄
对谷景奇来说,这间教室更像是“传道授业解惑”的“道场”。就像从前陈宏元带着谷景奇学编程,如今谷景奇也成了学弟学妹们的“师父”。
这种“传帮带”已经在南聋成为一种传统,一届学生的理想激励着下一届。
谷景奇想考去天津理工大学找陈宏元,高二的学弟陈君豪、王汉翔,高一的学弟费鸿煊,想去天津理工大学找谷景奇。
他们希望毕业后能从事科技行业:费鸿煊想去大厂设计软件——他对摇一摇广告尤其不满;陈君豪希望自己能一路读到博士,去设计国产芯片;谷景奇和王汉翔都想成为研发机器人的工程师,“做医疗机器人去帮助其他人”。

从左到右依次为:陈君豪、王汉翔、谷景奇、费鸿煊,
身后是历届南聋学生获得的编程比赛奖牌、证书,
财经无忌现场拍摄
在这根纽带的起点,花钰锋也期待着在大学里进修计算机专业的陈宏元,能为学弟学妹们做出榜样。
大一期间,陈宏元以“优秀”的成绩考取了Office、Python、C语言三张计算机等级考试二级证书,今年9月又考取了网络技术三级证书。
花钰锋评价这是“了不起”的成就。“他有天赋,即便放在所有同龄人中,成绩也值得骄傲。他将来朝软件方向就业一定没问题。”
上一学年,陈宏元专业学习全年第一名,领跑同级同学,获得了人民奖学金一等奖和励志奖学金资格。
但陈宏元专业第一,他毕业后能获得和健全人一样的机会吗?
董媛是南聋信息中心副主任,她亲眼见证听力障碍带来的阻碍被科技的力量一点点打破。
最初,每天早上,老师拿着木棍走进一间间宿舍,通过敲击床架叫醒每一位学生。后来有了震动床,早上六点准时叫醒。有人按门铃,床震动;老师通知,床震动;火灾警铃响起,床也震动。
2018年前后,震动床系统、硬件进行升级换代,添加了视觉信息层:宿舍增加屏幕,床会震、灯会闪烁,显示屏上也会显示相应的文字,多维度传递信息。老师可以远程文字输入,精确到某间宿舍。师生交互“变得比普通中学更加方便”。

南聋宿舍内配备了震动床和led显示屏,
学生可通过宿舍内按钮来回应消息。
图源:南京教育发布
董媛温柔地看着面前的四个孩子——谷景奇、陈君豪、王汉翔、费鸿煊。
陈君豪说,自己的芯片博士梦想好像“不太可能”实现。
董媛当时下意识就反问了一句:“为什么不可能?”
她双手握拳交叉在胸口轻敲——这是手语里懒惰的意思,对陈君豪说:“你很聪明,只要去掉身上的惰性,就一定能做到。”
陈君豪对AI的理解,不只停留在工具层面。他掰着手指讨论AI时代生产要素的变化:“生产者、生产资料和生产对象是生产的三要素,以前它们都是围着人转的,未来机器人变得更全能,就都围着它转了。”
董媛说:“所以我们正处在历史的一个关键转折点上。”
2023年到2024年,残疾博士研究生数量从连续多年的169人大幅提升至239人。“道路正在变宽。”


10月4日下午,比赛结果揭晓。
银牌。又是一块银牌。
这是王汉翔的第二块银牌,第一块被“兴奋得情难自抑”的父母,妥善地保管在家里。下午四点多领奖时,他既没有松了口气的感觉,也没有遗憾。
他设想过拿金奖:“那表示很厉害。”但对银牌,他原本没有特别想法,直到获奖后才沉淀出理解。
“我不要求拿到第一,只要拿到自己的位置就行。”王汉翔说。
这是花钰锋经常说的话:拿到自己的位置。
“我们不是要培养第一名,而是要让每个孩子找到自己的位置。”花钰锋说,“有的人适合编程,有的人适合设计,有的人适合做老师。重要的是,他们知道自己能做什么,想做什么。”
王汉翔现在知道了。他想成为工程师,和爸爸一样。
“我想做那种研究机器人的工程师。”他说,“研究医疗机器人去帮助其他人。”
王汉翔还记得,他第一次参加ICode竞赛时心里的忐忑。
“我觉得自己是聋人,不应该和健全人比。”他说。
而现在,这个想法或许尚未完全消失,但至少,他们正在生出直面它的勇气。
在那个四位学生对谈的下午,编程比赛的奖牌挂满了他们身后的半面墙,他们提起曾经因听力障碍受孤立的回忆,场面一度陷入沉默,每个人都低着头。
“那些都是我的来时路。”谷景奇打破沉默,昂着头,眼里透着倔强。紧接着,王汉翔、陈君豪、费鸿煊也抬起了头。
从“我不配”,到“为什么不可能”,再到“拿到自己的位置”。
这个变化,比任何技术都更有意义。
每一天晚上,王汉翔回到宿舍,躺在那张会震动的床上。
早晨,南京市聋人学校的学生们,依然在震动中醒来。震动床已经从人工敲击床架,进化到了自动化,再进化到了可视化。
这是技术进步的缩影。
但王汉翔“拿到自己的位置”,是因为他足够努力,还是因为他足够幸运?他遇到了南京市聋人学校,遇到了AI技术,遇到了花钰锋这样的校长,遇到了谷景奇这样的师父。

南京聋人学校副校长花钰锋 图源:南京市聋人学校
全国有2000多所特教学校,但AI教育基地里,只有南聋这一所。
南聋成为“唯一”,是技术普惠的开始,还是个体幸运的孤例?
这个问题的答案,不在南聋,也不在任何一所学校。它在每一个科技公司的决策会议上,在每一笔教育经费的分配方案里,在每一个普通人对“公平”的理解中。
509所AI教育基地,应该有更多的特教学校。
这不是一个技术问题,而是一个选择问题。
学习笔记

大力弘扬教育家精神
