「Linux」- 修改 DNS 配置

管理 Linux 系统 DNS 设置的方法: 1)NetworkManager 2)systemd-resolved – ArchWiki
常见问题处理
持久化DNS配置(Debian-like OS)
配置文件/etc/resolv.conf在每次重新配置网络后,里面的内容都会被覆盖。尤其是DHCP获取IP地址后,该文件的内容会被覆盖。
如何进行持久化配置呢?使用 resolvconf 软件包。 How to make name server address permanent in /etc/resolv.conf? DNS in Ubuntu 12.04[……]

READ MORE

「Linux」- 修改主机名

问题描述
假如 pc 为原主机名,而我们现在要将 laptop 作为主机名。
该笔记将记录:在 Linux 中,如何修改主机名,以及常见问题处理方法。
解决方案
CentOS 6.10

# 临时修改,重启后会丢失
hostname laptop

# 持久配置
sed ‘s/HOSTNAME=.+/HOSTNAME=laptop/g’ -i /etc/sysconfig/network

# 修改/etc/hosts文件
sed ‘s/ pc / laptop /g’

# 如果你的命令行提示符还显示以前的主机名,重新登录即可。

System V

### #1 执行hostname命令
hostname laptop

### #2 修改/etc/hostname文件,将该文件中的pc修改为laptop。
sed -i ‘s/pc/laptop/g’ ‘/etc/hostname’

### #3 修改/etc/hosts文件,将改文件中的127.0.0.1 pc修改为127.0.0.1 laptop即可。
# 这是一个附加步骤,某些程序需要。
sed -i ‘s/ pc / laptop /g’ /etc/hosts

在其他的Linux发行版中也应该是有效的,毕竟发行版太多了,使用和其机制上也有不同的地方,不敢保证。
# systemd
安装 systemd 的 Debian 版本可以使用 hostnamectl 命令来更新主机名:

# 该命令依赖于 dbus 服务,所以要先确保dbus可以正常工作

# hostnamectl set-hostname laptop

该命令会自动修改主机名,并修改 /etc/hostname 文件,但是该命令不会修改 /etc/hosts 文件,这可能需要手动完成。
注意事项
有的教程中说要执行/etc/init.d/hostname.sh start命令。emmmm….,一言难尽,不同的发行版里的系统初始进程不同,有用systemd进行管理的,有用SysV风格(init)进行管理的。操作上也由出入。因此,是否要执行该命令与你的修改方法以及你所使用的系统版本有关。该hostname.sh脚本的start方法执行的操作如下(来自于Kali Linux Rolling源):

#!/bin/bash

do_start () {
[ -f /etc/hostname ] && HOSTNAME=”$(cat /etc/hostname)”

# Keep current name if /etc/hostname is missing.[……]

READ MORE

「Linux」- 禁用 IPv6 协议栈

问题描述
为什么禁用 IPv6 协议栈?因为很多配套的基础设置还未到位,因此使用 IPv6 会遇到很多问题,比如 a 5-second delay 问题。
该笔记将记录:在 Linux 中,如何禁用 IPv6 协议栈,以及相关问题处理。
解决方案
RHEL/CentOS

# sysctl -w net.ipv6.conf.all.disable_ipv6=1
# sysctl -w net.ipv6.conf.default.disable_ipv6=1

cat > /etc/sysctl.d/99-disable-ipv6.conf <<EOF
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
EOF

sysctl –load /etc/sysctl.d/99-disable-ipv6.conf

Ubuntu 18.04
在 Ubuntu 18.04 中,修改 sysctl 是无效的,因为 Netplan 会为其分配 Link-local 地址。解决方法:
方法一、彻底禁止 IPv6 协议栈

# vim /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT=”ipv6.disable=1″
GRUB_CMDLINE_LINUX=”ipv6.disable=1″

# update-grub

方法二、通过 Netplan 禁止

network:
version: 2
ethernets:
enp0s2:

link-local: []

我们不得不说,“回”字又多了一种写法 :-)
参考文献
Disabling IPv6 in Ubuntu Server 18.04 – Ask Ubuntu Disabling IPv6 on Ubuntu 18.04: The Netplan Version | P. S. Clarke How to disable IPv6 address on Ubuntu 18.04 Bionic Beaver Linux – LinuxConfig.org How to disable IPv6 on Linux How to Disable IPv6 on Ubuntu Linux IPv6 – ArchWiki Link-local address – Wikipedia[……]

