- 课程网站:http://csapp.cs.cmu.edu/ ↗
- 课程视频:https://www.bilibili.com/video/BV1iW411d7hd ↗
- 课程教材:Computer Systems: A Programmer’s Perspective, 3/E
- 课程作业:11 个 Project,代码框架全部开源 ↗
可以发现 Lab 部分涉及很多底层操作,需要在 x86 架构下的 Linux 系统上运行,而我只有一台 ARM 架构的 Macbook,于是提前参考这两篇博文配置环境。
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容器
- 拉取正确架构的镜像
docker pull --platform linux/amd64 ubuntu:20.04
bash要指定拉取 amd64(x86) 架构的,否则默认会拉取 arm64 架构的版本。
这步如果不指定镜像,在下一步会提示镜像找不到。
- 创建容器
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
,二者完全共享这个文件夹。
- 一些可能用的上的指令
查看所有容器(包含/不包含已停止的)
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. Asia
,70. Shanghai
。
配置 SSH 服务
- 打开 SSH 配置
vim /etc/ssh/sshd_config
bash- 修改 SSH 配置文件,确保以下选项不被注释:
Port 22
PermitRootLogin yes
PasswordAuthentication yes
bash这里默认是 PermitRootLogin prohibit-password
,也就是只允许 root 用户使用公钥身份验证登录,禁止使用密码登录。手动将其修改为 yes
即可。
按 i
进入编辑模式,esc
退出编辑模式,:wq
退出并保存。
- 不要忘了重启 SSH 服务
service ssh restart
bash- 验证 SSH 服务状态,是否监听在端口 22,是否正在运行
sudo netstat -tuln | grep 22
ps aux | grep sshd
bash- 为 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
bashchmod +x /root/startup_run.sh
vim /root/.bashrc
bash# startup run
if [ -f /root/startup_run.sh ]; then
/root/startup_run.sh
fi
bashsource ~/.bashrc
bash用 VSCode 连接
- 安装插件 Remote - SSH
Cmd+Shift+P
,Open SSH Configuration File
,/Users/tonyyin/.ssh/config
- 填写配置文件,任取名字,服务器地址,用户名,端口
Host csapp_env
HostName localhost
User root
Port 7777
bash- 按照提示,输入 root 用户设置的密码连接即可。
一些debug记录
SSH 部分的配置很容易出现问题,有以下排查错误的方法。
- 在虚拟机内部验证 SSH 是否可以连接
ssh -p 22 root@127.0.0.1
bash- 外部终端验证 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