{"id":26136010,"url":"https://github.com/linux-kernel-labs-zh/so2-labs","last_synced_at":"2025-09-14T21:20:16.569Z","repository":{"id":235140768,"uuid":"789993302","full_name":"linux-kernel-labs-zh/so2-labs","owner":"linux-kernel-labs-zh","description":null,"archived":false,"fork":false,"pushed_at":"2024-04-22T09:33:43.000Z","size":320,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2024-04-22T11:44:58.452Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linux-kernel-labs-zh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-04-22T04:13:17.000Z","updated_at":"2024-04-22T11:45:01.503Z","dependencies_parsed_at":"2024-04-22T11:45:01.388Z","dependency_job_id":"dc82277b-ac79-4dcb-9f23-ff62db3e6567","html_url":"https://github.com/linux-kernel-labs-zh/so2-labs","commit_stats":null,"previous_names":["linux-kernel-labs-zh/so2-labs"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linux-kernel-labs-zh%2Fso2-labs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linux-kernel-labs-zh%2Fso2-labs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linux-kernel-labs-zh%2Fso2-labs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linux-kernel-labs-zh%2Fso2-labs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linux-kernel-labs-zh","download_url":"https://codeload.github.com/linux-kernel-labs-zh/so2-labs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242945833,"owners_count":20210762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-11T00:06:30.009Z","updated_at":"2025-03-11T00:06:30.106Z","avatar_url":"https://github.com/linux-kernel-labs-zh.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SO2 实验室辅助基础设施\n\n本仓库包括一个脚本，用于启动一个 Docker 容器，该容器配备有编译好的 [Linux 内核](https://github.com/linux-kernel-labs/linux)，用于 SO2 实验。\n\n# 快速开始\n\n要启动 Docker，请运行以下命令：\n\n```bash\n# 如果在 Linux 上运行\n$ sudo ./local.sh docker interactive --privileged\n# 如果在 WSL 上运行\n$ sudo ./local.sh docker interactive\n```\n\n如果出现错误，请参阅[如何解决错误](#如何解决错误)。\n\n\u003e [!WARNING]\n\u003e 第一次运行上述命令时，会花费一些时间，因为脚本将从[注册表](https://gitlab.cs.pub.ro/so2/so2-assignments/container_registry)中获取镜像。如果你直接在物理机上运行 Linux，则借助 `--privileged` 参数你可以使用 KVM。\n\n成功执行该命令后，你将看到 Docker shell 提示：\n\n![docker_shell](./img/docker_shell.png)\n\n请注意，在 Docker 环境中的 `/linux` 目录会挂载到 Docker 卷，以确保在 `/linux` 目录中进行的任何修改都会持久保存（即使容器停止）。此外要注意，在 Docker 环境中的工作目录是 `/linux/tools/labs`。这个目录是我们编译模块和启动虚拟机的地方。你至少需要两个 Docker 内部的终端。一个用于编译，一个用于虚拟机控制台。建议使用 `tmux`（查看 [TMUX 速查表](#tmux-速查表)小节）。你只需输入以下命令：\n\n```bash\n$ tmux\n```\n\n你应该会看到类似的输出：\n\n![docker_tmux](./img/docker_tmux.png)\n\n要为当前实验生成骨架，请执行以下命令，注意将 `\u003c实验名称\u003e` 替换为相应的实验名称：\n\n```bash\n$ LABS=\u003c实验名称\u003e make skels\n```\n\n接下来，要启动 SO2 虚拟机，只需运行：\n\n```bash\nmake console\n```\n\n你可能需要等待几秒钟。记得使用 `root` 用户名登录。\n\n如果一切顺利，你应该会看到类似的内容：\n\n![docker_tmux_VM](./img/docker_tmux_VM.png)\n\n在上面的窗格中，我们在虚拟机内操作，在下面的窗格中，我们在 Docker 内操作。`skels` 目录在 Docker 容器和虚拟机之间共享。我们的工作流程包括在 Docker 内构建模块，然后通过 `insmod` 命令将它们插入虚拟机，或者通过 `rmmod` 将它们移除。要启动模块构建过程，请在 Docker 内运行以下命令：\n\n```bash\n$ make build\n```\n\n\u003e [!WARNING]\n\u003e 每次构建模块时，你**无需**重新启动虚拟机。但是，如果你想停止虚拟机，请先按下组合键 `Ctrl + A`，然后按下 `q`。\n\n# 使用 qemu 显示启动虚拟机（在 Docker 内）\n\n使用以下命令启动 Docker：\n\n```bash\n$ sudo ./local.sh docker interactive --allow-gui\n```\n\n\u003e [!WARNING]\n\u003e 如果你正在使用 WSL，请在启动虚拟机之前按照以下步骤进行操作！\n\n（在 Docker 内）使用以下命令启动虚拟机：\n\n```bash\nmake gui\n```\n\n只有在 WSL 上，我们才需要安装 X11 服务器：从[这里](https://sourceforge.net/projects/vcxsrv/)下载并运行安装程序。安装完成后，运行 XLaunch 应用程序，并确保选中以下复选框。务必确保 XLaunch 应用程序正在运行！\n\n![XLaunch](./img/XLaunch.png)\n\n还有，要确保在 Windows 防火墙管理器中选中了 VcXsrv 的两个复选框。\n\n![XLaunch2](./img/XLaunch2.png)\n\n现在，你应该可以运行 `make gui` 命令了。\n\n\u003e [!WARNING]\n\u003e 就像使用 `make console` 时一样，每次构建模块时**无需**重新启动虚拟机。但是，如果你想停止虚拟机，请按下组合键 `Ctrl + A`，然后按下 `q`（在控制台中按下，而不是在 qemu 显示中）。要释放处于 qemu 显示区域的鼠标，请使用 `Ctrl + Alt + g`。\n\n# 使用 VIM + CSCOPE 搜索符号\n\n在 Docker 镜像中编译的内核还包含一个 cscope 数据库，你可以使用 vim 来利用其进行符号搜索。TODO：添加命令\n\n# 使用 VSCode\n\n尽管我们爱 `vim`，但它并不是唯一的编辑器。如果你需要更加高级的编辑器，可以使用 VSCode。为了使用 VSCode，我们有两种方法，你需要访问 `/linux` 树所挂载的目录。\n\n## 选项 1（适用于 WSL 和 Linux）\n\n在 VSCode 中安装 `Dev Containers` 和 `WSL` 扩展，连接到容器，并打开 `/linux` 目录。\n\n## 选项 2（适用于 Linux）\n\n打开主机上的卷挂载点。当你执行 `local.sh` 脚本时，这些信息将显示在开头。\n\n![VScode](./img/VScode.png)\n\n你可能需要以 `root` 用户身份启动 VSCode：\n\n```bash\nsudo code --no-sandbox --user-data-dir /root\n```\n\n之后，你只需要打开上面在“Mountpoint”字段中列出的目录。在本情况下，它是 `/var/lib/docker/volumes/SO2_DOCKER_VOLUME/_data`。\n\n# TMUX 速查表\n\n* 垂直分割： `Ctrl + b` 然后 `SHIFT + %`\n* 水平分割： `Ctrl + b` 然后 `SHIFT + \"`\n* 切换到面板： `Ctrl + b` 然后使用方向键\n* 删除面板： `Ctrl + d`\n* 放大面板： `Ctrl + b` 然后 `z`\n* 缩小面板： `Ctrl + b` 然后 `z`\n\n# 如何解决错误\n\n* 如果 `./local.sh docker interactive` 看起来阻塞了，考虑终止它（CTRL + c）并重新运行\n* 如果 `/linux/tools/labs` 目录是空的，请考虑删除卷并重新运行脚本：\n\n```bash\n$ docker volume rm SO2_DOCKER_VOLUME\n$ ./local.sh docker interactive\n```\n\n* 如果尝试在 WSL 上运行脚本时遇到“bad interpreter”错误，请参考[这个链接](https://stackoverflow.com/questions/14219092/bash-script-bin-bashm-bad-interpreter-no-such-file-or-directory)\n* 如果遇到其他意外问题，请考虑重新启动容器。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinux-kernel-labs-zh%2Fso2-labs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinux-kernel-labs-zh%2Fso2-labs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinux-kernel-labs-zh%2Fso2-labs/lists"}