READ MORE

「Linux」- 从MAC地址中获取IP地址

方法一、ping & arp
向ping一次目标主机,然后使用arp命令:

#!/bin/sh

ping -c 7 “<ip-address>”
# !!!fping!!!
# 如果有有必要的话,可以使用fping -g “<ip-address>/<prefix>”来探测整个网段
# 仅打印可达主机:fping -g “<ip-address>/<prefix>” 2>/dev/null

arp -an | grep “<ip-address>”

方法二、arping

#!/bin/sh

arping -I <interface> <host>

# !!!「arping」有两个版本:一个是iputils;另一个Thomas Habets开发,功能更多。

方法三、namp
有些主机可能屏蔽了ICPM报文,所以使用ping可能会无效。
可以使用nmap来扫描服务:

#!/bin/sh

nmap -sP -PE -PA21,23,80,3389 192.168.1.*
# -sP 跳过端口扫描
# -PE 使用ICMP echo request行为
# -PA 扫描特定的端口
# 192.168.1.* 网段

参考文献
Resolving MAC Address from IP Address in Linux Arping – To Discover Hosts on a Computer Network Wikipedia/arping fping usage to show only reachble hosts[……]

READ MORE

「Linux」- 添加虚拟网卡

方法一、使用ifconfig命令

# 在eth0网卡上创建一个叫eth0:0的虚拟网卡,虚拟网卡的地址是:192.168.10.10
ifconfig eth0:0 192.168.10.10 up

# 可以使用如下命令删除该网卡
sudo ifconfig eth0:0 down

# 当然,这属于临时配置,重启之后,前面的配置就消失了。如果要持久化配置,需要修改相应的网
# 络配置文件。配置文件的格式与路径因发行版的不同而异。不再展开说明。
# 比如:Debian修改/etc/network/interfaces配置文件。

这种方法有一个问题:网卡的MAC地址是相同的。即,不能为eth0和eth0:0设置不同的MAC地址。
方法二、使用TUN/TAP

# 安装uml-utilities工具
apt-get install uml-utilities

# 创建虚拟网卡 eth2
tunctl -t eth2

# 为虚拟网卡eth2固定一个MAC地址
ifconfig eth2 down
ifconfig eth2 hw ether 00:11:22:33:44:55

# 启用虚拟网卡eth2
ifconfig eth2 up

注意,这种虚拟网卡是不能绑定物理网卡的(也就是说不能通过该网卡访问外部网络),是在隧道技术中使用的虚拟网卡。以下的一段话引用子stackoverflow的“which physical interface tun/tap device attached to”问题,该问题解释了原因:

There is no inherent relation.

It is important to understand that neither TUN/TAP nor any other device does routing. Internet Protocol (IP) routing is handled by the IP stack, and it can’t really tell the difference between a TAP interface and a real Ethernet interface. Packets received by the IP stack from TUN/TAP interfaces are generated by a program on that same machine, and when the IP stack routes packets out a TUN or TAP interface they are received only by the software[……]

READ MORE

「interfaces-old」

/etc/network/interfaces : ifup(man 8) 和 ifdown(man 8) 命令所使用的配置文件;
注释

`#’ 来注释行;不支持行尾注释,注释必须独占一行;
`\’ 用在行尾表示换行;

文件组成

文件由组成”iface”, “mapping”, “auto”, “allow-“, “source” and “source-directory” 关键字开始的小节组成。例如:

auto eth0
allow-hotplug eth1

source interfaces.d/machine-dependent

source-directory interfaces.d

iface eth0 inet dhcp

iface eth0 inet6 auto

mapping eth1

script /usr/local/sbin/map-scheme
map HOME eth0-home
map WORK eth0-work

iface eth1-home inet static

address 192.168.1.2/24
gateway 192.168.1.1
up flush-mail

iface eth1-work inet dhcp

auto

以 “auto” 开始的行,表示网卡会在执行 ifup -a 时启动。(系统启动脚本中使用了这个选项。)
网卡名要跟在 “auto” 后面。可以有多个 “auto” 部分。按照顺序,依次启动网卡。

allow-

以 “allow-” 开始的行,表示网卡会被各个子系统启动。This may be done using a command such as “ifup –allow=hotplug eth0 eth1”, which
will only bring up eth0 or eth1 if it is listed in an “allow-hotplug” line. Note that “allow-auto” 与 “auto” 同义.

