操作系统课程设计的技巧与踩坑
短学期在上学校的《操作系统课程设计》课,第一堂是虚拟机安装 Fedora 7 和编译内核。这里总结总结自己踩到的坑,和一些好用的技巧。
Fedora 7 启用 SSH
Fedora 7 实在是太老了。网络上找不到特别对应这个版本的教程,但其他教程也可以参考。总结启用 SSH 的流程如下:
-
关闭防火墙和 SELinux
只是在本地做做实验,要啥安全性?执行
setup
命令,调整防火墙设置如下: -
检查是否已安装 SSH 服务
执行
rpm -qa | grep openssh-server
。如果有内容就说明已安装,否则用yum install openssh-server
安装之。yum 下载慢的,可安装 yum-fastestmirror 插件自动选择最快源。
-
修改配置文件
$ vim /etc/ssh/sshd_config
放开如下配置:
Port 22 Protocol 2 PermitRootLogin yes MaxAuthTries 6
-
重启 SSH 服务
$ /etc/rc.d/init.d/sshd restart $ service sshd status
提示服务正在运行即可。
VBox 虚拟机配置与宿主机网络互访
仅 NAT 方式
配置虚拟机时网络选项使用 “网络地址转换(NAT)” 选项可以傻瓜式免配置地让 Fedora 访问到外网,但是在主机去 Ping 虚拟机 ip add
命令显示的 IP,是 Ping 不通的。
VBox 相比 VMWare,在处理 NAT 时,并不映射到一块具体的虚拟网卡。也可以注意到,虚拟机内显示的 IP 与主机并不在同一网段,自然是不通的。
相比起 VMWare,如果要在 NAT 下连到虚拟机的 22 端口,则需要配置端口转发:
如按上图配置,则 localhost:20022 将映射到虚拟机的 22 端口。使用 tcping 可以验证端口打通:
此时可使用 Xshell、PuTTY 等 SSH 工具连接虚拟机了。
双网卡方式
上面的方法很蠢。如果需要映射大量端口,不可能一一配置。并且使用 localhost 而不是虚拟机 IP 也很别扭。为此,可以使用双网卡方式,彻底将虚拟机映射到一张虚拟网卡。这也将为我们后面配置 Samba 打下基础。
在 VBox 中打开 “主机网络管理器”,配置默认添加的 Host-Only 虚拟网卡。
按照自己的情况分划一段空闲网段,并启动 DHCP 服务器功能。保存后使用 ipconfig 验证配置完成:
然后为虚拟机分派第二张网卡,映到该虚拟网卡:
再启动虚拟机,即可使用 ip add
命令看到第二张网卡及上面的IP。使用该 IP 即可从主机对应访问虚拟机,无需端口映射。
现在就可以自由地使用该 IP 来 SSH 连接虚拟机了。由于我这里只有一台虚拟机工作,因此它会稳定占据 DHCP 地址池的第一个 IP。如果有需要,你可以配置静态 IP,此处不述。
内核下载
实验要求使用 linux-2.6.21.7 内核,搜了一下,这玩意好像只能在一个叫 linuxgrill 的网站下到。然而,这网站的下载速度实在是一言难尽,即使是“科学”技术也无法拯救个位数的下载速度。在此感谢我的强大舍友王同学,使用百度云会员离线下载等奇技淫巧,终于把这个文件弄了下来。
我把它搬到了自己国内的云服务器上,有需要的同学可以使用这个网址下载:
$ wget http://zxuuu.tech:8008/share/linux-2.6.21.7.tar.bz2
从 VSCode Remote 到 Samba
为了能用地表最强编辑器 VSCode 编写代码,自然想到用 Remote SSH 插件连接虚拟机。然而,Fedora 7 实在是太老了。连接时直接报错:
打扰了,这似乎不是我们有能力解决的错误。这不禁让我想到在腾讯实习时,也有那几台跑着远古 tLinux 的老爷机用不上 Remote SSH…
退而求其次,我们换用古老一点的 Samba 技术来做这件事。首先在虚拟机上配置一波:
-
安装 Samba
执行
rpm -qa | grep samba
,观察是否输出如下三个包:[root@localhost ssh]# rpm -qa | grep samba samba-3.0.28a-1.fc7 samba-common-3.0.28a-1.fc7 samba-client-3.0.28a-1.fc7
如果没有,则缺哪个装哪个:
$ yum install samba samba-common samba-client
-
编辑 Samba 配置文件
执行
vim /etc/samba/smb.conf
,修改如下几个地方:-
(74行左右) workgroup = WORKGROUP
-
(101行左右) security = user
-
在 246 行左右 Share Definitions 下新增:
[samba] comment = samba path = / public = yes writable = yes valid users = root create mask = 0700 directory mask = 0700
最后看起来大概是这样:
-
-
添加 Samba 用户并激活
$ smbpasswd -a root $ smbpasswd -e root
-
守护 Samba 服务
$ chkconfig smb on $ chkconfig --list smb # 检查2~5为on $ chkconfig nmb on $ chkconfig --list nmb # 检查2~5为on $ /etc/rc.d/init.d/smb start $ /etc/rc.d/init.d/nmb start
配置至此,reboot 虚拟机。
-
在 Windows 下启用 Samba
Samba 在 Windows 10 下默认是关闭的。我们需要将它手动启动。打开控制面板 - 程序和功能 - 启用或关闭 Windows 功能,将 SMB 打勾:
按提示要求重启电脑。
-
通过 Samba 连接虚拟机
在文件资源管理器任意页面用双反斜杠加 IP 即可访问。如有需要也可将该地址做成快捷方式放到桌面。
这时,所有的文件都可以访问:
使用 VSCode 也可自由打开、编辑其中的文件,虚拟机就像是挂载主机上的一块硬盘了:
并且,与 Remote SSH 不同的是,Samba 下使用 VSCode 不依赖远端的 VSCode Server。这意味着本地安装的所有插件、配置都可以直接使用,不需要再次安装。
舒服了,代码搜索、代码跳转等等功能都到手了。当然,个人不建议在这上面用终端(因为与远端并不完全等价),最好还是用 Xshell 连着的终端来操作。
-
配置 VSCode includePath
此时 VSCode 由于不了解 Linux 的 include 文件,无法正确进行代码提示,存在头文件划红线的情况。为此,可增加工作区配置。在项目目录新建
.vscode/settings.json
文件,键入如下内容:{ "C_Cpp.default.includePath": ["\\\\<ip_to_linux>/samba/usr/include", "\\\\<ip_to_linux>/samba/usr/local/include"] }
内核编译加速技巧
基本方法
众所周知,增大系统内存、使用 SSD、增加 CPU 核心数,都可以有效加快编译速度。如有条件,使用内存盘可以成吨加快编译。由于是虚拟机,咱不折腾,多给点内存就好了。
多线编译
make 命令可带参数 -j2、-j4 等启用二线、四线并发编译,这也可以有效加快编译速度,但并不一定是数字越大越好。在我的机器上,使用 -j2 ,按照实验指导书的配置,全套编译流程在 20 分钟左右。这个加速比较可观。
内核裁剪
按照实验指导书的配置,make 内核时,用的配置文件直接是 Fedora 7 系统带的配置。这意味着大量根本用不到的内核功能都会编译进去…在编译前 make menuconfig ,对不需要的功能进行裁剪,使用自定义的配置文件来编译内核,必然可以有效缩小内核大小,加快编译流程。对内核裁剪有兴趣的,可自行搜索相关资料研究,此处不述。