「Debian」- 禁用Nouveau驱动

问题描述
禁用 nouveau 内核模块
解决方案
查看相关的模块文件:

# modinfo -F filename nouveau
/lib/modules/4.16.0-kali2-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko

查看模块文件所属的包:

# apt-file search ‘/kernel/drivers/gpu/drm/nouveau/nouveau.ko’
linux-image-4.19.0-kali4-amd64: /lib/modules/4.19.0-kali4-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
linux-image-4.19.0-kali4-amd64-dbg: /usr/lib/debug/lib/modules/4.19.0-kali4-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
linux-image-4.19.0-kali4-rt-amd64: /lib/modules/4.19.0-kali4-rt-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
linux-image-4.19.0-kali4-rt-amd64-dbg: /usr/lib/debug/lib/modules/4.19.0-kali4-rt-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko

这是内核自带的驱动模块,没有办法卸载。
需要通过 /etc/modprobe.d/ 的 blacklist 来禁用:

# cat /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

更新内核的 initramfs 文件:

# update-initramfs -u

重启系统。
待办事项
TODO 为什么要执行update-initramfs -u命令? TODO 内核模块是如何加载的,为什么单纯使用modprobe的blacklist无效 TODO 如何安装英伟达显卡驱动,并配置XORG来启用
关键文档
How to disable Nouveau kernel driver NVIDIA CUDA Installation Guide for Linux Debian Wiki/KernelModuleBlacklisting
参[……]

READ MORE

「Linux」- 当开机启动时,自动加载内核模块

CentOS 6.5
Remember to load your kernel modules at boot How to load modules on boot CentOS 6.x
以 BONDING 模块为例:

#!/bin/sh

cat > /etc/sysconfig/modules/bonding.modules <<EOF
#!/bin/sh
exec /sbin/modprobe bonding 2>&1
EOF

chmod 755 /etc/sysconfig/modules/bonding.modules

CentOS 7.4
Products & Services/Product Documentation/Red Hat Enterprise Linux/7.4/Kernel Administration Guide
以 virtio-net.ko 模块为例:

#!/bin/sh

cat > /etc/modules-load.d/virtio-net.conf <<EOF
# Load virtio-net.ko at boot
virtio-net
EOF[……]

READ MORE

「sysctl」- 停止内核向控制台输出消息

当系统启动成功后,在 TTY 中,内核还是在不停的写入消息,影响操作;
这个消息是内核写入的,不时 MESG,WALL 等命名写入的,所以单纯的使用mesg n命令是无效的;
需要修改/etc/sysctl.conf文件:

# Uncomment the following to stop low-level messages on console
kernel.printk = 3 4 1 3

然后,执行sysctl –system使修改生效;
参考文献
How to stop kernel messages from flooding my console?[……]

READ MORE

「Linux」- control groups

内容简介
本部分介绍与cgroups有关的内容。
cgroups – control groups
它是Linux内核的一个特性,用于限制、管理进程使用的资源。
与nice(1)及/etc/security/limits.conf相比,cgroups更加灵活,它可以管理一组进程。
简单示例
在Linux中,有些应用程序十分消耗内存。比如火狐浏览器就是一个“内存大户”,还有Eclipse开发工具。
我们这里演示如何如何限制Eclipse使用的内存:

#!/bin/sh

# 安装
apt-get install cgroup-tools

# 配置
cgcreate -g memory:eclipse-demo
echo 1G > /sys/fs/cgroup/memory/eclipse-demo/memory.limit_in_bytes
cgexec -g memory:eclipse-demo /path/to/eclipse

# 验证

多种使用方式
由非常多的cgroups配置管理工具,这里只简单介绍几种:

(1)通过命名行工具,如cgcreate, cgexec等命令(以及/etc/cgconfig.conf配置文件),并且需要由开机脚本支持才能实现开机自动及自动加载。
(2)通过systemd管理(推荐)。

本文只介绍这两种方式。
通过命令行
Setting Up Linux cgroups – Control Groups How to Limit CPU Usage of a Process on Linux Limit memory for browser on Fedora
通过systemd服务
How to manage processes with cgroup on Systemd
Running Firefox in a cgroup (using systemd)
附加说明
#1 如果应用程序使用的内存达到限制后,会发生什么?
-「What’s the Linux kernel’s behaviour when processes in a cgroup hit their memory limit?」 在默认情况下,由OOM监管cgroups。在启用OOM时,如果内存达到限制,进程会被OOM Killer立即结束。在禁用OOM时,如果内存达到限制,进程会被暂停,直到释放出新空间(但是实际情况是Eclipse一直挂在那里没有反应,所以最后我还是决定默默地启动OOM功能)。
如果要禁用OOM Killer可以执行echo 1 > /c[……]