no-auto-down

以 “no-auto-down” 开始的行,表示这些网口在执行 ifdown -a 时不关闭。[……]

READ MORE

「APK」- 常用设置(Alpine Linux)

该笔记将记录:在 Alpine Linux 中,APK 包管理器的常用设置及使用方法。
修改软件源(用于 Docker Image 构建)
Alpine Linux 源使用帮助

sed -i ‘s%dl-cdn.alpinelinux.org%mirrors.ustc.edu.cn%g’ ‘/etc/apk/repositories'[……]

READ MORE

「Pkg-config」

Pkg-config,软件包包含了一个工具,用于:在configure和make执行期间,向构建工具传递include或lib的路径。
pkg-config是在编译应用程序和库时使用的辅助工具。它可以帮助你在命令行中插入正确的编译选项,减少硬编码。比如:

可以使用gcc -o test test.c `pkg-config –libs –cflags glib-2.0`,而不是通过硬编码的方式找到glib(或其他库)。

这是语言无关的,所以它可以用于定义文档工具的位置。
从发行版的源中安装

# Kali GNU/Linux Rolling
apt-get install pkg-config

使用源码编译安装
参考:LFS/Pkg-config-0.29.1:http://www.linuxfromscratch.org/lfs/view/7.10/chapter06/pkg-config.html
安装的可执行程序
pkg-config,输出指定的库或者包的元数据信息。
参考文献
LFS / Pkg-config-0.29.1 Homepage: http://pkg-config.freedesktop.org[……]

READ MORE

「RPM, YUM and DNF」

YUM – Yellowdog Updater, Modified
RPM – RPM Package Manager
rpm,软件包管理系统
相关链接
Create Local Repos
参考文献
Wikipedia/RPM Package Manager[……]

READ MORE

「YUM」- 使用代理服务(“提高下载速度”)

问题描述
1)由于网络原因,官方仓库下载比较慢。即使可以使用国内镜像站点, 2)仍旧存在部分第三方仓库没有国内镜像站点
解决办法
可以配置 YUM 使用代理服务(HTTP、HTTPS、SOCKS5)。
注意事项,不同版本的 YUM 对代理协议的支持情况不同,下面将分别讨论。
CentOS 6.5 and YUM 3.2.29
方法一、使用 SOCKS 协议
该版本不支持 SOCKS 协议,只支持 http https ftp 协议:

Options Error: Error parsing “proxy = ‘socks5://<ip>:<port>'”: URL must be http, ftp or https not “socks5″

方法二、使用 HTTP(S) 协议
该协议无法通过命令行指定,即 HTTP_PROXY=’http://<ip>:<port>’ yum makecache 是无效的。
但是可以通过修改 /etc/yum.conf 配置文件,添加如下行:

# 必须使用完整地址,包含端口号
proxy=http://ip:port
# 指定用户名密码
proxy_username=your username
proxy_password=your password

CentOS 7.4 and YUM 3.4.3
该版本可以使用 SOCKS/HTTP(S) 协议
方法一、通过命令行指定

ALL_PROXY=”socks5://<ip>:<port>” yum makecache

方法二、通过配置文件
也可以修改 /etc/yum.conf 配置文件,添加如下行:

# 必须使用完整地址,包含端口号
proxy=socks5://ip:port
# 指定用户名密码
proxy_username=your username
proxy_password=your password

参考文献
How to use SOCKS proxy with yum? 10. Using yum with a Proxy Server[……]

READ MORE

「YUM」- 限制YUM更新软件包

问题描述
在执行 yum install 或 yum upgrade 时,某些相关软件包会被更新,但有时我们并不希望这种事情发生。
该笔记将记录:如何“锁定”软件包,防止被意外更新。
解决办法
第一步、安装扩展

yum install yum-plugin-versionlock

第二步、锁定软件

yum versionlock gcc-*

或者,直接修改 /etc/yum/pluginconf.d/versionlock.list 配置文件。
常用其他操作
查看被锁定的软件包:

yum versionlock list

清除被锁定的软件包:

yum versionlock clear

参考文献
How to restrict yum to install or upgrade a package to a fixed specific package version? YUM-VERSIONLOCK(1)[……]

READ MORE

「YUM」- 禁用 mirrorlist、metalink 检查

