logo
3
5
WeChat Login

本方式方法的特点

在没有KVM虚拟化加速的情况下,直接利用cnb.cool强大的CPU算力,直接运行操作系统试验用的 Qemu 虚拟机,给学生做'Dora OS'的内核试验

特别备注 由于Dora OS等的 崭新的"面向AI时代的新型机器人操作系统"的复杂性,我们这次没有用Dora OS作为案例;

我们只是演示cnb.cool与Qemu虚拟机的结合

演示的只是 Debian 12 bookworm 与 alpine 3.22.0 两个版本

李晓飞同学的优秀图片_强势动力来自_CNB(https://cnb.cool/xiaofei/xiaofei)

特别说明

本模式只适合 广大计算机学院,软件学院,网络学院学生学习 操作系统试验课程 通过qemu虚拟机软件 做技术试验

通过qemu虚拟机 调试 自己的 linux内核源代码 这个 调试 环节是必须用到 qemu虚拟机的

在操作系统试验中, 有一个 准备根文件系统 步骤 必须使用 qemu虚拟机

类似编译 RISC-V 指令集上的 linux 内核源代码,在cnb.cool主工作空间进行,速度更快,编译 linux内核源代码,不要在qemu虚拟机内进行

编译 RISC-v指令集上的linux源代码 也可以通过直接使用 相应的 docker镜像与容器,更快的进行

本案例,仅用来自 debian 官方的 debian 12 qcow2镜像作为案例, "这个镜像 在cnb.cool的qemu虚拟机中 '调试操作系统内核' 与 '构建轻型的根文件系统' 速度还是不错的"

学习黄大年老师, 为 人工智能时代"操作系统试验与AI学伴 根技术" 人才培养的破局之道 共享CNB.COOL的澎湃力量

本图原文地址 深度对话北大清华等高校专家:AI正在重塑操作系统人才培养体系

cn30_人工智能时代_操作系统试验_根技术_人才培养的破局之道

ima知识库 opencamp与格维开源社区合作的全国首个Qemu专题训练营

bq33_qemu知识库_格维开源社区

git分支就是独立地,可以立即运行的 qemu虚拟机

仿照优秀的cnb.cool团队提出的 git分支 就是不同的 deepseek 大语言模型的

下图2个标有"虚拟机"后缀的分支,选中该分支以后,点击"学习笔记"(橙色)按钮,就可立即启动CNB的工作空间,按照配置自动启动Qemu虚拟机

debian-12-qemu-vm-虚拟机 [用户名 root 用户密码是 123456]

alpine-3.2.20-docker容器中通过qemu-2层结构-虚拟机 [用户名 root 没有密码]

bm61_qemu_CNB_Git分支_就是可以独立运行的_Qemu虚拟机

步骤01: 选择 git分支 "debian-12-qemu-vm-虚拟机" 立即启动 de60-debian-12-qemu-vm 虚拟机

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

bk51_qemu_分支就是独立的虚拟机_de60_debian_12_qemu虚拟机

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

bk53_接上_直接进入了_虚拟机_用户名root_密码123456

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

bk58_接上_看看de60虚拟机内部的_linux内核

步骤02: 选择 git分支 "alpine-3.2.20-docker容器中通过qemu-2层结构-虚拟机" 使用qemux/qemu容器 运行qemu虚拟机alpine

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

bk59_qemu_alpine独立虚拟机

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

bk85_qemu_apline虚拟机

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

bm59_qemu_alpine虚拟机_通过novnc_6080端口可以访问

步骤03: 选择 git分支 "main" 这里是制作 git分支就是独立地qemu虚拟机的主要分支

其他分支都是方便,直接运行虚拟机 main分支,是进行 操作系统内核试验的 主要工作分支

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

bk86_qemu_main分支_进入_CNB_WELCOME界面

上图的核心配置如下

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 虚拟机 bk87_qemu_main分支_选择_make_de60_启动qemu虚拟机

每一机器人身上_都运行多个_不同类型的_操作系统

北京灵心巧手公司弹奏钢琴的表演机器人

灵心巧手 网址 专注于人工智能和机器人解决方案,帮助开发者,企业,科研机构快速实现真实场景落地

cn36_每一个机器人身上_都运行着_多个_操作系统

展望未来_智能机器人普及速度_需要大量_懂得AI_懂得操作系统内核_懂得具身智能机器人的_高端人才

bm35_展望未来_具身智能机器人_发展趋势

如何使用 de60-debian-12-qemu-vm 等虚拟机

快速启动 de60-debian-12-qemu-vm 虚拟机

cd ${HOME} && make help && make de60

在cnb.cool的主工作空间 查询当前 哪些 qemu虚拟机正在运行

ps aux | grep qemu | grep 'name'

快速关闭 de60-debian-12-qemu-vm 虚拟机

方法一 (安全关闭): 通过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工作空间,再次进入,再次启动虚拟机(这样应该可以启动)

bk71_接上_如何停止_de60_debian_12_qemu虚拟机

如何通过ssh 证书模式,免密码快速登录到 de60-debian-12-qemu-vm 虚拟机的内部

方法 01

ssh -p 2222 root@localhost

方法 02

cd ${HOME} && ls -alh *.sh && source 03_ssh_2222端口_用户_root_密码_123456_执行本脚本登录.sh

如何通过ssh 用户名与用户密码方式, 登录到 de60-debian-12-qemu-vm 虚拟机内部

sshpass -p123456 ssh -p 2222 root@localhost

如何通过 ssh 在 de60-debian-12-qemu-vm 虚拟机内部 直接执行一个命令

样例 01: 执行简单的命令

ssh -p 2222 root@localhost bash -c "ls -lah /root"

样例 02: 把一个bash函数传递进入虚拟机 在虚拟机中执行 该bash函数

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

样例 03: 将函数写入脚本并远程执行

如果函数比较复杂,建议先将其写入一个脚本,然后远程执行该脚本.

1. 创建本地脚本(如 remote_func.sh)
#!/bin/bash
my_function() {
  echo "Hello from remote VM!"
  echo "Current user: $(whoami)"
  echo "Date: $(date)"
}
my_function
2. 使用 sshpass + ssh 远程执行该脚本
ssh -p 2222 root@localhost 'bash -s' < remote_func.sh
说明
  • bash -s 表示从标准输入读取并执行脚本.
  • < remote_func.sh 将本地脚本内容传递给远程主机.

样例 04: 动态生成函数并执行

如果你希望函数内容在运行时动态生成,可以这样写:

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

在cnb.cool主工作空间中,如何拷贝 de60-debian-12-qemu-vm 虚拟机的文件到 cnb.cool的主工作空间


bq39_cnb_cool_女孩_许愿.png

参考样例 01: 通过 scp 命令

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


参考样例 02: 通过 rsync 命令

# 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


学者计划 灵心巧手(北京)科技有限公司

灵心巧手开发者中心

bm41_灵心巧手_学者计划

最优秀的人才,都会参加 "OpenCamp.CN" 举办的Qemu训练营

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

立即点击 报名链接

bm03_qemu_最优秀的_人才_都会参加_OpenCamp_CN举办的Qemu训练营

报名链接

bm07_opencamp_qemu报名链接

debian官网qcow2镜像修改root账号密码,开启ssh,修改源,语法高亮等

debian官网qcow2镜像修改root账号密码,开启ssh,修改源,语法高亮等

原文地址

本文解决问题如下:

  1. 设置root账号密码
  2. 开启root账号ssh连接
  3. 开启ssh语法高亮
  4. 解决vi编辑界面不允许复制问题

02 准备工作

1,下载官网qcow2镜像文件

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直接使用_最为方便

bk89_qemu_选择debian官方的_qcow2镜像_里面是安装好的虚拟机_qemu直接使用_最为方便.png

镜像文件信息

[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.

2,使用openssl passwd -1 123456生成加密的密码:-1表示使用MD5算法对密码123456进行加密

[root@support01 ~]# openssl passwd -1 123456
$1$0cFL6rLW$aKxksiunPZOskbplB5Uk90

3,使用guestfish命令进入交互命令界面依次执行run,list-filesystems,mount等指令

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 /
>

06,修改root账号密码

编辑/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:::

08,开启root账号ssh远程登录

编辑/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 ),社区名称寓意**"格物致知,多维创新,技术包容,社区开放"**

以分享模拟器,虚拟化,编译器,操作系统等基础软件技术知识为目标,传播开源技术,布道开源文化.

联系电子邮件: chao.liu@yeah.net

[格维开源社区交流微信群(审核较为严格) 加微信号: zevorn 说明希望加入格维开源社区 ]

[格维技术交流QQ频道 QQ中搜索 pd87156915 ]

bm99_opencamp_与著名的开源社区_格维社区.png

12,修改apt源,

(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

14.修改 /etc/resolv.conf 的nameserver 配置

#!/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
}


16,修改虚拟机内的hostname

sudo hostnamectl set-hostname de60-debian-12-qemu-vm

18,开启ssh语法高亮以及内置命令别名

编辑/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


20,允许在vi窗口中复制文本

>  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,投递虚拟机实例即可

如何快速把自己的qemu虚拟机qcow2镜像上传到cnb.cool工作空间,并使用起来

bm21_加入我们_爱因斯坦与机械猫

在自己的物理机上

制作一个 单一qcow2镜像文件 完整的qemu 虚拟机 把所有的虚拟机内部环境整理工作都进行完毕(例如 ssh证书 免密码登录等)

通过rsync命令(支持断点续传),把该镜像通过ssh通道传送到cnb.cool的工作空间中

步骤 01: 如下在cnb.cool的工作空间中操作

# 必须是切换到 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/


步骤 02: 如下在你自己的物理机器上操作(这里假设你是 linux的工作环境)

试验一下是否可以在命令行中,通过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}

