操作系统版本

server版

版本详情:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy

参考:

虚拟化软件

如果使用VMWare Workstation Pro或者Virtualbox安装虚拟机建立工作流,十分推荐链接克隆功能,只需要几秒就可以从模板虚拟机的快照创建一个全新的虚拟机,本篇博客其实也是一篇建立模板的最佳实践。

网络

一般来说虚拟机使用两张网卡满足网络访问需求,即网络地址转换+仅主机,其中仅主机使用固定IP,网络地址转换使用DHCP,比较新的Ubunru中使用netplan作为默认的网络管理工具,执行命令sudo vim /etc/netplan/00-installer-config.yaml可以看到这种模式下的网络配置:

network:
  ethernets:
    enp0s3:                # 仅主机网卡
      addresses:
        - 192.168.56.57/24 # 指定静态IP
    enp0s8:                # 网络地址转换网卡
      dhcp4: true
      nameservers:         # 指定DNS,在DNS部分另外说明
        addresses:
          - 8.8.8.8
  version: 2

DNS相关的配置会在后面提到,这种模式可能出现的问题是一旦关闭NAT网卡的DHCP则无法连接互联网,其本质是OS无法通过DHCP获得默认网关和DNS配置,但某些情况下所有网卡静态IP是必须的,比如部署K8s,否则可能会导致被分配新的IP后组件间无法通信,这里给出一份仅使用NAT网卡的配置,它也适用于多网卡配置静态IP:

network:
  ethernets:
    ens33:                   # 网络地址转换网卡
      dhcp4: false
      addresses:
        - 192.168.195.50/24  # 指定静态IP
      routes:                # 指定默认网关
        - to: default
          via: 192.168.195.2
      nameservers:
        addresses:
          - 8.8.8.8
          - 192.168.195.2    # 指定默认网关为DNS服务器
  version: 2

修改配置文件后执行命令sudo netplan apply,以立即应用更改,注意,SSH登录时,如果变更会造成网络中断,应避免使用命令sudo netplan try,否则在执行命令后将无法确认更改,直到超时后配置自动回滚。此配置下,虚拟机和宿主机可以互ping,需要考虑的问题是防火墙和ICMP回显是否打开,例如无法ping通Windows宿主机的网关地址,需要修改宿主机的防火墙规则:进入防火墙和网络保护-允许应用通过防火墙-更改设置-允许“文件和打印机共享”即可。

如果执行apply命令出现以下警告:

# 配置文件权限警告
** (generate:1170): WARNING **: 10:48:44.225: Permissions for /etc/netplan/00-installer-config.yaml are too open. Netplan configuration should NOT be accessible by others.
# 服务缺失警告
WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running.

执行命令sudo chmod 600 /etc/netplan/00-installer-config.yaml修改配置文件权限(权限必须为600),ovsdb-server.service服务不是必须的,这里不安装它。

对于网络调试,给出以下建议:

# 查看网卡的DNS路由等信息
sudo netplan status
# 查看系统路由
route
# 查看DNS状态
resolvectl status
# 解析域名
nslookup baidu.com
# 从指定的DNS解析域名
nslookup baidu.com 8.8.8.8

Shell脚本解释器

目前,Debian和Ubuntu中,/bin/sh已经默认软链到dash,而非bash,dash拥有更快的执行速度,偏向运行程序,而bash有更多的功能,偏向交互,二者的语法是不同的,例如dash不支持function关键字,因此在Ubuntu默认配置下使用sh <包含function关键字的脚本>会报错,需要使用bash命令运行,而脚本头中指定的解释器只有在特定情况(脚本具有执行权限,且使用.或者source执行)下才能生效。

用户和权限

ubuntu不建议使用root登录,而是使用sudo提权,安装后可配置指定用户的sudo免密:

$ sudo visudo
# 修改
# %sudo   ALL=(ALL:ALL) ALL
# 为
# %sudo   ALL=(ALL:ALL) NOPASSWD:ALL

防火墙

关闭防火墙:

# 查看状态
sudo ufw status verbose
# 关闭
sudo ufw disable
# 启动
sudo ufw enable

APT源

在22.04中不用修改apt源,系统会自动匹配当前地区最快的镜像。

DNS

当虚拟机联通互联网的网络被配置为DHCP时,将从DHCP服务器自动获得DNS配置,此时可能出现部分域名无法解析的问题,通过执行resolvectl status命令可以看到127.0.0.53的上游DNS服务器,以帮助定位域名解析问题的根本原因:

# 默认DNS无法解析
ian@ian:~$ nslookup raw.githubusercontent.com
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   raw.githubusercontent.com
Address: 0.0.0.0
Name:   raw.githubusercontent.com
Address: ::

# 指定DNS可解析
ian@ian:~$ nslookup raw.githubusercontent.com 8.8.8.8

