Ubuntu 作为一个Linux的发行版,在桌面环境的易用性上做了很多改善,对推动Linux的推广做了很大的贡献。同时,它作为服务器的操作系统也越来越多的被使用。当然,服务器端可能更多的人在使用Redhat、CentOS等系统。Linux的发行版本很多,基本命令都差不多,但是一些系统配置上,也存在着各种各样的差异。笔者结合Ubuntu的多年使用经验,总结一下Ubuntu系统的一些配置要点。
1. 网络的配置
Ubuntu在安装过程中会自动寻找网络连接并配置网络IP等,但是好多情况下,安装系统时不需要或不方便配置网络。那么,等我们安装完系统,就要先配好网络才能继续安装、配置其它软件。Ubuntu的网卡名称在几年前(大约14.04之前的版本)都是这样命名的:
有线网卡为eth0(多个网卡序号增大:eth1, eth2…),无线网卡是wlan0。
但是到了16.04的版本,网卡的命名做了非常大的改动,名称从eth0变为en开头的,为什么改名呢?
可预测的网络接口命名
自从 v197 systemd/udev 开始,系统可以为本地的Ethernet、WLAN和WWAN接口自动地分配可预测的、稳定的网络接口名称。该规范脱离了传统的命名机制(eth0,eth1,wlan0等),但是修复了许多问题。
原因
在传统的网络接口命名规则下,是由内核简单地从eth0开始为可被驱动探索到的设备分配名字(eht0,eth1…)。由于这些驱动不能够被现在技术所预测,意味着多个网络接口都可以被分配名为“eth0”、“eth1”这样的名字,这种方式存在一种隐患,就是一种接口可能是以“eth0”启动,但是结束时就变成了“eth1”.不可预测的命名规则存在着严重的安全威胁。 为了修复这个问题,许多方案被提出和实现。很长一段时间,udev都是根据Mac地址来分配永久了“ethX”名字。这导致了很多问题:这需要一个可写的但是通常不允许的root目录;由于系统的无边界性,当root一个OS镜像的时候可能会改变镜像的配置信息;许多系统的Mac地址并不是固定的。其中最大的问题是用户空间和系统内核对设备命名的冲突。 另一种解决方案就是“biosdevname”,该方案通过找到固件中固定的拓扑信息然后利用它们分配固定的接口。这个命名机制同/dev/*/by-path/ symlinks的方式很相似。大多数情况下,biosdevname 从底层的内核设备定位机制中分离了出来。 最后,许多观点迟滞根据用户选择的名字对接口重新命名,切断同Mac和物理位置的联系。这是一个非常好的选择,但是存在一个隐藏的问题就是用户获得了选择和分配这些名字的权利。 我们相信由“biosdevname”机制已领的泛化机制是一个很好的选择。基于固件、拓扑和位置信息分配固定的名字有一个巨大的优势,名字是全自动地、可预测的,即使硬件添加或删除也不影响。
V197添加了什么
systemd 197为许多命名策略新增了许多本地化的支持到 systemd/udevd 并实现了一个类似于“biosdevname”的机制。五种网络接口的命名机制通过udev得到了支持。
/*
* Two character prefixes based on the type of interface:
* en — Ethernet
* sl — serial line IP (slip)
* wl — wlan
* ww — wwan
*
* Type of names:
* b — BCMA bus core number
* c — CCW bus group name, without leading zeros [s390]
* o[d] — on-board device index number
* s[f][d] — hotplug slot index number
* x — MAC address
* [P]ps[f][d]
* — PCI geographical location
* [P]ps[f][u][..][c][i]
* — USB port number chain
*/
上面一段是systemd源码的注释,意思是:
en代表以太网卡
p3s0代表PCI接口的物理位置为(3, 0), 其中横座标代表bus,纵座标代表slot
那么如何查看我的机器上的网卡名称是什么呢?可以通过以下命令来查看:
ls /sys/class/net/
docker0 enp0s31f6 enx30b49e09b81e lo zt0
可以看到我的机器上有5个网卡设备。知道了网卡名称就可以配置网络IP了。这里,我们用vim编辑网络配置文件:
vim /etc/network/interfaces
如果你的网络是通过dhcp自动获取IP,可以这样编写配置文件:
auto lo # 代表127.0.0.1,即localhost
iface lo inet loopback auto enp0s31f6 # 这是网卡名称
iface enp0s31f6 inet dhcp
如果你的网络有静态IP,则这样编写配置文件:
auto lo # 代表127.0.0.1,即localhost
iface lo inet loopback auto enp0s31f6 # 这是网卡名称
iface enp0s31f6 inet static
address 10.1.40.240
gateway 10.1.40.254
netmask 255.255.255.0
如果你的网卡需要绑定多个IP,则增加的IP这样写:
auto enp0s31f6:0 # 这是虚拟出的网卡名称,加了:0,如果有更多IP,可以:1, :2, ...
iface enp0s31f6:0 inet static
address 192.168.1.100
gateway 192.168.1.1
netmask 255.255.255.0
配置文件编辑完成后,重启一下网络,使配置生效:
sudo /etc/init.d/networking restart # 或者用service命令: sudo service networking restart
文章首发于我的技术博客猿人学的Python基础教程