Linux 系统管理
本文记录一些 Linux 系统管理相关笔记。
auditd
部署的危险性
auditd
会使用到内核审计模块,极容易影响系统性能。在配置不当的情况下,会直接导致系统挂起,以及启动失败。千万不能在生产系统上部署 auditd
。
参考:
使用 aptly
搭建本地镜像仓库
搭建本地 Debian 软件包仓库,主要涉及 aptly
、gpg
与 nginx
的配置。在使用本地软件包仓库的主机上,需要导入服务器的 GPG 密钥。
服务器上
aptly
操作
为下载 deb-src
,需要往 ~/.aptly.conf
加入 "downloadSourcePackages": true
。
$ cat .aptly.conf
{
"rootDir": "/home/it/.aptly",
"downloadConcurrency": 8,
"downloadSourcePackages": true,
"downloadSpeedLimit": 0,
"downloadRetries": 0,
"downloader": "default",
"databaseOpenAttempts": -1,
"architectures": [],
"dependencyFollowSuggests": false,
"dependencyFollowRecommends": false,
"dependencyFollowAllVariants": false,
"dependencyFollowSource": false,
"dependencyVerboseResolve": false,
"gpgDisableSign": false,
"gpgDisableVerify": false,
"gpgProvider": "gpg",
"downloadSourcePackages": false,
"skipLegacyPool": true,
"ppaDistributorID": "ubuntu",
"ppaCodename": "",
"skipContentsPublishing": false,
"skipBz2Publishing": false,
"FileSystemPublishEndpoints": {},
"S3PublishEndpoints": {},
"SwiftPublishEndpoints": {},
"AzurePublishEndpoints": {},
"AsyncAPI": false,
"enableMetricsEndpoint": false
}
接下来需要创建镜像、下载镜像、创建快照及发布快照。
# 添加 bookworm、bookworm-backports 镜像
aptly mirror -architectures="amd64" create bookworm http://mirror.nju.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
aptly mirror -architectures="amd64" create bookworm-backports http://mirror.nju.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
# 从设置的互联网镜像库,下载软件包仓库
aptly mirror update bookworm
aptly mirror update bookworm-backports
# 创建快照
aptly snapshot create bookworm_main from mirror bookworm
aptly snapshot create bookworm_contrib from mirror bookworm
aptly snapshot create bookworm_non-free from mirror bookworm
aptly snapshot create bookworm_non-free-firmware from mirror bookworm
aptly snapshot create bookworm-backports_main from mirror bookworm-backports
aptly snapshot create bookworm-backports_contrib from mirror bookworm-backports
aptly snapshot create bookworm-backports_non-free from mirror bookworm-backports
aptly snapshot create bookworm-backports_non-free-firmware from mirror bookworm-backports
# 生成 GPG 密钥
gpg --full-generate-key
# 发布快照(使用 GPG 加密,需要 CPU 资源,耗时较长)
aptly publish snapshot -component=main,contrib,non-free,non-free-firmware -distribution="bookworm" -architectures="amd64,source" -gpg-key="61AC7886A894CF68CBFD0BDF0A47F131FB5C5729" bookworm_main bookworm_contrib bookworm_non-free bookworm_non-free-firmware
aptly publish snapshot -component=main,contrib,non-free,non-free-firmware -distribution="bookworm-backports" -architectures="amd64,source" -gpg-key="61AC7886A894CF68CBFD0BDF0A47F131FB5C5729" bookworm-backports_main bookworm-backports_contrib bookworm-backports_non-free bookworm-backports_non-free-firmware
- Nginx 配置文件
server {
listen 80;
server_name deb-mirror.xfoss.com;
access_log /var/log/nginx/packages-error.log;
error_log /var/log/nginx/packages-error.log;
location / {
root /home/it/.aptly/data/public;
index index.html;
autoindex on;
}
}
- 导出
GPG
公钥
gpg --armor --output ~/.aptly/data/public/gpg --export 61AC7886A894CF68CBFD0BDF0A47F131FB5C5729
主机上
# Trust your mirror's public key
wget -O - -q http://deb-mirror.xfoss.com/gpg | sudo apt-key add -
# Add your Debian mirror to source list
echo 'deb http://deb-mirror.xfoss.com/ bookworm main' | sudo tee -a /etc/apt/sources.list
echo 'deb-src http://deb-mirror.xfoss.com/ bookworm main' | sudo tee -a /etc/apt/sources.list
echo 'deb http://deb-mirror.xfoss.com/ bookworm-backports main' | sudo tee -a /etc/apt/sources.list
echo 'deb-src http://deb-mirror.xfoss.com/ bookworm-backports main' | sudo tee -a /etc/apt/sources.list
# Update apt cache
sudo apt update
一个正在编写的自动化脚本
#!/usr/bin/env bash
declare -a MIRRORS
MIRRORS["bookworm"]="bookworm_mirror"
MIRRORS["bookworm-backports"]="bookworm-backports_mirror"
COMPS=("main" "contrib" "non-free" "non-free-firmware")
UPSTREAM="http://mirror.nju.edu.cn/debian/"
for str in ${DISTS[@]}; do
echo "${str}"
done
# Create mirror
#
# Create a mirror for a distribution, from specified upstream repository
#
# $1 - Mirror name
# $2 - Upstream repository
# $3 - Distribution
function mirror_creation() {
if [ ! -z "$(aptly mirror list | grep ${1})" ]; then return; fi
aptly mirror -architectures="amd64" create "$1" "$2" "$3" main contrib non-free non-free-firmware
}
# Update mirror
#
# Update a existing mirror
#
# $1 - Mirror name
function mirror_update() {
aptly mirror update "$1"
}
# Create snapshot
#
# Create a snapshot from some mirror
#
# $1 - Snaphost name, each for one component
# $2 - Mirror name
function snapshot_creation() {
aptly snapshot create "$1" from mirror "$2"
}
# Publish snapshot
#
# Publish a snapshot with specified GPG key.
# PS: a passwordless GPG key is needed.
# Refs:
# 1. https://github.com/aptly-dev/aptly/issues/24#issuecomment-39314629
# 2. https://gist.github.com/woods/8970150
#
function snapshot_publish() {
aptly publish snapshot -component="$1" -distribution="$2" -architectures="amd64" -gpg-key="$3" "$4"
}
参考:
Setting up a Debian package mirror with Aptly for offline use
Publishing multi-component snapshots fails with unable to parse command
ext4
与 btrfs
快照
Debian apt-add-repository
安装问题
sudo apt install -y python3-launchpadlib software-properties-common
参考:
RHEL 启动报错:Failed to open \EFI\redhat\ grubx64.efi- Not Found
在参考链接第 5 步中,应执行如下操作。
cd /boot/efi/EFI
就可以看到 BOOT
、centos
与 redhat
目录。
参考:Rhel断电重启报错:“Failed to open \EFI\redhat\ grubx64.efi- Not Found“的解决办法
查看各个子目录大小
du -ah --max-depth=1
使用 gpg
命令生成随机密码
命令 gpg --gen-random 1 6 | base64
可生成能作为随机密码的 8 位随机字符串。gpg --gen-random 1 8 | base64
可生成 12 位随机字符串。
参考:4 Ways to Generate a Strong Pre-Shared Key (PSK) in Linux
crontab
定时任务运行问题
在复杂的定时任务中,crontab
因为不会发生用户登录动作,而导致用户 home 目录下的 .bashrc
(或 .zshrc
) 脚本文件不会运行,因此其中设置的环境变量就不会生效。在定时任务依赖这些环境变量时,那么这些定时任务就会失败。
此时,应 source /etc/profile && source /etc/bashrc && source ~/.bashrc
,然后运行定时任务。
/etc/fstab
中的挂载项导致 Linux 开机失败
在机房整理过程中(2024.9.8)一台 Linux 服务器启动失败,进入安全模式。经查这是由于 /etc/fstab
中一些加载项无法加载导致。关机后从 U 盘启动进入 Live Linux 系统。并参考 挂载 LVM 逻辑卷,挂载原系统上的 /dev/mapper/rhel-root
卷到 /media/tmpRoot
,然后修改原系统的 /etc/fstab
,重启成功启动该主机 Linux 系统。
/etc/rc.local
Linux 自启动程序
RH/CentOS EL7 上,可以在 /etc/rc.local
中,加入随系统启动的自启动程序。
# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Mar 29 00:14 /etc/rc.local -> rc.d/rc.local
“但是自从 Debian 9 开始,Debian 默认不带 /etc/rc.local 文件,而 rc.local 服务却还是自带的”
因此,在 Debian 系统上如何加入自启动程序,请参阅下面的链接。
参考
CentOS debuginfo-install
问题
调试信息显示,需要安全 glibc-2.17-317.el7.x86_64
的包,就要前往 CentOS Debuginfo Mirror 下载下面两个包:
-
glibc-debuginfo-common-2.17-317.el7.x86_64.rpm
-
glibc-debuginfo-2.17-317.el7.x86_64.rpm
然后运行以下命令安装这两个软件包。
rpm -ivh glibc-debuginfo-common-2.17-317.el7.x86_64.rpm glibc-debuginfo-2.17-317.el7.x86_64.rpm
参考:
RH/CentOS EL6.9/7.9 /etc/hosts.allow
问题
经实地配置测试,EL6.9/EL7.9 上,/etc/hosts.allow
的配置有差异。在 EL7.9 上,如下配置没有问题(可以达到预期效果,即放行指定网段,拒绝其他网段)。
/etc/hosts.deny
sshd: ALL
/etc/hosts.allow
sshd: localhost
sshd: 10.10.1.0/24
但在 EL6.9 上,这样写不能达到预期效果,会拒绝包括 10.10.1.0/24
在内的全部 SSH 连接。在 EL6.9 上应如下配置(/etc/hosts.deny
保持不变)。
/etc/hosts.deny
sshd:localhost:allow
sshd:10.10.1.:alllow
此外,在失去对所配置主机的 SSH 访问后,可通过服务器频带外管理,out-of-band management 平台(DELL iDrac,DELL Remote Access Controller)登入系统修改此配置。若iDrac 不可用,则可通过 LSF bsub -m xfoss-com-03 -Ip bash
命令,将 bash
提交到目标机器 xfoss-com-03
上执行,从而获得对目标机器的访问,然后修改此配置并获取到对目标机器的 SSH 访问。
modprobe -a vmw_vmci vmmon
问题
在 manjaro 上,安装了 vmware-workstation 后,运行 vmware
会报出 vmmon
找不到的问题。
而在运行 sudo modprobe -a vmmon
时,会报错错误:
modprobe: WARNING: Module vmmon not found in directory /lib/modules/6.6.32-1-MANJARO
此时执行以下操作,即可解决此问题。
$ uname -r
6.6.32-1-MANJARO
$ sudo pacman -S linux66-headers
$ sudo modprobe -a vmw_vmci vmmon
删除 3 个月(90 天前)的文件与文件夹
#!/usr/bin/env bash
let PERIOD=90
echo "Delete things 3 months(90 days) ago."
for item in $(find . -maxdepth 1 -not -name '.' -not -name '.*' -mtime +$PERIOD); do
rm -rf "$item"
done
其中 -mtime +90
表示 90 天前有改动的文件和文件夹。
调整 Linux LVM 分区大小
近期发现一台 Linux 服务器分区不合理, /
根分区过小(50G
), 其与 /home
分区(分配了较多空间,但是并未使用)一起在一个 LVM 逻辑卷(合计约 1.7T
)下,使用了 xfs
文件系统。
调整他们大小的命令如下:
umount -lf /home
lvremove /dev/mapper/centos-home
lvextend -L +1000G /dev/mapper/centos-root
xfs_growfs /dev/mapper/centos-root
lvcreate -L 400G -n home centos
mkfs.xfs /dev/centos/home
lsblk -f
lvdisplay
mkfs.xfs /dev/centos/home
mount /dev/centos/home /home
df -h
列出 wheel
组下用户,及将用户从 wheel
组移除
列出 wheel
组下的用户
getent group wheel
将用户从 wheel
组移除
gpasswd --delete username wheel
Debian 网络配置中的一个问题
在安装了 Debian 基本系统,手动配置了网络接口 IP 地址后,因需要使用其图形界面,故安装了 Xfce, Lxde 两个桌面环境,而随之安装了 connman
软件包。此时原先手动配置的 IP 地址失效,connman
接管了系统网络接口的配置,手动配置的 IP 地址失效,网络接口将默认通过 DHCP 获取 IP 地址,除非在 connman
中设置了 IP 地址。
此外,connman
将建立一条默认 default
路由,且经测试,该默认路由无法通过 ip route delete
或 route delete
删除。从而给主机通信造成问题。
要在使用 connman
的情况下,有正确的默认路由,可修改 connman
配置文件 /etc/connman/main.conf
,利用 NetworkInterfaceBlacklist
,先暂时把不希望作为默认路由的网卡,设置为不由 connman
管理,随后运行 systemctl restart connman
即可生效。等得到正确的默认路由后,再注释掉这个配置,此后也要运行 systemctl restart connman
。
Debian IP 地址设置
在一个安装的 Debian 机器上,想要配置静态 IP 地址,发现修改 /etc/network/interfaces
并不生效。后面发现,该机器上安装了 xfce
、lxde
桌面环境,需要使用 root
账号,在图形下于 NetworkManger Applet
上点击鼠标右键,通过 Edit connections
进行添加。
此外,Debian 上的网络连接会因为某种原因(如 apt purge -y connman
)DOWN 掉,这时需要在 root
用户下,运行 ifup ens192
类似命令开启,网络连接才又会正常。
sshd_config
中 UsePAM yes
及 PAM
环境变量的问题
现 Ubuntu 22.04.1 已经成功加入 M$ AD,但是无法使用 AD 上的账号,进行 SSH 登录。排查后,发现需要开启 sshd_config
中,以下的项目:
-
PasswordAuthentication yes
-
KbdInteractiveAuthentication yes
-
UsePAM yes
而在可以通过 AD 上的账号登录后,又报错以下错误:
Last login: Sat Mar 2 16:43:18 2024
-bash: groups: 未找到命令
命令 “lesspipe” 可在以下位置找到
* /bin/lesspipe
* /usr/bin/lesspipe
由于 /usr/bin:/bin 不在 PATH 环境变量中,故无法找到该命令。
lesspipe:未找到命令
命令 “dircolors” 可在以下位置找到
* /bin/dircolors
* /usr/bin/dircolors
由于 /bin:/usr/bin 不在 PATH 环境变量中,故无法找到该命令。
dircolors:未找到命令
分析是 PAM 登录方式下,未能正确加载用户环境变量所致。故要修改 /etc/security/pam_env.conf
文件,取消以下两行的注释:
PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
然后在使用 AD 账号登录系统后,不再报出上面有个环境变量的错误。
安装 samba
时 yum
依赖失败的处理(glibc-common
)
参考: Yum Dependencies resolution fail (glibc-common)
- 检查重复
sudo yum list --showduplicates glibc
- 降级
glibc
sudo yum downgrade glibc glibc-common glibc-devel glibc-headers
- 安装
samba
sudo yum -y install samba-common samba samba-client smbldap-tools openldap-clients nss-pam-ldapd
查看服务器型号、序列号与内存插槽、规格
-
查看服务器型号、序列号:
dmidecode -t1
-
查看内存插槽情况:
dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range
-
查看内存规格:
dmidecode -t memory
GParted 分配未分配磁盘空间
参考:How to allocate unallocated disk space with GParted Live?
-
先将扩展分区,the Extended partition,增长到磁盘末尾
-
随后即可在扩展分区下,将需要增大的分区增大到先前未分配的空间
挂载 LVM 逻辑卷
在 /dev/sda3
是个逻辑卷时,mount /dev/sda3 /media/tmpRoot
就会报错:
mount: unknown filesystem type 'LVM2_member'
要挂载 LVM,就要先了解其内部结构,以及 LVM 的名字,此时需要使用 fdisk -l
命令:
其中可以看出,/dev/sda
有三个分区,其中 /dev/sda3
是个 Linux LVM,其名字为 mapper
,他下面又有三个磁盘,分别是:
-
/dev/mapper/centos-root
-
/dev/mapper/centos-swap
-
/dev/mapper/centos-home
了解这些信息后,即可使用 mount /dev/mapper/centos-root /media/tmpRoot
,将 /dev/mapper
下的 centos-root
磁盘,挂载到 /media/tmpRoot
上了。前提是当前主机系统安装了 lvm2
支持(所幸使用的 Linux 启动盘 Clonezilla,对各种文件系统支持非常好)。
参考链接:
Debian 中支持 ll
命令
在 /etc/profile.d
下,编写一个 ll_cmd.sh
脚本,内容如下:
alias ll='ls -alF'
source /etc/profile.d/ll_cmd.sh
会立即生效,以后重启系统后将自动生效。
在 WSL2 GUI 中使用 pulseaudio 播放声音
参考:在 WSL2 GUI 中使用 pulseaudio 播放声音
使用 chpasswd
批量修改密码
首先以下面的格式,建立 user-list.txt
文件:
user1:password2
user2:password2
user3:password3
...
然后执行 sudo chpasswd < user-list.txt
即可批量修改密码。
NetworkManager.service
is masked
此问题在 $ sudo systemctl enable --now NetworkManager.service
时,会导致失败,报出如下错误:
Failed to enable unit: Unit file /etc/systemd/system/NetworkManager.service is masked.
参考 What is a masked service?,可以解除该服务的遮蔽,从而解决问题。
X2go 安装过程
快速将咱们的机器转入到一台 X2Go 服务器:
sudo apt-add-repository ppa:x2go/stable
sudo apt-get update
sudo apt-get install x2goserver x2goserver-xsession ubuntu-mate-core mate-tweak lxde xfce4 x2gomatebindings x2golxdebindings -y # if you use LXDE/lubuntu
快速安装 x2goclient
:
sudo apt-add-repository ppa:x2go/stable
sudo apt-get update
sudo apt-get install x2goclient
"Authentication required. System policy prevents WiFi scans"
在使用 X2go 客户端连接到 Linux Mate 桌面时,会遇到这个问题。参考:
在 /etc/polkit-1/localauthority/50-local.d/
下建立一个 47-allow-wifi-scan.pkla
策略文件,内容如下:
[Allow Wifi Scan]
Identity=unix-user:*
Action=org.freedesktop.NetworkManager.wifi.scan;org.freedesktop.NetworkManager.enable-disable-wifi;org.freedesktop.NetworkManager.settings.modify.own;org.freedesktop.NetworkManager.settings.modify.system;org.freedesktop.NetworkManager.network-control
ResultAny=yes
ResultInactive=yes
ResultActive=yes
然后运行 $ sudo systemctl restart polkit.service
重启该服务,之后问题解决。
X2Go "Globally allow server-side disabling of the clipboard" 问题
此问题已在 X2Go
4.0.1.16
版本中解决,参考 Globally allow server-side disabling of the clipboard
在文件 /etc/x2go/x2goagent.options
中,找到 X2GO_NXAGENT_DEFAULT_OPTIONS+=" -clipboard both"
这行,将其解除注释,然后根据需要设置 both
、client
、server
或 none
选项。
X2go "Authentication is required to create a color profile/managed device" 问题
参考:How to fix “Authentication is required to create a color profile/managed device” on Ubuntu 22.04
解决方法(Debian Bookworm):
sudo mkdir -p /etc/polkit-1/localauthority/50-local.d
sudo vim /etc/polit-1/localauthority/50-local.d/45-allow-colord.pkla
将下面的内容,粘贴到该文件:
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
然后运行 $ sudo systemctl restart polkit.service
重启该服务,之后问题解决。
"Ehternet device not managed" 问题
在安装 Ubuntu 时,因安装的是服务器版本,而只安装了 ubuntu-mate-core mate-tweak lxde xfce4
桌面,重启后发现没有网络连接。
Ubuntu 安装 FirefoxESR
Mozilla Firefox 有着两个发布系列:Rapid 与 ESR。Rapid 发布
添加 Mozilla 官方 PPA:
sudo add-apt-repository -y ppa:mozillateam/ppa
安装 FirefoxESR:
sudo apt install -y firefox-esr
参考:How to install Firefox ESR via PPA in Ubuntu 22.04 | 20.04
dpkg-statoverride
命令
在安装软件包时,偶然会遇到下面这种情况:
这是就要查看这个 statoverride
文件:
$ sudo dpkg-statoverride --list
geoclue geoclue 755 /var/lib/geoclue
root lp 775 /var/log/hp/tmp
root crontab 2755 /usr/bin/crontab
root ssl-cert 710 /etc/ssl/private
root x2gouser 2755 /usr/lib/x2go/libx2go-server-db-sqlite3-wrapper
这时运行以下命令:
sudo dpkg-statoverride --remove /usr/lib/x2go/libx2go-server-db-sqlite3-wrapper
删除 x2gouser
的那行,随后就解决了之前报出的问题,可以正常安装软件包了。
参考:syntax error: unknown user 'munin' in statoverride file
Docker 下运行 NDS 交叉编译器报出错误
./riscv32-elf-gcc --version
bash: ./riscv32-elf-gcc: cannot execute: required file not found
此时运行:
$ ldd ./riscv32-elf-gcc
/lib64/ld-linux-x86-64.so.2 (0x7f8651aec000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f8651aec000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f8651aec000)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by ./riscv32-elf-gcc)
LDD(1) Linux Programmer's Manual LDD(1)
NAME
ldd - print shared object dependencies
SYNOPSIS
ldd [option]... file...
DESCRIPTION
ldd prints the shared objects (shared libraries) required by each program or shared object specified on the command line. An example of its use and out‐
put is the following:
$ ldd /bin/ls
linux-vdso.so.1 (0x00007ffcc3563000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f87e5459000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f87e5254000)
libc.so.6 => /lib64/libc.so.6 (0x00007f87e4e92000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f87e4c22000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f87e4a1e000)
/lib64/ld-linux-x86-64.so.2 (0x00005574bf12e000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f87e4817000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f87e45fa000)
...
解决办法:安装 gcompat
。
# apk add gcompat
参见:Docker Alpine executable binary not found even if in PATH
tar
命令用法
将多个文件压缩到一个压缩包(带通配符):
tar czf ~/wise.tar.gz -T <(\ls wise*) System.map
此命令会把当前目录下以 wise
开头的所有文件,与 System.map
文件一起打包进 wise.tar.gz
这个压缩包。而解压缩的步骤如下:
mkdir wise-bin
tar xzf wise.tar.gz -C wise-bin
解压得到一下文件:
~/wise-bin$ ls
System.map wise wise-boot-ram.bin wise.cfg wise.cfg.configs wise.lds wise.map wise.sym
切换 GRUB 默认启动项
参考:How do I change the GRUB default boot?
grep menuentry /boot/grub/grub.cfg # it will show all available menuentries
sudo vim /etc/default/grub # replace GRUB_DEFAULT=0 with GRUB_DEFAULT="needed menu entry from above"
sudo update-grub # update grub configuration file
注意:运行
update-grub
时,在 Ubuntu 上会给出Advanced ....
的提示信息,按照提示信息再编辑/etc/default/grub
文件,即可消除该提示信息,且系统可以新设定的启动项启动。
安装 Linux 系统后追加安装 Windows 系统处理
-
使用 GParted 启动盘,收缩 Linux 分区,给 Windows 安装腾出磁盘空间;
-
安装 Windows 系统到腾出的磁盘空间,随后原先的 GRUB 引导程序会被 Windows 的引导程序附带,从而系统暂时只能启动 Windows;
-
此时进入 Windows 系统,在设置中选择 “更改高级启动选项”,点击其中的 “高级启动” -> “立即重新启动”,即可进入原先的 Linux 系统;
- 进入 Linux 系统后,运行
os-prober
、update-grub
等程序,重新建立 GRUB 引导程序,实现 Windows/Linux 双系统引导。
参考链接:GRUB does not detect Windows。
将Linux机器加入到AD
本文以 Ubuntu 20.04为例,记录将 Linux 机器加入到 M$ AD的操作过程。
LDAP(AD)中的一些术语
- DN: Distinguished Name, 区分名
- CN:Common Name, 用户名/服务器名/计算机名
- OU: Organization Unit,组织单元,最多可以有4级,每级最长32个字符
- DC: Domain Component
00. 安装 SSSD 软件及工具
SSSD 是 System Security Services Daemon 的缩写。安装以下软件:
sudo apt install -y vim sssd-ad sssd-tools realmd adcli krb5-user
其中 krb5-user
是必须的,且需要修改 /etc/krb5.conf
文件,加入下面的配置:
[libdefaults]
rdns = false
注:对于 CentOS 7,需安装如下的这些软件包:
sudo yum install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python -y
在 Debian Bookworm 上,需安装以下软件包:
sudo apt -y install realmd sssd sssd-tools libnss-sss libpam-sss adcli samba-common-bin oddjob oddjob-mkhomedir packagekit
对于 Ubunt 22.04,还需检查
/etc/krb5.conf
, 确保有着下面的配置(否则域用户登录不上):
[realms]
XFOSS.COM = {
kdc = DC.XFOSS.COM
admin_server = DC.XFOSS.COM
}
01. 主机名及主机名的解析
编辑文件 /etc/hostname
,将主机名修改为 FQDN 样式(比如 udesktop.xfoss.com
)。
通过 hostname -f
查看。同时在 Windows 服务器上加入对应的 A
记录。
注:经测试,设置为仅主机名,而非 FQDN 也是可行的,比如
sta-neo-fpga
。
02. 在 Linux 机器上配置有效的 DNS 服务器
安装 resolvconf
软件包,并启动 resolvconf
服务,修改 /etc/resolvconf/resolvconf.d/head
配置文件(加入 nameserver 192.168.153.131
, 其中 192.168.153.131
就是配置了 DNS 服务的 DC 服务器地址),然后运行 sudo resolvconf -u
更新配置。
sudo apt install resolvconf -y
sudo systemctl enable --now resolvconf.service
sudo vim /etc/resolvconf/resolv.conf.d/head
sudo resolvconf -u
注意:在 CentOS 7 上没有
resolvconf
软件包,可修改/etc/resolv.conf
,然后使用命令$ sudo chattr +i /etc/resolv.conf
将这个文件属性,设置为不可修改(immutable)。
03. 在 Linux 机器上配置时间服务
将配置了 NTP 服务的 DC 服务器,配置为 Linux 机器的 NTP 服务器。编辑文件:
sudo vim /etc/systemd/timesyncd.conf
修改为:
[Time]
NTP=dc.xfoss.com
FallbackNTP=ntp.ubuntu.com
04. 连接到 AD
04-01. 发现 Active Directory
运行命令(无需 sudo
):
realm discover xfoss.com
xfoss.com
type: kerberos
realm-name: XFOSS.COM
domain-name: xfoss.com
configured: no
server-software: active-directory
client-software: sssd
required-package: sssd-tools
required-package: sssd
required-package: libnss-sss
required-package: libpam-sss
required-package: adcli
required-package: samba-common-bin
在前面的配置都正确的情况下,就可以看这个有关即将加入的域的这些信息。注意这里的 Configured: no
,只是告诉你尚未加入到这个域。
在加入到域之后,这个命令的输出如下所示:
xfoss.com
type: kerberos
realm-name: XFOSS.COM
domain-name: xfoss.com
configured: kerberos-member
server-software: active-directory
client-software: sssd
required-package: sssd-tools
required-package: sssd
required-package: libnss-sss
required-package: libpam-sss
required-package: adcli
required-package: samba-common-bin
login-formats: %U@xfoss.com
login-policy: allow-realm-logins
04-02. 加入到活动目录
要加入到活动目录,以 sudo
执行以下命令:
sudo realm join -U lenny.peng xfoss.com --os-name="`uname -o`" --os-version="`uname -rsv`" --install='/' --verbose
也可以使用 Administrator
账号,但测试不能使用 lenny.peng@xfoss.com
这样的账号。其中 lenny.peng
有相应的 AD 管理权限。
这个命令将 Linux 机器加入到 AD 下的 Computers
之下,如下图所示:
注:在 CentOS 7 下执行这个命令,会报错:
$ sudo realm join -U lenny.peng xfoss.com --os-name="`uname -o`" --os-version="`uname -rsv`" --install='/' --verbose
* Resolving: _ldap._tcp.xfoss.com
* Performing LDAP DSE lookup on: 192.168.192.135
* Successfully discovered: xfoss.com
Password for lenny.peng:
* Assuming packages are installed
* LANG=C /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.XG63V1 -U lenny.peng ads join xfoss.com osName=GNU/Linux osVer=Linux 3.10.0-1160.80.1.el7.x86_64 #1 SMP Tue Nov 8 15:48:59 UTC 2022
! Failed to enroll machine in realm: Failed to execute child process “/usr/bin/net” (No such file or directory)
realm: Couldn't join realm: Failed to enroll machine in realm. See diagnostics.
解决方法:在 CentOS 7 上,执行
$ sudo yum install samba-common-tools -y
安装这个samba-common-tools
软件包。注意:似乎还应安装
dconf-editor
这个软件包。
要脱离 AD,以 sudo
模式,运行 sudo realm leave xfoss.com
。
此时以普通用户运行 realm list xfoss.com
,输出与 realm discover xfoss.com
的输出一致。
04-03. 配置自动创建用户主目录(Creating home directory automatically)
运行命令 sudo pam-auth-update --enable mkhomedir
, 就可以在用户登录后,自动创建用户主目录。
也可以编辑 PMA 配置文件 /etc/pam.d/common-session
,加下面的内容添加到该文件末尾:
session optional pam_mkhomedir.so skel=/etc/skel umask=077
创建出来的主目录的格式为:
/home/hailin.peng@xfoss.com
、/home/lenny.peng@xfoss.com
注意:对于 CentOS 7,修改配置文件
/etc/sssd/sssd.conf
为:
[domain/xfoss.com]
use_fully_qualified_names = False
fallback_homedir = /home/%u
然后重启
sssd
:$ sudo systemctl restart sssd
。
(在 CentOS 7 上)用户登录的情况:
ssh lenny.peng@192.168.192.134
lenny.peng@192.168.192.134's password:
Creating home directory for lenny.peng.
04-04. 对设置进行测试
可能需要需要重启系统,设置才能生效。
测试发现,Linux下也是支持新用户首次登录修改密码的。在GUI登录下,直接修改密码后登录到桌面;但在SSH登录时,修改密码后会显示 Connection to ulite.xfoss.com closed.
之后需再次SSH登录。
04-05. 关于 ldap-utils
ldapsearch
是 LDAP 实用工具之一。运行 ldapsearch
需要在域账号登录环境之下。否则会报错:
peng@uDesktop:~$ ldapsearch
SASL/GSSAPI authentication started
ldap_sasl_interactive_bind_s: Local error (-2)
additional info: SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1000))
此外,ldapsearch
的运行,还需要在 DNS 服务器上设置反向解析记录(Windows DNS 服务器设置十分简单)。
ldapsearch
命令的输出如下:
SASL/GSSAPI authentication started
SASL username: Lenny.Peng@XFOSS.COM
SASL SSF: 256
SASL data security layer installed.
...
一条典型的 LDAP 查询:
ldapsearch -x -h ldap://dc.xfoss.com -p 389 -D lenny.peng@xfoss.com -b "CN=Laxers Peng,ou=RnD,dc=xfoss,dc=com" "(objectClass=person)" -w "password"
经测试,此命令在 Linux 机器本地用户/域用户登录下,都可使用(通常ldap-utils
实用工具,都需要域账户登录下,才能使用,因为这些工具,要查询/tmp/krb5cc_xxx
登录凭据)。
其中 -D
后面是域管理用户,普通用户会报错:
ldap_bind: Invalid credentials (49)
additional info: 80090308: LdapErr: DSID-0C09041C, comment: AcceptSecurityContext error, data 52e, v4563
其中 -x
指定的是简单认证;-b
指basedn
,搜索的 base dn
;(objectClass=person)
指的过滤条件;-w
直接输入管理员账号的密码(使用-W
则在稍后提示输入密码)。
推测
python-ldap
库,是对ldap-utils
的封装。
04-06. 将 AD 中的用户,加入到 sudoers
组中
修改配置文件:/etc/sudoers.d/sudoers
如下:
%sudoers ALL=(ALL) ALL
并在 AD 中建立一个用户组 sudoers
,把需要 sudo
权限的用户,加入到这个组中,那么这些用户将在 Linux 系统中得到 sudo
权限。
05. 后记
经测试,在 M$ AD 域控制器服务器关机时,以前曾登录过 Linux 机器的用户,可以继续登录,未曾登录过的用户,无法登录。说明登录凭据被保存在了 Linux 机器本地。
在 Ubuntu 上,会出现照上述步骤配置好后,无法使用 LDAP/AD 账号登录的情况,如下所示:
less /var/log/auth.log
...
Nov 30 14:19:15 fpga-sta sshd[7060]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.12.10.96 user=leny.peng
Nov 30 14:19:15 fpga-sta sshd[7060]: pam_sss(sshd:auth): authentication success; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.12.10.96 user=lenn.peng
Nov 30 14:19:15 fpga-sta sshd[7060]: pam_sss(sshd:account): Access denied for user lenny.peng: 4 (System error)
Nov 30 14:19:15 fpga-sta sshd[7060]: Failed password for lenny.peng from 10.12.10.96 port 52482 ssh2
Nov 30 14:19:15 fpga-sta sshd[7060]: fatal: Access denied for user lenny.peng by PAM account configuration [preauth]
...
一种妥协的处理办法是,将 ad_gpo_access_control = permissive
添加到 /etc/sssd/sssd.conf
配置文件的 [domain/xfoss.com]
小节,便可通过 LDAP/AD 登录了。
参考:Debugging sssd login: pam_sss [...] System error
Debian 上不能正确显示组名字
需要执行以下操作:
root@dlp:~# vi /etc/sssd/sssd.conf
# line 17 : change
# ldap_id_mapping = False
# add to the end
ldap_user_uid_number = uidNumber
ldap_user_gid_number = gidNumber
# clear cache and restart sssd
root@dlp:~# rm -f /var/lib/sss/db/*
root@dlp:~# systemctl restart sssd
modprobe
随着 UEFI BIOS 的广泛使用,操作系统内核模块的加载,在BIOS 中开启了 “Secure Boot”选项后,就更加严格了。没有数字签名/内核认证的模块,是无法加载的。会出现没有权限报错,通过 “dmesg” 可以看到更多信息。
近期由于旧笔记本不支持5gHz WiFi网络,故采购一个USB的双频无线网卡(Bus 003 Device 003: ID 0bda:c811 Realtek Semiconductor Corp. 802.11ac NIC
),这个无线网卡没有内核支持。需编译安装dkms
的内核模块。驱动在 这里。
参考项目的 README.md
文件即可安装上,且支持热插拔。
但是笔记本内置的 PCI 无线网卡就显得多余了。此时可将原来的ath9k
内核驱动模块加以屏蔽。
sudo vim.gtk3 /etc/modprobe.d/blacklist.conf
将
blacklist ath9k
加入到该文件中,并运行
sudo update-initramfs -u
sudo modprobe -r ath9k
就可以去掉原有的 ath9k
无线网卡,只保留一个新的 USB 双频无线网卡。
Linux下利用未分配的磁盘空间来扩充磁盘分区
Linux系统磁盘分区不够用时,可通过利用未分配的磁盘空间,来扩充相应磁盘分区。操作步骤如下。
00. 使用 cfdisk
查看磁盘情况
$sudo cfdisk
01. 修改分区表
使用 GParted 发行版
此方法更为简便,直接使用 GParted 启动镜像,可扩大 Linux 与 Windows 的分区,使用新增/闲置的磁盘空间。
cannot find required auxiliary files: ltmain.sh compile missing install-sh
参考:Automake error './ltmain.sh' not found
需要使用 autoreconf
工具,先要安装 sudo apt install -y libtool
,然后运行 autoreconf -i
即可解决。
make uninstall
在编译安装 GCC 时,由于没有配置 --prefix=/opt/gcc-11.4.0
,而导致 gcc
被安装在 /usr/local/bin
下。此时欲运行 make uninstall
移除这种安装,但在 gcc-11.4.0
源码目录下,直接运行 sudo make uninstall
不行。查询发现,应在 gcc-11.4.0/gcc
目录下,才能执行 sudo make uninstall
命令。
Debian(bookworm)网络接口 Bonding
今天(2024-4-22),在将存储中心接入万兆交换机时,要使用两条 40GE 链路端口聚合 bonding,以获取较高速率和可靠性。以下是配置记录。
Linux 主机 /etc/network/interfaces
:
auto ens1f0
iface ens1f0 inet manual
bond-master bond0
bond-mode 802.3ad
auto ens1f1
iface ens1f1 inet manual
bond-master bond0
bond-mode 802.3ad
auto bond0
iface bond0 inet static
address 10.11.1.25
netmask 255.255.255.0
network 10.11.1.0
bond-slaves ens1f0 ens1f1
bond-mode 802.3ad
bond-miimon 100
bond-downdelay 200
bond-updelay 200
bond-lacp-rate 1
bond-xmit-hash-policy layer2+3
交换机上的配置:
interface eth-trunk 11
description To-backup-center
port link-mode access
port default vlan 11
max active-linknumber 2
interface 40GE 0/0/1
eth-trunk 11
interface 40GE 0/0/2
eth-trunk 11
ifup bond0
失败问题解决
root@backup:~# ifup bond0
/etc/network/if-pre-up.d/ifenslave: 39: echo: echo: I/O error
/etc/network/if-pre-up.d/ifenslave: 39: echo: echo: I/O error
RTNETLINK answers: File exists
ifup: failed to bring up bond0
此时需要运行 ip add flush dev bond0
,刷新 bond0
的 IP 地址。随后运行 ifup --force --verbose bond0
可成功将 bond0
开启。与此类似 ifdown --force --verbose bond0
也可以将 bond0
关闭,并以 verbose
模式打印出其间的调试信息。