当系统自动获得的DNS不能满足需求时,需要手动指定DNS服务器,对于Ubuntu,指定DNS的复杂性主要体现在识别当前使用的网络管理工具,否则系统重启后指定的配置被覆盖或者不能生效。从网络上得到的信息看,至少自18.04版本开始,netplan已经作为默认的网络管理工具,因此需要修改/etc/netplan路径下的配置文件,这里是00-installer-config.yaml,修改详情看前面的网络部分,这里不重复贴出配置内容。另外一种方法是使用静态文件替换/etc/resolv.conf 文件,或者将它链接到一个新的文件,并在其中指定DNS。还有一种情况是容器继承主机的DNS配置(比如CoreDNS),当主机DNS仅有网关时,容器将无法成功运行。

时区

执行以下命令:

# 显示当前时区配置
timedatectl

# 设置时区
sudo timedatectl set-timezone Asia/Shanghai

# 修改为24小时制
echo "LC_TIME=en_DK.UTF-8" | sudo tee -a  /etc/default/locale && cat /etc/default/locale
sudo reboot

# 验证
date

配置命令行

~/.profile文件中增加,仅仅修改了默认值中的\w为\W,显示当前目录名称,而不是其绝对路径:

# set view
export PS1="\[\e]0;\u@\h: \W\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ "

关闭swap

执行命令sudo swapoff -a立即关闭swap,执行命令sudo vim /etc/fstab注释其中的swap行,永久关闭swap,并删除swap文件sudo rm -rf /swap.img

升级包

如果登录后提示类似43 updates can be applied immediately.这样的内容,可执行命令apt list --upgradable查看能够升级的包,或者执行命令sudo apt upgrade升级(可能会导致操作系统的修订版本号变更,例如从22.04.2变更为22.04.3,修订版本号变更不会有不兼容的变化产生),升级或者安装包的过程中可能会看到这样的交互界面卡住升级过程,需要人工介入:

在这里插入图片描述

这是由needrestart命令触发的,它的主要作用是检查库升级后有那些需要重启的守护进程。默认是交互式的,可以执行命令sudo vim /etc/needrestart/needrestart.conf,复制$nrconf{restart} = 'i';行并取消注释,将i修改为a是自动重启守护进程(先复制后修改,一般情况下可以帮助我们了解默认配置是什么),修改为l是列出需要重启的守护进程,这里根据守护进程的重启影响评估,测试环境可以设置为自动重启。

主机名

如果需要变更主机名,可以执行命令sudo hostnamectl hostname <new hostname>修改主机名,需要注意,主机名需要符合域名命名规范,可以这样验证,执行命令hostnamectl status,如果其中包含Pretty hostname键,说明主机名非法,它的值是原始设置,hostnamectl将非法值自动转换为Static hostname键对应的值,这是真正的生效值。最后执行命令sudo vim /etc/hosts编辑配置,将127.0.0.1对应的值更新为新的主机名。

定制登录提示信息

如果需要定制登录提示信息,可以参考motd - message of the day,也可以在互联网搜索关键字motd,也可以参考这篇博客:Ubuntu登录提示信息(MOTD)定制与开关,这里做了这些操作:

# 将ENABLED设为0,关闭news
sudo vim /etc/default/motd-news

# 将不需要的提示信息文件移入disable以禁用
# 禁用策略:
# 1. 排除已经关闭的,比如news
# 2. 排除无明确影响的,即根据看到的信息渐进修改
sudo mkdir /etc/update-motd.d/disable
cd /etc/update-motd.d

sudo mv \
10-help-text \
91-release-upgrade \
disable

快捷启用代理

如果ubuntu作为虚拟机,可以通过别名快速设置代理,假设宿主机的代理软件本地http监听端口为10809,并且允许来自局域网的连接,在网关地址为192.168.62.1时,可以在~/.profile中添加别名:

# vpn alias
alias setvpn="export http_proxy=http://192.168.62.1:10809; export https_proxy=http://192.168.62.1:10809"
alias unsetvpn="unset http_proxy; unset https_proxy"

测试:

# 生效
source ~/.profile

# 设置代理
setvpn

# 测试
curl -I www.goole.com

这里有几个问题需要注意:

  1. 设置代理的环境变量有很多,比如http_proxyHTTP_PROXYALL_PROXY等,但具体程序会识别不同的环境变量、不同的协议,比如curl可以识别http_proxyALL_PROXY,且后者支持socks5协议,而apt只能识别http_proxy,且不支持socks5协议,尽量采取通用的配置;
  2. 同时设置http_proxyhttps_proxy变量,均指向http代理端点,否则https的流量无法代理;
  3. 当使用sudo时,默认会重置环境变量,因此无法继承非root shell中用于配置代理的环境变量,要改变此行为需要执行sudo visudo命令,在sudoers文件中解除对Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"行的注释,放行相关的环境变量,变量名大小写敏感;

建立工作空间

将指定目录作为工作空间能够隔离类似.profile的配置文件:

mkdir ~/workspace
echo -e "\ncd ~/workspace\n" >> ~/.profile

还可以配置一些其他的alias 快捷方式。

其他常用操作

清理journal日志:

# 查看日志占用空间
sudo journalctl --disk-usage
# 清理一周之前生成的日志
sudo journalctl --vacuum-time=1w
# 清理超出指定大小的日志
sudo journalctl --vacuum-size=500M
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