问题描述
当我们使用 YUM 安装应用时,它会检查 mirrorlist、metalink 配置,以获取速度最快的第三方镜像站点。
但是,第三方镜像站点并不总是可靠,有时会返回各种错误,比如下面这些错误:
在 CentOS release 6.5 (Final) 中,安装 epel-release 仓库后,执行 yum makecache 命令会产生如下错误:

Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

在 CentOS Linux release 7.4 上,执行命令 yum install transmission-cli 产生如下错误:


https://mirrors.sonic.net/epel/7/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel
https://dfw.mirror.rackspace.com/epel/7/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel
https://d2lzkl7pfhq30w.cloudfront.net/pub/epel/7/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel
https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel

在 CentOS Linux release 7.5 上,执行命令 yum install sysstat 产生如下错误:


http://mirrors.neusoft.edu.cn/centos/7.5.1804/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 – Not Found
Trying other mirror.
http://mirrors.zju.edu.cn/centos/7.5.1804/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error[……]

READ MORE

「YUM」- 配置YUM源

添加YUM源
有两种方法添加YUM源:

方法一、向/etc/yum.repos.d/中手动添加配置文件;
方法二、使用yum-config-manager命令管理;

推荐使用「方法二」,即使用yum-config-manager命令。「方法一」修改配置文件容易出错,有时还无法保证规范。
方法一、手动添加YUM源
在/etc/yum.repos.d/中手动添加.repo配置文件,例如example.repo:

[repository]
name = repository_name
baseurl = http://path/to/repo
enabled = 1
gpgcheck = 0

有关更多的配置选项可以参考man 5 yum.conf手册。
方法二、使用yum-config-manager命令管理

#!/bin/bash

# 添加一个YUM源
yum-config-manager –add-repo ‘<repository_url>’

# 启用一个YUM源
yum-config-manager –enable ‘<repository_url>’

# 或者启动多个YUM源
yum-config-manager –enable glob_expression

# 当然,禁用就是–disable选项
yum-config-manager –disable glob_expression

参考文献
8.4.5. Adding, Enabling, and Disabling a Yum Repository[……]

READ MORE

「CentOS」- 重新构建RPM源码包

在CentOS官方仓库中,即提供了二进制包,又提供了二进制的源码包。比如bind-9.9.4-74.el7_6.1.src.rpm与bind-9.9.4-74.el7_6.1.rpm这两个软件包。我们平时安装的是bind-9.9.4-74.el7_6.1.rpm,而bind-9.9.4-74.el7_6.1.src.rpm是生成bind-9.9.4-74.el7_6.1.rpm的材料。
我们所说的“重新构建RPM源码包”,就是使用.src.rpm生成.rpm的过程。在这个过程中,我们可以修改.src.rpm生成我们想要的.rpm包。
为什么要重新构建?
重新构建的原因有以下几个:

安装CentOS仓库中不可用的包,或者安装一个在CentOS中不可用的包。

如果包在CentOS中不可用,那你也应该尝试构建一个RPM包。因为包管理器带来的好处将抵消你构建包的工作。相比源码安装,使用包管理由很多的好处。

仓库中的包不满足需求。比如没有某些编译选项,而缺少某些功能。

是否需要重新构建?
官方的包提供了相关的邮件列表,问题追踪,安全更新等等。在重新构建前,应该先考虑是否有已经存在的软件包。
一旦构建了软件包,还有管理后期的安全更新等等相关的问题。
# 获取源码包
不是每个源码包那到系统中就可以成功构建。源码在所属的发行版上是一定可以构建成功的。但是如果版本相差太远,或者衍生版的差异太大,又或者其他的种种因素,都有可能导致构建的失败。
当你构建一个源码包时,如果需要升级系统的核心包,那你最好是找一个旧的源码包。而且不要用重新构建的方式升级核心包。因为这些操作可能会破坏系统。
方法一:到仓库中下载
如果修复修复了问题,但是CentOS中还没有修复,可以到上游下载源码包:http://ftp.redhat.com/pub/redhat/linux/enterprise/
在CentOS中使用的源码包:http://vault.centos.org/
使用wget或者浏览器等工具进行下载即可。尽量不要让在RPM构建树目录中,因为构建生成的新文件可能会覆盖你下载的包。
方法二:使用yumdownloader命令
安装yumdownloader命令:yum install -y yum-utils
下载源码包:yumdownloader –source “bind”
# 附加说明
!!!构建成功的包不保证可以在任何其他的发行版中运行成功。也不要把其他发行版中构建包安装到不同的发行版中,这些操作都由可能破坏系统。
# 准备构建环境
有关RPM构建环境的搭建[……]