READ MORE

「CentOS 7」- dracut-initqueue timeout

关键命令:dracut -f -v
关键点:update kernel initramfs LVM
参考文献
Can’t boot due to “Dracut initqueue timeout” YouTube/Fix Fedora boot label error message Change VM – ‘Warning: dracut-initqueue timeout’ at startup Kernel panic on boot following “dracut Warning: LVM rootvg/rootlv not found”[……]

READ MORE

「Linux」- 语言,本地化

安装并切换其他语言
Add new locale at Ubuntu 16.04 · GitHub

# apt-get install language-pack-en-base language-pack-en

# localectl set-locale LC_CTYPE=en_US.utf8

安装语言包
Fcitx – ArchWiki/#Emacs Locale – ArchWiki
通过图形化界面的方法(Ubuntu 21.04,GNOME 桌面系统): 1)Settings ⇒ Region & Language ⇒ Manage Installed Languages ⇒ Install / Remove Languages… ⇒ Chinese (simplified) ⇒ Apply; 2)无需重启,执行 locale -a 能够查看到 zh_CN.utf8 语言;
在命令行中,执行命令安装:

apt-get install locales-all

在 Debian 中,可能已经安装语言环境,但是需要手动配置: 1)编辑 /etc/locale.gen 文件,取消 zh_CN.UTF-8 UTF-8 注释; 2)运行 locale-gen 命令即可; 3)重新运行上述 Emacs 启动命令;
相关链接
The Base Specifications Issue 7[……]

READ MORE

「Linux」- 本地语言设置

CentOS 7
使用localectl命令:

# localectl status
# localectl list-locales
# localectl set-locale LANG=<locale_name>
# localectl –help

更多的内容可以参考手册localectl(1)手册。
CentOS 6.X
通过配置文件修改:

/etc/sysconfig/i18n # 系统级配置文件
$HOME/.i18n # 用户级别配置文件
/etc/profile # 定义LANG=变量即可

这并不需要重启,用户重新登录即可。
参考文献
How to Set Up System Locale on CentOS 7 How to Change the System locale in CentOS / RHEL 5,6[……]

READ MORE

「Linux」- 操作系统日志管理

日志的保存路径
5.10. /var/log : Log files and directories
在 Linux 中,按照 FHS 规范,日志应该保存在 /var/log/ 目录中。 FHS 规定 wtmp、messages、lastlog 三个日志文件,但并没有规定其他日志类型所用的日志文件名。
日志的写入方式
我们可以将日志直接写入 /var/log/ 目录中 多数 Linux 发行版会提供两个日志系统:systemd-journald、rsyslog
systemd-journald
提供改进的日志管理服务,用于记录内核、启动早期、标准输出、守护进程的日志;
它将这些日志写入结构化事件日志中,日志会被收集到中央数据库。在默认情况下,重启之后便会丢失;
这些日志可以由 systemd-journald 转发到 rsyslog 中进一步处理;
rsyslog
该服务会根据日志类型、日志优先级处理这些日志,并写入不同的文件中(/var/log/)
相关文档
systemd-journald.service(8) rsyslogd(8) rsyslog.conf(5)
常见日志文件
注意事项:针对不同的 Linux 发行版,同种日志文件的写入路径及文件名可以有所差异
/var/log/message => 大多数系统日志记录于此; /var/log/secure => 安全与身份认证相关的消息和错误的日志 /var/log/maillog => 与邮件服务相关的消息的日志 /var/log/cron => 与定时任务有关的日志 /var/log/boot.log => 与系统启动有关的日志 /var/log/kern.log => Linux Kernel
/var/log/Xorg.0.log /var/log/Xorg.0.log.old /var/log/alternatives.log /var/log/apache2/ /var/log/apt/ /var/log/auth.log /var/log/bootstrap.log /var/log/btmp /var/log/chkrootkit/ /var/log/couchdb/ /var/log/daemon.log /var/log/debug /var/log/diamond/ /var/log/dpkg.log /var/log/dradis/ /var/log/elasticsearch/ /var/log/exim4/ /var/log/faillog /var/log/filebeat/ /var/log/firebird/ /v[……]

READ MORE

「rsyslog」- 日志服务

日志发送及处理流程
1)应用程序使用 syslog 协议,发送日志到 rsyslog 服务,并发送设备及优先级; 2)当 rsyslog 服务收到日志后,根据设备与优先级,将日志写入到不同文件中;
第一步、发送日志到服务
使用 logger 命令可以向 rsyslog 服务发送日志:

# 从命令行写入日志
logger -p local7.notice “testing”

