TonyYin's Blog

Back

可以发现 Lab 部分涉及很多底层操作,需要在 x86 架构下的 Linux 系统上运行,而我只有一台 ARM 架构的 Macbook,于是提前参考这两篇博文配置环境。

CSAPP实验环境搭建(macOS)CSDN博客

Mac M1配置Docker CentOS(x86)的CSAPP实验环境 - 知乎

(第一篇没有注意架构转换,第二篇用的是 CentOS)

整体目标

目标

在你的 Mac (ARM 架构) 上运行基于 x86_64 架构的 Ubuntu 环境,用于适配某些工具或实验对 x86 架构的依赖。

搭建的核心环境

操作系统:Ubuntu 20.04(x86_64 架构)。

Docker 平台:基于 Docker Desktop 在 Mac 上运行。

端口映射:将宿主机的 7777 端口映射到容器内的 SSH 22 端口,方便通过 ssh 登录管理容器。

文件挂载:将本地目录 /Users/tonyyin/dev/csapp 挂载到容器的 /csapp 路径,以共享代码和实验资源。

持久化容器:容器命名为 csapp_env,确保可以随时启动并保留配置。

环境搭建

安装 Docker

Docker官网下载Apple-Chip版本的Docker Desktop(第二篇教程说 brew install docker 不能正常使用)

创建 Ubuntu 20.04 LTS容器

  1. 拉取正确架构的镜像
docker pull --platform linux/amd64 ubuntu:20.04
bash

要指定拉取 amd64(x86) 架构的,否则默认会拉取 arm64 架构的版本。

这步如果不指定镜像,在下一步会提示镜像找不到。

  1. 创建容器
docker container run -it --platform linux/amd64 -p 7777:22 -v /Users/tonyyin/dev/csapp:/csapp --name=csapp_env ubuntu:20.04 /bin/bash
bash

-it: 交互模式、分配伪终端。

--platform linux/amd64:指定架构平台。

-p 7777:22:将宿主机的 7777 端口 映射到容器的 22 端口,后面可以通过 SSH 登录容器,方便在宿主机中开发。

-v /Users/tonyyin/dev/csapp:/csapp:挂载宿主机目录 /Users/tonyyin/dev/csapp 到容器目录 /csapp,二者完全共享这个文件夹

  1. 一些可能用的上的指令

查看所有容器(包含/不包含已停止的)

docker ps
docker ps -a
bash

查看 Docker 的所有镜像列表

docker images
bash

验证容器架构(在虚拟机)输出可能为 x86_64 或者 aarch64.

uname -m
lscpu
bash

验证镜像或容器架构(在宿主机)

docker image inspect ubuntu:20.04 | grep Architecture
docker inspect csapp_env | grep Architecture
bash

其他

docker stop csapp_env
docker rm csapp_env
bash

安装所需工具和库

运行完上面的指令,会默认进入虚拟环境的 bash 中。如果要手动进入,可以任选其一

docker exec -it csapp_env /bin/bash
docker exec -it csapp_env bash
docker start -i csapp_env
bash

安装工具和库

apt-get update
apt-get install sudo
sudo apt-get install build-essential
sudo apt-get install gcc-multilib
sudo apt-get install gdb
sudo apt-get install -y openssh-server
sudo apt-get install vim
bash

安装 gdb 之后,按所在地点选择时区后 Enter

中国的时区为:6. Asia70. Shanghai

配置 SSH 服务

  1. 打开 SSH 配置
vim /etc/ssh/sshd_config
bash
  1. 修改 SSH 配置文件,确保以下选项不被注释:
Port 22
PermitRootLogin yes
PasswordAuthentication yes
bash

这里默认是 PermitRootLogin prohibit-password,也就是只允许 root 用户使用公钥身份验证登录,禁止使用密码登录‌。手动将其修改为 yes 即可。

i 进入编辑模式,esc退出编辑模式,:wq退出并保存。

  1. 不要忘了重启 SSH 服务
service ssh restart
bash
  1. 验证 SSH 服务状态,是否监听在端口 22,是否正在运行
sudo netstat -tuln | grep 22
ps aux | grep sshd
bash
  1. 为 root 用户设置一个密码
sudo passwd root
bash

配置 SSH 服务自启动

完全参考 CSDN博文 即可。

vim /root/startup_run.sh
bash
#!/bin/bash

LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$LOGTIME] startup run..." >>/root/startup_run.log
service ssh start >>/root/startup_run.log
#service mysql start >>/root/startup_run.log
bash
chmod +x /root/startup_run.sh
vim /root/.bashrc
bash
# startup run
if [ -f /root/startup_run.sh ]; then
      /root/startup_run.sh
fi
bash
source ~/.bashrc
bash

用 VSCode 连接

  1. 安装插件 Remote - SSH
  2. Cmd+Shift+POpen SSH Configuration File/Users/tonyyin/.ssh/config
  3. 填写配置文件,任取名字,服务器地址,用户名,端口
Host csapp_env
    HostName localhost
    User root
    Port 7777
bash
  1. 按照提示,输入 root 用户设置的密码连接即可。

一些debug记录

SSH 部分的配置很容易出现问题,有以下排查错误的方法。

  1. 在虚拟机内部验证 SSH 是否可以连接
ssh -p 22 root@127.0.0.1
bash
  1. 外部终端验证 SSH 是否可以连接
ssh -p 7777 root@127.0.0.1
bash

启动与关闭

打开 Docker Desktop,然后启动/关闭该容器。

也可以在 Docker 启动的状态下用命令行

docker start csapp_env
docker exec -it csapp_env /bin/bash

exit
docker stop csapp_env
bash
CSAPP环境配置记录(MacOS)
https://www.tonyyin.top/blog/csapp/csapp_env
Author TonyYin
Published at January 24, 2025
Comment seems to stuck. Try to refresh?✨