READ MORE

「CentOS」- 设置RPM构建环境

搭建一个RPM构建环境。
!!!不要使用ROOT用户进行RPM包的构建。应该始终使用非ROOT用户进行构建。
# 安装rpmbuild命令
首先需要安装rpmbuild命令。使用该命令,可以:

使用specfile文件来构建RPM包
使用SRPM包构建RPM包。

执行yum install rpm-build进行安装。
使用rpmbuild –showrc命令来验证安装。
大多数的SRPM构建时还需要某些特定的宏,这些宏包含在redhat-rpm-config中:yum install redhat-rpm-config
# 创建相关的构建目录
创建用于构建的文件和目录。应该始终使用非ROOT用户进行构建。
创建RPM构建目录:mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
如果想使用其他目录,则执行echo ‘%_topdir %(echo $HOME)/rpmbuild’ > ~/.rpmmacros命令,然后将目录创建在指定的目录下。有关rpmbuild的更多行为控制,参考rpmmacros配置手册。
!!!即使不创建也可以,这些目录会在构建时自动创建。
# 安装其他构建工具
使用rpmbuild进行构建的本质还是源码包的编译,一次可能会需要安装gcc和make等工具。
参考文献
Set Up an RPM Build Environment under CentOS[……]

READ MORE

「CentOS」- 使用源码包开始安装

# 构建源码包 rpmbuild –rebuild “bind-9.9.4-74.el7_6.1.src.rpm”
# 构建结果位于~/rpmbuild/RPMS中,安装 rpm -i -v –force ~/rpmbuild/RPMS/x86_64/bind-9.9.4-74.el7.1.x86_64.rpm \

~/rpmbuild/RPMS/noarch/bind-license-9.9.4-74.el7.1.noarch.rpm \
~/rpmbuild/RPMS/x86_64/bind-libs-9.9.4-74.el7.1.x86_64.rpm

错误列表
# 构建BIND时产生的一个错误
# rpm -iv –force ~/rpmbuild/RPMS/x86_64/bind-9.9.4-74.el7.1.x86_64.rpm ~/rpmbuild/RPMS/noarch/bind-license-9.9.4-74.el7.1.noarch.rpm ~/rpmbuild/RPMS/x86_64/bind-libs-9.9.4-74.el7.1.x86_64.rpm Preparing packages… bind-license-32:9.9.4-74.el7.1.noarch bind-libs-32:9.9.4-74.el7.1.x86_64 bind-32:9.9.4-74.el7.1.x86_64 OSError: No such file or directory ValueError: SELinux policy is not managed or store cannot be accessed. warning: %posttrans(bind-32:9.9.4-74.el7.1.x86_64) scriptlet failed, exit status 1
解决办法: 未解决……
参考文献
yum Download All Source Packages (SRPM) From RedHat / CentOS WebSite Linux : How to install source rpm on RHEL/CentOS How to reinstall rpm package?[……]

READ MORE

「Kubernetes」- Setup Yum Mirror

创建仓库

#!/bin/sh

################################################################################
# 1. 环境准备:安装相关的工具
################################################################################
# needed if you have a stale base image.
yum update

# install packages needed to run a yum mirror.
yum install -y epel-release
yum install -y nginx createrepo yum-utils wget

################################################################################
# 2. 配置仓库:配置被镜像的仓库
################################################################################
# create the repo file for kubernetes.
vi /etc/yum.repos.d/kubernetes.repo
# [kubernetes]
# name=Kubernetes
# baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
# enabled=1
# gpgcheck=1
# repo_gpgcheck=1
# gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
# https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

