来!搭建一套能满足自身需求的优雅配置!

4,157 阅读6分钟

需求

  1. 一个由两台运行Linux的主机组成的局域网(用作学习计算机网络);
  2. 一台安装ubuntu20.04以上的主机(用作做MIT 6.S081的Lab);
  3. 希望可以远程登录使用Linux(方便在水课上摸鱼)

已有设备

  1. 已经安装了ubuntu18.04且配置了许多环境的戴尔G3(主力机)
  2. 远古戴尔灵越(键盘是坏的)
  3. surface pro
  4. 可以桥接无线校园网的手机热点(主力机)

备选方案及优缺点分析

对于需求1:

  1. 在G3的windows系统上开启多个虚拟机来组建局域网;
    缺点:经常需要两个系统间切换
  2. G3与灵越组建局域网

对于需求2:

  1. 给G3重装系统
    缺点:重新配置环境十分耗时耗力
  2. 购买云服务器
    优点:系统安装重置方便,能体验云服务器的使用
    缺点: 价格较高; 没能充分利用手头资源
  3. 给灵越安装ubuntu
    优点:充分利用了手头资源
    缺点:键盘是坏的,使用不方便

对于需求3:

  1. 购买云服务器
    优缺点同上
  2. 给G3或者灵越做内网穿透

最终方案选择

给灵越安装ubuntu20.04,并给灵越与G3做内网穿透。当需要使用局域网时,两台主机连接手机热点。这个方案一方面充分利用了手头上的设备,节省了金钱(完全白嫖了可以说是);另一方面,内网穿透也使得我随时随地能够操作上工位上的两台设备以及获取上面的文件,十分方便。

具体实施

1. 配置内网穿透

我目前使用过的内网穿透服务有花生壳和浮居。在都没有氪金的情况下,花生壳的体验要好的多,这主要体现在花生壳延迟低,浮居延迟则很高,在shell上输入命令都十分的卡顿不跟手,另外在花生壳手机app上可以检查连接状况,切换设备上。可惜的是一个花生壳账号似乎只能同时对一台主机进行内网穿透,但好在花生壳的手机app可以很方便的切换设备。

图片名称

花生壳有自己的客户端,而浮居使用的是开源的frp。具体如何操作,网络上已经有许多教程,我这里就不重复了,同学们有需要可以自行搜索。
当然也可以自己配置内网穿透服务器,在一台有公网ip的服务器上安装frp-server,并做一定配置即可。

2. 设置合盖不休眠

我们希望两台笔记本在合盖状态下仍能够正常地被使用。修改文件/etc/systemd/logind.conf如下(释放注释,并修改=后值为ignore)

[Login]
HandleLidSwitch=ignore

3. 命令行切换网络连接

因为校园网有ip隔离,因此两台都连接了校园网的主机是不能相互ping通和ssh连接的,因此在需要两台主机处于可以相互ping通的同一局域网时,我目前的方案是让两者连接到手机热点。但由于平时灵越都是收起来的,以节省桌面空间,而且它的键盘是失灵的,所以如果每次需要连接手机热点都将它拿出来并通过图形界面更改网络连接将十分的麻烦。因此我选择通过命令行的方式切换连接:

sudo nmcli device wifi list # 输出所有wifi信号
sudo nmcli device wifi connect <wifiname> password <password>

4. ssh连接

  1. vsocde连接
    使用vscode连接,配置好sshconfig可以直接点击右下角连接按钮进行ssh连接。
  2. 终端连接
    在终端,我一般会使用下面命令进行连接
ssh <hostname>@<domain name> -p <port number># 使用内网穿透的域名连接
ssh <hostname>@<ip address> # 使用局域网的ip地址连接

# 连接过一次后,就可以使用查看历史命令快速连接
history | grep ssh
! <history的序号>

注意:若先后使用同一个主机名或者ip地址连接不同的主机(例如我时常会通过切换),在终端会出现如下报错(在vscode不会报错,而直接连接失败):

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
xxx
Please contact your system administrator.
Add correct host key in /Users/xxx/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/xxx/.ssh/known_hosts:47
ECDSA host key for xxx has changed and you have requested strict checking.
Host key verification failed.

其原因是:当我们通过ssh连接到另一台主机时,ssh将获得ECDSA密钥的指纹,然后将其保存到〜/.ssh/known_hosts(Windows下是<系统盘>:\Users\<用户名>\.ssh\known_hosts)。
解决办法很简单,大家可以选择以下两种方法之一(其实原理都是一样的,就是将该主机的密钥从文件中删除):

  1. 使用以下命令
    ssh-keygen -R <server-hostname or ip>
  1. 在Windows下也可以打开文件.ssh/known_hosts,直接删除相应主机名或ip地址对应的项

然后再次尝试连接即可。

5. zsh

sudo apt-get install zsh 
# 安装oh my zsh
https://ohmyz.sh/ 
# 安装powerlevel10k
https://github.com/romkatv/powerlevel10k 

安装powerlevel10k之后,如何显示username/hostname呢?powerlevel10默认只有在特权级或者ssh中才显示username/hostname,这在其仓库的的README中有提到,解决办法如下: 在~/.p10k.zsh中搜索contest,找到下面一段字段,确保context字段存在且没被注释。

typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
...
context  # user@hostname
...
)

然后再找到以下字段,将其注释,zsh就会在任意user下显示username/hostname

# Don't show context unless running with privileges or in SSH.
# Tip: Remove the next line to always show context.
typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION=

注意:如果在bash中安装过类似conda,ros等,记得要将~/.bashrc中的相关字段复制到~/.zshrc中,其中有些坑的是ros,其字段不能直接复制,而需要修改,具体修改如下:

# .bashrc中
source /opt/ros/melodic/setup.bash
# .zshrc中
source /opt/ros/melodic/setup.zsh

最终效果: image.png

6. 其它

如果是新系统,还得配置像是tmux,vim等常用的软件,这里就不展开介绍了。

折腾感想

这套环境确实折腾了挺长时间的,现在这套配置用起来也是十分顺手了。虽然有点老套,但确实不得不说这个过程让我对书本上的知识有了更深的体会,例如:配置内网穿透,局域网和代理涉及了许多计网的知识,而将shell从bash转换到zsh则让我对shell这个软件有了更深的认识,另外经过这次我对linux的命令(例如nmcli系列)和systemd等也更加熟悉了。 如果大家有什么想法,欢迎留言讨论哦!