local7:设备,还有其他设备 notice:优先级,还有其他优先级 “testing”:日志内容
第二步、将日志写入文件
至于日志将被写入哪个文件,需要在 /etc/rsyslog.conf 中配置。多数发行版支持 /etc/rsyslog.d/*.conf 配置文件。
配置文件的格式如下:

# 将设备 local7,优先级 notice 日志写入 /var/log/misc.log 中
local7.notice /var/log/misc.log

# 到设备 local7 的所有消息,都不要写入 /var/log/misc.log 中
local7.none /var/log/misc.log

# 到设备 local5 的所有消息,部分优先级,全部写入 /var/log/local5.log 中
local5.* /var/log/local5.log

可用的日志设备
日志设备定义在 /usr/include/sys/syslog.h 文件中,用户不能够随便定义设备名称,参考 rsyslog.conf(5) 手册。
可用的日志优先级

编码
优先级
严重性

0
emerg
系统不可用。该日志消息将写入用户终端中。

1
alert
必须立即采取措施

2
crit
严重状况

3
err
非严重错误状况

4
warning
警告状况

5
notice
非常但重要的事情

6
info
信息性事件

7
debug
调试级别消息

注意事项
某些应用程序不使用 rsyslog 服务,而直接将日志写入 /var/log 目录中。比如 Samba 将日志写入 /var/log/samba/ 目录。[……]

READ MORE

「CentOS 7」- Journald

内容简介
本文介绍在CenOS 7中如何使用Journald服务以及journalctl命令进行日志管理。
持久化日志
需要修改/etc/systemd/journald.conf配置文件中[Journal]部分的Storage属性。
在CentOS Linux release 7.4.1708 (Core)中,默认Storage=auto配置。还可以配置为:

# “volatile”,将日志存储在内存中,即/run/log/journal目录,如果有必要会自动创建。

# “persistent”,日志将保存在磁盘中,即/var/log/journal目录,如果有必要会自动创建。但是,如果在启动期间磁盘不可写,比如无法成功创建/var/log/journal目录,那依旧会写入/run/log/journal目录,如果有必要会自动创建。

# “auto”,类似于”persistent”属性,但是不会自动创建/var/log/journal目录,因此目录/var/log/journal的存在与否,决定了日志的写入位置。

# “none”,关闭所有的存储,接收到的所有日志数据将被丢弃。将被转发到其他的目标,比如控制台、内核日志缓冲,syslog服务等等。

而”auto”是默认值。所以想要持久化日志,执行如下命令即可:

#!/bin/sh

# 创建目录
mkdir /var/log/journal

# 使用systemd中定义的指令进行初始化
systemd-tmpfiles –create –prefix /var/log/journal

# 重启以生效
systemctl restart systemd-journald

清理日志
可以使用–vacuum-size=选项与–vacuum-time=选项清理日志,但是这只能用于清理归档的日志:

#!/bin/sh

# 查看日志使用空间,包括归档与活跃的日志
journalctl –disk-usage

# 根据时间及大小清理日志
journalctl –vacuum-time=10d
journalctl –vacuum-size=2G

参考文献
manpath.be/journald.conf How do I display log messages from previous boots under CentOS 7? Clear systemd journal[……]

READ MORE

「logrotate」- 日志轮转

什么是日志轮转?
重命名旧的日志文件,写入新的日志文件,防止日志文件沾满磁盘空间。
在重命名时,使用日期作为文件扩展名,比如 /var/log/message 重命名为 /var/log/message-20190710
当日志论转产生一定量的日志文件时,会删除旧的日志文件,将日志文件控制在一定数量。
如何进行日志轮转?
通常使用 logrotate 工具进行日志论转,由 cron 负责执行该程序。
有关内容可以参考 logrotate(8) 手册。[……]

READ MORE

「Linux」- 内存管理 / 交换分区

该部分笔记介绍与交换分区有关的内容。
SWAP 是否属于文件系统?
What file system is swap on Linux Does swap space have a filesystem?
严格讲 SWAP 并不算是文件系统。
相关链接
How to change the Swappiness of your Linux system
参考文献
LINFO/Swap Space Definition How can I check if swap is active from the command line?[……]

READ MORE

「Linux」- 创建 SWAP 分区

注意事项
磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!磁盘操作有风险,先备份数据,谨防数据丢失!!!
第一步、创建新分区,以用作交换分区
该步骤的目的是创建新分区,用作交换分区。你可以使用 cfdisk、sfdisk、fdisk 进行创建。
创建分区
下面是使用 fdisk 的示例:

# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.32).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): n // —————————————————————————- 创建一个分区
All primary partitions are in use.
Adding logical partition 6
First sector (199235584-234441647, default 199235584): [ENTER] // ————————————- 分区起始位置,使用默认值即可
Last sector, +sectors or +size{K,M,G,T,P} (199235584-234441647, default 234441647): +8G // ———— 分区大小

Created a new partition 6 of type ‘Linux’ and of size 8 GiB.

Command (m for help): t // —————————————————————————- 修改分区类型
Partition number[……]

READ MORE

「SWAP」- 关于交换分区的大小

问题描述
交换分区是一种磁盘分区,它被当作“备用内存”使用。内核将内存中的“冷”数据换下来,写入「交换分区」,以腾出内存空间用于其他需求。 有人推荐「交换分区」的大小应该为「物理内存」的1/2倍、1倍、2倍。
那「交换分区」应该设置多大才合适呢?
解决方案
先说结论:针对现在的计算机硬件,内存容量已经不再是,可以直接禁用交换分区。
如果一定要开启交换分区:
那交换分区应该设置多大?
关于「交换大小」问题没有明确的答案,只有建议。(每次听到这种话都感觉是屁话……)
在Red Hat的「Do we really need swap on modern systems?」中:

对于现代系统(即4GB或更高的内存),建议交换大小为内存的20%。

在CentOS的建议中:

如果内存小于2 GB,则交换分区的大小是RAM的两倍
如果内存大于2 GB,则大小为内存大小加上2 GB。例如,如果是3GB内存,则配置5GB交换分区

但是如果是作为笔记本系统的话,又有不同的地方。例如,休眠是写入交换分区的,所以这也要考虑进去。
在Ubuntu中:

如果RAM小于1 GB,则交换分区的大小应至少应为RAM的大小,并且最多为RAM大小的两倍;
如果RAM大于1 GB,则交换分区的大小应至少等于RAM大小的平方根,并且最多为RAM大小的两倍;
如果使用休眠,则交换大小应等于RAM的大小,再加上RAM大小的平方根;

在很长一段时间中,交换分区的建议大小通常是RAM的两倍。
在 Raspbian 中,禁用交换分区
How do I permanently disable the swap service? – Forum – Raspberry Pi – element14 Community

sudo sync
sudo swapoff -a
sudo apt-get purge -y dphys-swapfile
sudo rm /var/swap
sudo sync

reboot

swapon -s

参考文献
How Much Swap Should You Use in Linux?[……]

READ MORE

「Linux」- 将SWAP写回MEMORY中

内容简介
本文将介绍如何在有足够内存空间的情况下,希望将SWAP分区中的数据读回内存。
问题描述
当执行「占用大量内存的程序」时,「其他应用程序」所占用的内存就会被写入SWAP分区。当需要执行这些「其他应用程序」的时候,内核会把SWAP分区中的数据“换”回内存,受到磁盘IO的影响,应用程序的响应可能会比较慢。
当我们关闭「占用大量内存的程序」时,内存资源被释放,但是之前“换入”SWAP分区的数据并不会被重新“换回”内存中。
我们的诉求是:当有足够内存空间的情况下,希望将SWAP分区中的数据读回内存。
解决办法
但这样做的前提是:你有足够的备用物理内存来包含SWAP中的所有内容,否则内核将启动致命的OOM Killer功能。
需要将这些SWAP中的数据写回到内存中,这一执行如下命令:

#!/bin/sh

swapoff -a
swapon -a

当关闭交换分区时,数据会被读回内容,然后我们再重新打开交换分区。
相关链接
如果你希望将SWAP的内容复制回内存,但是保留SWAP的内容,可以参考「Making Linux read swap back into memory」一文。
参考文献
Making Linux read swap back into memory Linux: how to explicitly unswap everything possible? How do I read from /proc/$pid/mem under Linux?[……]

READ MORE

「Linux」- 作为系统管理员,应该如何进行操作系统网络配置

问题描述
创建这篇笔记,是因为我们遇到一个问题,这个问题与 CentOS Stream 发行版有关。自从出现 CentOS Stream 版本之后,我们直接跳过 CentOS 8 版本,便开始选择其他 Linux 发行版。我们认为短期之内不能指望使用 Rocky Linux 来替代 CentOS 发行版。最后经过一番权衡,我们选择 Ubuntu Server TLS 系列发行版。我们安装 Ubuntu 18.04 TLS 发行版,以完成相关工作任务。然而,在配置网络时,我们便遇到问题:Ubuntu 没有使用 NetworkManager 管理网络配置?
不同于 CentOS 6.x 发行版,在 CentOS 7.x 中,开始使用 NetworkManager 进行网络管理。在 RHCE 的官方课程中,也是力推 NetworkManager 进行管理管理,取代以往修改配置文件的网络管理方式。而使用 NetworkManager 进行网络管理,需要使用 nmctl 命令来操纵 NetworkManager.service 实现网络配置。但是,在 Ubuntu 18.04 TLS 中,没有 nmctl 命令,也没有 NetworkManager.service(network-manager.service) 在运行。经过官方文档查找,我们发现在 Ubuntu 18.04 TLS 中使用 Netplan 进行网络管理,而 Netplan 是个前端程序,它会调用 NetworkManager 或者 systemd-networkd 完成网络配置。哦,原来 Ubuntu 使用其他管理工具来管理网络。
然后,我们便开始回忆其他 Linux 发行版,我们逐渐发现:现在,工具越来越多,每个发行版都有自己的管理方法,都有自己的管理工具。防火墙,虽然底层使用相同的技术,但是各发行版均采用不同的前端管理工具。网络管理,各个发行版也采用不同的配置工具。文件系统,各个发行版默认采用不同的文件系统,那么管理工具也不相同。这些便催生这篇笔记,我们需要汇总各个发行版中管理网络的工具,否则将来维护系统时将无从下手(虽然底层原理没有过多变化,但是这些五花八门的工具的用法已经足够让人焦头烂额)。
该笔记将记录:概述各种 Linux 发行版的默认配置网络的工具、相关的学习资料,以及要面对的问题。
解决方案
该部分笔记将包含如下内容:
基础配置,仅与操作系统相关,能够完成网络连接(访问外网),比如 IP-Address、Gateway、DNS 等等配置。高级网络特性可能需要与网络设备联动,
网络管理的方式
在 Linux 中,管理网络方式分为两种:
1)通过修改配置文件(废弃)

在以前维护 CentOS 6.x 网络[……]

READ MORE

「Linux」- 通过使用 NetworkManager 管理网络

问题描述
NetworkManager,是标准的 Linux 网络配置工具集,其支持从 Desktop 到 Server 和 Mobile Device 的各种网络设置,并与流行的桌面环境和服务器配置管理工具很好地集成。
该笔记将记录:在 Linux 中,如何使用 NetworkManager 管理网络(偏向与服务器网络设置,而非桌面环境),以及常见问题处理。
解决方案
Ubuntu 18.04 TLS
安装 NetworkManager 服务:

apt-get install network-manager
apt-get install network-manager-* # 安装全家桶

systemctl start NetworkManager.service
systemctl enable NetworkManager.service

如果 NetwrokManager 无法管理网络接口,可能需要进行如下处理: 1)修改 /etc/network/interfaces 文件,注释全部与接口配置有关的行(但除 lo 接口)
相关链接
官方站点:https://networkmanager.dev/ NetworkManager Reference Manual – GNOME Developer Center
How do I prevent Network Manager from controlling an interface? Disable network manager for a particular interface Ignore interface in NetworkManager
参考文献
NetworkManager – Community Help Wiki[……]

READ MORE

「NetworkManager」- 常见问题

Q:用户的网络配置保存在哪里?
NetworkManager – Debian Wiki
由 NetworkManager 创建的连接信息都保存在 /etc/NetworkManager/system-connections/ 中,一般文件名为连接名。
Ubuntu 20.04 LTS, /etc/NetworkManager/system-connections/
Q:如何实现多个链路自动切换?
Network failover
Ubuntu 20.04 LTS
在 Wifi 与 Ethernet 间,链路的切换是通过 route metric(路由优先级,即浮动路由技术)实现的: 1)当 connection.autoconnect = yes 时,链路都会启动,但默认路由优先级不同(命令 ip route 查看); 2)当高优先级的链路断开(或消失)后,其默认路由消失,另条链路的默认路由“浮出”成为默认路由; 3)在 Ubuntu 20.04 LTS 中,来自 Wifi 的默认路由优先级为 600,来自 Eth 的默认路由优先级为 100;
配置 Wifi 优先级高于 Ethernet 链路:

nmcli connection modify ‘<Your Ethernet Connection>’ ipv4.route-metric 200
nmcli connection modify ‘<Your Wireless Connection>’ ipv4.route-metric 300[……]

READ MORE

「Linux」- 通过 NetworkManager 配置网络地址

问题描述
该笔记将记录:如何使用 NetworkManager 配置网络,以及常见问题处理。
解决方案
IPv4, DHCP

nmcli connection add \
connection.type ‘802-3-ethernet’ \
connection.id ‘conn-name’ \
connection.interface-name ‘eth0’ \
ipv4.method auto

nmcli connection up ‘conn-name’

IPv4, Static

nmcli connection add connection.type ‘802-3-ethernet’ \
connection.id ‘conn-name’ \
connection.interface-name eth0 \
connection.autoconnect yes \
ipv4.method manual \
ipv4.addresses “192.168.1.134/24” \
ipv4.dns “192.168.1.10 192.168.1.11” \
ipv4.gateway “192.168.1.5”

nmcli connection up ‘conn-name’

添加(或删除)多个地址:

#### 添加

nmcli connection modify “connection-name” \
ipv4.addresses ‘78.34.56.23/20, 78.34.56.24/20’ # 设置多个地址

nmcli connection modify “connection-name” \
+ipv4.addresses ‘78.34.56.23/20’ # 追加新的地址

nmcli connection up “connection-name” # 应用配置(直接 UP 即可,无需 DOWN 操作)

ip address “<interface-name>” # 验证地址已绑定到网卡

#### 删除

nmcli connection modify “connection-name” \
-ipv4.addre[……]

READ MORE

「Linux」- 禁止 NetworkManager 修改 /etc/resolv.conf 配置

问题描述
当我们使用 NetworkManager 修改网络配置之后,命令 nmcli connection up xxx 会修改 /etc/resolv.conf 配置文件。
但是在某些场景下,我们并不希望 NetworkManager 修改 /etc/resov.conf 配置文件。
该笔记将记录:如何禁止 NetworkManager 修改 /etc/resolv.conf 文件
解决方法
如果使用 NetworkMnager 服务管理网络,在 /etc/NetworkManager/NetworkManager.conf 的 [main] 部分配置 dns=none 行,然后重启 NetworkManager 服务。
如果在 Debian-like 发行版中,还可以考虑使用 resolvconf 软件包。
附加说明
还有另外两种解决方案,1)设置链接的 ipv4.dns-priority 以控制多个连接的 ipv4.dns 在 /etc/resolv.conf 中的显示顺序,2)或者不指定连接的 ipv4.dns 选项
具体使用哪个方案,取决于我们是否明确需求与问题。
参考文献
network manager: how to stop nm updating /etc/resolv.conf ipv4: NetworkManager Reference Manual[……]

READ MORE

「NetworkManager」- 网络连接检查功能

网络连接检查功能
在 NetworkManager 中,有个功能:允许 NetworkManager 检测系统是否可以实际访问互联网。
就是说,虽然网络正常配置,也正常启动,但是它还是会尝试使用 HTTP 请求一个 URL 来判断到能不能访问外部网络。
默认的配置信息
这个 URL 可以在配置文件中设置。在 Debian 中,默认配置文件位于 /usr/lib/NetworkManager/conf.d/20-connectivity-debian.conf 中。

[connectivity]
uri=http://network-test.debian.org/nm

如何调整该配置?
可以在 /etc/NetworkManager/conf.d/ 中常见配置文件进行覆盖。
如果要禁用该功能,可以在配置文件使用一个空的 [connectivity] 部分,即没有任何参数。
我们是怎么发现这个功能的?
我们没有完整的读过 NetworkManager 的手册,也是碰巧发现这个功能的。
在处理别的问题的时候,使用 tcpdump -X -vv 抓包,发现了有发往Debain服务器的数据包。在 tcpdump 的输出中,显示访问 http://network-test.debian.org/nm 地址,然后去 Google 搜索。然后就发现此功能,最后阅读 man 5 NetworkManager 手册进行深度了解。
参考文献
ArchWiki/NetworkManager/Checking connectivity Debian Bug report logs – #859934 enable captive portal checking by default Debian Bug report logs – #729783 network-manager: Add network connectivy test using http://network-test.debian.org/nm what will network-manager-config-connectivity-debian do?[……]

READ MORE

「NetworkManager」- 通过命令 nmcli conneciton modify 配置无效

问题描述
在 CentOS 7.x 中,当我们使用 nmcli connection modify 修改网络配置时,未生效。即使重启 NetworkManager 服务,也无法生效
问题原因
解决方案
# 03/28/2021 我们仅能通过删除旧连接并重新创建连接来解决该问题。[……]

READ MORE

「NetworkManage」- 设备未被管理(unmanaged devices)

问题描述
在某些情况下,网卡为 ummanaged 状态。如下所示,无线 wlan0 未管理:

# nmcli device
DEVICE TYPE STATE CONNECTION
wlan0 wifi unmanaged —
lo loopback unmanaged —

无线网卡 wlan0 处于 unmanaged 状态,这表示此设备不被 Networkmanager 管理。
解决方案
临时让 NetworkManager 管理此设备,执行如下命令:

nmcli dev set wlan0 managed yes

如果希望使配置永久(持久化)生效:

# vim /etc/NetworkManager/NetworkManager.conf

[ifupdown]
managed=true

如果上述配置方法不生效,则(Bug #1658921):

# 在 Ubuntu 20.04 LTS 中,我们需要创建该文件才能解决问题
touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf

如果有些设备不需要被 NetworkManager 管理,则可以: 1)使用 nmcli 命令: 2)或修改配置文件。配置文件的修改参考 NetworkManager.conf 手册中的 unmanaged-devices 指令。
参考文献
Ethernet device not managed Bug #1658921 “NetworkManager does not manage wired connection” : Bugs : network-manager package : Ubuntu[……]

READ MORE

「Netplan」- 操作系统网络配置工具(Ubuntu)

Netplan,网络配置抽象渲染器,是个用于在 Linux 系统上轻松配置网络的实用程序。只需创建所需网络接口的YAML描述以及每个接口应配置的内容。 根据此描述,Netplan将为您选择的渲染器工具生成所有必要的配置。
常见问题记录
# 04/02/2021 在 Ubuntu 18.4 TLS / Netplan 1.10.1 中,无法配置 /etc/resolv.conf 的 options single-request 选项。
参考文献
Netplan | Backend-agnostic network configuration in YAML

章节列表
「Linux」- 通过 Netplan 配置网络地址 「Netplan」 – 修改网络接口名称[……]

READ MORE

「Linux」- 通过 Netplan 配置网络地址

问题描述
在 Ubuntu 18.04 中,默认的网络配置工具为 Netplan,并使用 systemd-networkd 作为后端配置工具。
该笔记将记录:在 Ubuntu 18.04 中,如何使用 Netplan 配置网络地址,以及常见问题处理。
解决方案
更多使用方法,参考 Netplan | Backend-agnostic network configuration in YAML 文档。
静态地址绑定

# 添加配置
cat > /etc/netplan/01-static.yaml <<EOF
network:
version: 2
# renderer: NetworkManager
renderer: networkd
ethernets:
enp3s0:
addresses:
– 192.168.10.126/24
gateway4: 192.168.10.1
nameservers:
addresses: [223.6.6.6, 223.5.5.5]
EOF

# 应用配置
netplan apply

动态分配(DHCP)

# 添加配置
cat > /etc/netplan/01-static.yaml <<EOF
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: true
EOF

# 应用配置
netplan apply

参考文献
Netplan | Backend-agnostic network configuration in YAML[……]

READ MORE

「Netplan」 – 修改网络接口名称

根据 Netplan 文档,通过 MAC Address 匹配设备,然后修改名称:

network:
ethernets:

eth0:
match:
macaddress: b4:05:5d:02:d5:6c
set-name: eth0

eth1:
match:
macaddress: b4:05:5d:02:d5:6d
set-name: eth1

fibre0:
match:
macaddress: b4:05:5d:02:d5:6a
set-name: fibre0

fibre1:
match:
macaddress: b4:05:5d:02:d5:6b
set-name: fibre1

version: 2

参考文献
networking – How to rename a network interface in 20.04 – Ask Ubuntu[……]

READ MORE

「Linux」- 通过 systemd.network 管理网络

如果没有 resolvctl 命令,亦可使用 systemd-resolve –status 命令查看状态
参考文献
Ubuntu Manpage: systemd.network – Network configuration How to troubleshoot DNS with systemd-resolved? – Unix & Linux Stack Exchange

章节列表
「Linux」- 禁止 NetworkManager 设置 /etc/resolv.conf 使用 127.0.0.53 地址 「systemd」- 可预测网络接口名[……]

READ MORE

「systemd」- 可预测网络接口名

问题描述
传统的网络接口命名方式(eth0, eth1, …)与驱动的探测顺序有关,这样带来的问题是: 1)如果有多张网卡,某个接口是以 eth0 命名,重启后下次就可能变成以 eth1 命名; 2)再比如,当做 Bonding 时候,怎么能接受网卡名变来变去呢? 3)再比如,防火墙,接口命名发生变化,但是防火墙还作用于原来的接口,这就会导致安全问题;
解决方案
可预测网络接口名
从 systemd v197 开始,会给网络设备一个稳定的、可预测的命名。这区别于传统的 eth0、eth1、wlan0 之类的命名规则;
关于可预测网络接口名的命名规则,参考源码说明:https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-net_id.c#L20
如何启用
首先,要确保的系统使用 systemd 为初始化进程,这是 systemd 197 引入的功能;
在 /etc/default/grup 中,参数 GRUB_CMDLINE_LINUX_DEFAULT=”” 不要添加 net.ifnames=0 参数(而添加表示禁用); 确保 /etc/systemd/network/99-default.link 没有指向 /dev/null 设备(这是用于禁用可预测网络接口名功能的); 最后,确保没有使用 /etc/systemd/network/ 中没有自定义的命名规则文件(扩展名为.link 的文件);
1)在 Debian 中,通过命令 update-grub 来更新引导,这一步是为了修改传递给内核的启动参数(net.ifnames=0); 2)至于其他的发行版配置方法,需要参考发行版的文档说明;
如何禁用
如果觉得这种命名比较傻,可以使用下面的三种方式来使用旧的网卡命名方式:
掩盖网络设备配置文件
You disable the assignment of fixed names, so that the unpredictable kernel names are used again. For this, simply mask udev’s .link file for the default policy:

# ln -s /dev/null /etc/systemd/network/99-default.link

创建上述的软链接即可;
自定义命名方案
You create your own manual naming scheme, for example by naming your interfaces “internet0”, “dmz[……]

READ MORE

「Linux」- 禁止 NetworkManager 设置 /etc/resolv.conf 使用 127.0.0.53 地址

问题描述
在 Ubuntu 20.04 LTS 中,当使用 NetworkManager 正确配置并启用(nmcli connection up)网卡之后,DNS 配置没有生效,/etc/resolv.conf 坚持使用 127.0.0.53 地址的 DNS 服务。即便没有该服务(127.0.0.53:53),NetworkManager 也坚持使用该地址。并且 /etc/resolv.conf 包含 # Generated by NetworkManager 文本,就表明这是 NetworkManager 生成的。
该问题可能并不常见,只会在某些 Linux 发行版中出现,我们是在 Ubuntu 20.04 LTS 中遇到该问题。
原因分析
该问题的原因非常多,我们无法一一列举,只能描述我们的场景。
经过一番 Google 之后,各种解决方案并不适用于我们的场景,我们只能求助于官方 NetworkManager.conf(1.22) 文档对 dns 处理模式的设置:

Set the DNS processing mode.

If the key is unspecified, default is used, unless /etc/resolv.conf is a symlink to /run/systemd/resolve/stub-resolv.conf, /run/systemd/resolve/resolv.conf, /lib/systemd/resolv.conf or /usr/lib/systemd/resolv.conf. In that case, systemd-resolved is chosen automatically.

default: NetworkManager will update /etc/resolv.conf to reflect the nameservers provided by currently active connections.

dnsmasq: NetworkManager will run dnsmasq as a local caching nameserver, using “Conditional Forwarding” if you are connected to a VPN, and then update resolv.conf to point to the local nameserver. It is possible to pass custom options to the dnsmasq instance by adding[……]

READ MORE

「Liunx」- 将网络接口连接到串行线路

当时在整理slattach(1)命令,不明白其含义,因此到网上查了一下。作为一名Web开发,看到这些东西还是很新奇的。
串行接口简称串口,也称“串行通信接口”或“串行通讯接口”(通常指“COM接口”),是采用串行通信方式的扩展接口。
不过,现在基本没有COM口设备了,串口已经很少见了。COM口通信速度慢,以前COM口主要是用来接鼠标或调制解调器,不过那种设备早淘汰了,笔记本减轻重量,没必要加COM了。而USB比它快得多,又通用,还支持热插拔,而且也是串行通信的。
以下内容完全是复制过来的。
如何使用串口建立网络连接
SLIP, 即Serial Line IP(串行线路IP), 是一个数据链路层协议,用于在串行线路上传输IP数据报。
本文讲述如何在两台用串口线(RS232)连接的Linux机器之间配置SLIP链路。
设两台机器为A, B。首先,将两台机器用串口线连接好,然后在A机器上依次运行如下指令:

slattach /dev/ttyS0 -p slip -s 9600 -m -d &

ifconfig sl0 192.168.1.1 pointopoint 192.168.1.2 up

route add default gw 192.168.1.2

其中,/dev/ttyS0是第1上串口设备,如果有多个串口,则依次是/dev/ttyS1, /dev/ttyS2…,要视情况而定。
slattach的-p选项指定要使用的数据链路层协议,可以是slip, cslip, ppp等; -s指定传输速率,可以是9600,115200等;
-m告诉串口设备不要工作在RAW data模式,而是要工作在协议驱动模式;-d输出调试信息。
ifconfig用于配置串行接口的ip信息等。sl0代表第一个串行接口,如果有更多,依次是sl1, sl2…。
route将对方ip添加为默认网关。
然后在B机器上依次运行以下指令:

slattach /dev/ttyS0 -p slip -s 9600 -m -d &

ifconfig sl0 192.168.1.2 pointopoint 192.168.1.1 up

route add default gw 192.168.1.1

指令和A一样,要注意的是ip地址要设对。还有就是两边所用的协议、传输速率也要一样。
好了,如果没有出错,连接就建立成功了。
可以用在A或B上运行“ping 对方地址”来测试[……]

READ MORE