################################################################################
# 3. 同步仓库:开始从仓库下载软件包,并初始化
################################################################################
reposync -p /usr/share/nginx/html/repo -r kubernetes -l
cp -v /usr/share/nginx/html/pool/*[……]

READ MORE

「YUM」- 安装并使用第三方仓库

问题描述
在系统维护过程中,能用YUM安装绝不使用源码安装。所以,经常需要查找壹些第三方,已查找某些软件包。
本文列举最常用第三方源,通常在涉及某些软件安装时,那些文章会指向该文章。
EPEL – Extra Packages for Enterprise Linux
这是最常见的源,安装也比较简单:

#!/bin/sh

yum install epel-release

REMI Repository
在安装各版本PHP环境时,会使用该源:

#!/bin/sh

# CentOS/RHEL 7
yum install epel-release
wget https://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7.rpm

# CentOS/RHEL 6
yum install epel-release
wget https://rpms.remirepo.net/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6.rpm

SCL – Software Collections Repository
-「3 Methods To Install Latest Python3 Package On CentOS 6 System」 The SCL repository is now maintained by a CentOS SIG, which rebuilds the Red Hat Software Collections and also provides some additional packages of their own.
It contains newer versions of various programs that can be installed alongside existing older packages and invoked by using the scl command.
Run the following command to install Software Collections Repository on CentOS

#!/bin/sh

yum install centos-release-scl

End Point Package Repository
-「End Point Package Repository」
For RHEL/CentOS 7

#!/bin/sh

# verify an[……]

READ MORE

「YUM」- 杂记

常用的YUM命令

#!/bin/sh

# 更新缓存,更新本地的YUM缓存:
yum clean all

# 搜索命令,当命令未找到时,查看它所属的软件包:
yum provides $(which yum)

# 检查系统是否存在需要更新的软件:
yum check-update

# 列出所有的可用的安全更新:
yum updateinfo list security all

# 安装指定版本的包:
yum install “<package name>-<version info>”

# 软件包降级
yum downgrade “<package name>-<version info>”

显示软件包所属仓库
How to know from which yum repository a package has been installed?

#!/bin/sh

yum install -y yum-utils
repoquery -i “your-package-name”

查看包中文件

# https://www.cyberciti.biz/faq/rhel-centos-fedora-list-contents-of-package-using-yum-command/
yum install -y yum-utils
repoquery –list “bash”
repoquery -q -l “yum-utils”

# https://www.tecmint.com/list-files-installed-from-rpm-deb-package-in-linux/
rpm -qlp “<pkg name>.rpm”

参考文献
Is it possible to limit yum so that it lists or installs only security updates? How can I instruct yum to install a specific version of package X? How to use yum to downgrade or rollback some package updates?[……]

READ MORE

「RPM, YUM and DNF」- 常见错误

rpmdb: unable to join the environment
rpmdb: unable to join the environment
问题描述
当执行yum或者rpm命令是,产生如下错误:

rpmdb: unable to join the environment
error: db3 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages index using db3 – Resource temporarily unavailable (11)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:

Error: rpmdb open failed

解决办法

#!/bin/sh

rm -rf /var/lib/rpm/__db*
rpm –rebuilddb[……]

READ MORE

「Snappy」- 应用管理系统、新的包管理器

Snappy – Snap, Snap Store, Snapcraft, Snapd
terminology – What do snap, snapd and Snappy refer to? – Ask Ubuntu
Snappy 是由 Canonical 为 Ubuntu 手机操作系统设计和建造的软件部署和包管理系统,该系统设计用于电话、云、物联网、桌面计算。类似于 APT、YUM、DNF 等等包管理器,但是采用不同的机制。
在 Snappy 中,具有以下几个概念(术语):

Snap:特有的打包格式(应用格式),作为 SquashFS 镜像,包含单个遵循特定格式的 meta/snap.yaml 文件。

Snap Store:应用商店、中心仓库,用于存储 snap 应用;

Snapcraft:命令行工具,用于创建 snap 应用,并上传到 Snap Store 中;

Snapd:运行 snap 应用的守护进程。我们使用 snap 命令与 snapd 服务交互,由 snapd 服务完成应用的安装、运行、卸载等等操作;

被称为“snap”的软件包以及使用它们的工具“snapd”,运行在各种 Linux 发行版中,因此可以实现在不可知发行版的上游软件部署。
项目地址
Github/snapcore/snapd snapcraft – The app store for Linux
注意事项
这条是写给我们自己的:当应用难以安装时,我们才会使用 snap 进行安装。
参考文献
Wikipedia/Snap (package manager) Wikipedia/Snappy snapd项目主页:https://github.com/snapcore/snapd A ‘snap’ is a universal Linux package: https://www.ubuntu.com/desktop/snappy Ubuntu 推出的Snap应用架构有什么深远意义?: https://www.zhihu.com/question/47514122 Ubuntu 16.04 LTS如何使用Snap软件包: http://www.linuxidc.com/Linux/2016-04/130679.htm 将 Linux 软件打包成 Snap 软件包:https://linux.cn/article-7441-1.html[……]

READ MORE

「snap」- 配置使用网络加速服务

问题描述
鉴于国内与国外的网络原因,经常出现下载缓慢或其他网络问题,因此需要使用网络加速服务(HTTP(s)、SOCKS)来解决。
该笔记将记录:在 Snappy 中,如何配置使用网络加速服务,以及常见问题处理。
解决方法

# snap version
snap 2.45.2
snapd 2.45.2
series 16
ubuntu 20.04
kernel 5.4.0-42-generic

# snap set system proxy.http=”http://<proxy_addr>:<proxy_port>”
# snap set system proxy.https=”http://<proxy_addr>:<proxy_port>”

// 如下示例,使用本地的 HTTP 代理服务

# snap set system proxy.http=”http://127.0.0.1:8123″
# snap set system proxy.https=”http://127.0.0.1:8123″

或者,配置 /etc/environment 文件,然后重启 snapd 服务(这里不再赘述)。
注意事项
Snappy 属于 Client/Server 架构,因此直接在命令行设置 HTTP_PROXY 与 HTTPS_PROXY 环境变量是无效的。
参考文献
How to install snap packages behind web proxy on Ubuntu 16.04 – Ask Ubuntu Installation | Snap Store Proxy documentation[……]

READ MORE

「snap」- 常见错误汇总

章节列表
「snap」- ERR – Waiting for automatic snapd restart 「snap」- dropping privs did not work: No data available 「snap」- error: snap “xxx” has “install-snap” change in progress[……]

READ MORE

「snap」- ERR – Waiting for automatic snapd restart

问题描述
使用 snap 安装 chromium 浏览器时出现如下错误,并一直卡住:


2020-08-21T16:56:10Z INFO Waiting for automatic snapd restart…

问题原因
这个问题的原因可能有很多,我们则是网络原因导致无法继续执行。
解决方法
通过配置代理解决该问题,代理配置方法参考 笔记。
参考文献
Bug #1892551 “snapcraft fails to run if it is installed as a try…” : Bugs : Snapcraft[……]

READ MORE

「snap」- error: snap “xxx” has “install-snap” change in progress

问题描述
执行 snap install chromium 命令,产生如下错误:

error: snap “chromium” has “install-snap” change in progress

问题原因
由于网络原因,安装 chromium 处于卡住状态,所以已经存在安装任务。当再次执行该应用的安装,将产生上述错误。
使用 snap changes 查看当前正在进行的变更:

# snap changes
ID Status Spawn Ready Summary
9 Doing 7 days ago, at 20:45 CST – Auto-refresh snap “snapd”
10 Doing yesterday at 21:21 CST – Install “chromium” snap
11 Done today at 16:56 CST today at 16:56 CST Change configuration of “core” snap
12 Done today at 16:57 CST today at 16:57 CST Change configuration of “core” snap

解决办法
如果停止当前安装或者重新开始,可以执行如下命令:

# snap abort “10”

// 其中参数 10 为 snap changes 输出的 ID 列

参考文献
Unable to install “package-name”: snap “package-name” has “install-snap” change in progress | by chirag patel | Medium[……]

READ MORE

「Linux」- 权限管理

概念术语
Unix File and Directory Permissions and Modes
TODO ! Linux 文件系统权限深入学习;
管理准则
回收 ROOT 权限的原因有: 1)防止误操作的破化:通过限制权限,以避免对系统造成的不可挽回的破坏; 2)限制对系统的读写:将用户操作限定在特定目录中,方便日后维护管理;
常见问题处理
删除文件所需要的权限
What permissions are needed to delete a file in unix? – Stack Overflow
在其他用户删除文件时,该用户不需要具有该文件的任何权限,而是需要该文件所在目录的写入与执行权限。
当整个操作系统文件权限被意外修改,如何进行恢复?
rsync – Sync file permissions *only* – Stack Overflow
找台正常的主机,然后将被破坏主机的磁盘挂载到正常主机上,进行权限恢复:

# find . ! -type l -exec chown -v –reference='{}’ /mountpoint/'{}’ \;
# find . ! -type l -exec chmod -v –reference='{}’ /mountpoint/'{}’ \;[……]

READ MORE

「Linux」- 休眠(Hibernation)

计算中的「休眠」(或挂起到磁盘)指的是“关闭计算机,同时保持其状态”。休眠时,计算机将RAM的内容保存到非易失性存储设备中。恢复后,计算机与进入休眠状态之前完全一样。
休眠的不同实现
以下三者都称之为“休眠到硬盘”(suspend-to-disk)。
swsusp – Software Suspend
在Linux内核中,休眠由swsusp实现,它内置于2.6系列中。
TuxOnIce – Suspend2
另一种实现是TuxOnIce,它可以作为3.4版本内核的补丁。TuxOnIce提供诸如支持对称多处理和抢占的优点。
uswsusp – userspace software suspend
另一个替代实现是uswsusp。
测试系统是否支持休眠
安装pm-utils软件包,因为要用到其中的pm-is-supported命令:

#!/bin/sh
pm-is-supported –hibernate
echo $?

如果状态值为“0”,则表示支持休眠。
休眠时RAM保存的位置
系统休眠(systemctl hibernate)时,”计算机将RAM的内容保存到非易失性存储设备中”,“非易失性存储设备”通常是SWAP分区。
为什么说是SWAP分区? 因为在执行systemctl hibernate进行休眠时,我遇到了一个错误“Failed to hibernate system via logind: Not enough swap space for hibernation”错误提示…………调整了SWAP分区的大小后,系统可以进行正常休眠动作。
当笔记本关闭盖子时,自动休眠
如果你使用的是systemd服务,那可以修改/etc/systemd/logind.conf文件,在[Login]部分添加如下行:

HandleLidSwitch=hibernate
HandleLidSwitchExternalPower=hibernate
HandleLidSwitchDocked=hibernate

然后,重启 systemctl restart systemd-logind.service 服务。注意事项,这会退出所有已登录会话。
参数的含义如下: 1)HandleLidSwitch – 当盖子关闭时触发,下面的两种情况除外。 2)HandleLidSwitchExternalPower – 如果系统连接到外部电源,则在盖子关闭时触发。 3)HandleLidSwitchDocked – 如果系统插入扩展坞,或者连接了多个显示器,则在盖子关闭时触发。
可以根据自己的需要设置不同的值,取值有:igno[……]

READ MORE

「Linux」- 系统安全

AppArmor
SELinux

章节列表
「SELinux – Security Enhanced Linux」 「apparmor」- 安装[……]

READ MORE

「apparmor」- 安装

通过仓库安装

# 安装apparmor
# AppArmor的用户空间的解析器。
# 提供了使用AppArmor强制访问控制系统所需的系统初始化脚本,包括AppArmor解析器,将AppArmor「文本配置文件」转换为加载到内核中的「机器可读策略」,以便与AppArmor Linux安全模块使用。
apt-get install apparmor

包含的命令
apparmor_parser
aa-enabled
aa-exec
aa-remove-unknown
aa-status
apparmor_status
相关链接
Ubuntu Linux: 禁用针对特定配置文件/服务( 如Mysqld服务器)的Apparmor: https://www.helplib.com/article_177 Linux 学习笔记—SELinux与AppArmor: http://blog.csdn.net/ggf123456789/article/details/36686929 如何在Ubuntu上禁用一个特定的AppArmor配置文件: https://www.helplib.com/article_176
参考文献
apt-file list apparmor Homepage: http://apparmor.net Wikipedia / AppArmor: https://en.wikipedia.org/wiki/AppArmor The Debian Administrator’s Handbook[……]

READ MORE

「SELinux – Security Enhanced Linux」

查看状态(查)
方法一、使用 sestatus 命令

#!/bin/sh

sestatus -v

# 如果输出为:
# SELinux status: disabled
# 则表示已经禁用。

方法二、使用 getenforce 命令

#!/bin/sh

getenforce

# 如果已经禁用,会输出:
# Disabled

禁用 SELinux(无需重启)
How to disable SELinux without restart?
我们需要禁用 SELinux 模块,但是暂时不能重启服务器。
解决办法
在 SELinux 中,有三种模式(enforcing、permissive、disabled): 1)enforcing:强制执行 SELinux 安全策略; 2)permissive:打印警告,但是不强制执行策略; 3)disabled:不加载任何 SELinux 策略;
如上所述,设置 SELinux 为 Permissive 模式即可:

setenforce 0

修改 /etc/selinux/config 文件,将 SELINUX=enforcing 改为 SELINUX=disabled,保存并退出。[……]

READ MORE