步骤 03:

#!/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}"




步骤 04:

重新回到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

步骤 05:

备份原有的.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

步骤 06 特别注意:

需要把如下目录中 .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

步骤 07:

在cnb.cool主工作空间_继续进行如下操作 需要修改多个文件

  • DMakefile
  • .cnb.yml
  • Makefile

我们提供了一个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



步骤 08:

退出 原有的cnb.cool的工作空间(就是那个webide)

# 可以使用如下命令,加速cnb.cool工作空间的关闭
# 不是所有的cnb.cool工作空间中,都安装好了 killall 命令
killall docker-init

等待cnb.cool工作空间完全关闭 重新点击'学习笔记'按钮,就如工作空间 就有可能是您自己的 qemu 虚拟机镜像的版本


学习人民教育家 黄大年老师 与 "国家杰出贡献科学家"钱学森 钱老

bm29_人民科创_钱学森

锦绣山河 我们在北京就等你来

bm40_锦绣山河_我们在北京就等你来

参考链接:

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/

CNB云原生澎湃动力—与Qemu虚拟机-微信群-请扫码-积极加入我们的-技术群

bq29_cnb微信群_二维码_到2025年10月20日.png


bq49_人生苦短_不用你管_我就喜欢_cnb_cool.png


bq31_cnb_qq群_二维码.png

About

人工智能时代"根技术"人才培养的破局之道 从全球视野出发,强调AI+X发展对“超级系统”支撑的迫切需求。 清华大学陈渝副教授提出,高校必须与产业深度合作,让学生在校内就能接触芯片、嵌入式系统等底层核心,培养能够承担AI全栈研发任务的复合型人才。 格物致知、多维创新、技术包容、社区开放 学中做 做中学 创中学 讲中学 跨越山海 AI相伴

Language
Shell58.6%
Makefile36.5%
Dockerfile5%