进阶
Linux系统博大精深,学习Linux的资料浩瀚如大海。本文档不打算再做重复造轮子的事情,我们尽量根据实践中很常见的技术要点进行讲解,同时列出一些操作范例:
核心要点
启动过程分析
Linux系统的启动过程分为如下几个阶段:
-
开机自检:打开电源,BIOS进行硬件自检
-
引导加载:自检通过后,进入MBR引导加载程序(MBR是硬盘中第一个扇区的前512个字节, 称为 main boot record)
-
内核初始化:加载内核(Kernel)代码,即读入 /boot 目录下的内核文件,监测设备并加载设备驱动程序
-
Systemd初始化(替代init),获取系统控制权
- 执行Systemd程序,Systemd是一个管理进程的进程程序,也是操作系统的第一个进程,其PID=1
- 读取 /etc/systemd 下的配置文件
- 读取 /etc/systemd/system/default.target 下的运行级别文件
- 执行 /etc/rc.d/rc.local 文件中的程序
2-4 是由GRUB(Grand Unified Bootloader)负责的。其中GRUB boot loader 代码的一小部分(子集)被写入MBR,其余部分存储在/boot分区中
-
Systemd 执行系统初始化
- 设置主机名
- 初始化网络
- 基于配置初始化 SElinux
- 显示欢迎标语
- 基于内核参数初始化硬件
- 加载文件系统
- 清除 /var 中的目 录
- 启动交换分区
-
建立终端:系统打开6个终端,以便用户登录系统。
-
用户登录系统:用户登录使用Linux
文件目录结构
通过下面的一张图(右键在新窗口中打开,图片效果更好),我们了解Linux系统的目录结构
编码与字体
一个字符(不管是中文还是英文,或是其它文字)在计算机里都是以0101这样数字存放的,编码就是某个字符是以一个什么数字存放在计算机里的。
字符编码有名为字符集。其原理一句话解释:不同语言对应的机器编码。目前最常用的是UTF-8编码方式,下面就是通一个字符在不同字符编码下的机器代码:
语言 | 示例 | UTF-8编码 |
---|---|---|
中文 | 你好 | \xE4\xBD\xA0\xE5\xA5\xBD |
英文 | Hello | \x68\x65\x6C\x6C\x6F |
编码决定字符的存放,字体决定字符的显示。
字体决定一个字符在界面上显示出来的形状,比如同样是'A'用不同的字体显示出来的形状是不一样的。
同样的文件内容,在屏幕上的输出同时取决于用什么编码和字体。
查看编码
我们在Linux中输入 locale
命令,会得到如下的结果:
[root@test ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
en_US.UTF-8 是 UTF-8 的子集,也就是说en_US.UTF-8也是支持中文字符的。区别在于zh_US.UTF-8能够支持更多的汉语特殊字符。
修改编码
如果想切换操作系统的默认显示的语言,就必须修改默认的编码。
登录 Zabbix 所在的服务器,运行下面的命令之一
##方案一
locale-gen zh_CN.UTF-8
##方案二
dpkg-reconfigure locales
如果运行方案二,请参考下图选择 zh_CN.UTF-8 UTF-8 编码规则(键盘空格键选定,Tab键切换位置)
字体管理
我们在实际操作中发现即使当前是en_US.UTF-8编码,如果安装下面的命令后,操作系统便可以正常显示中文。
yum groupinstall "fonts"
这是为什么呢? 这个要从计算图形学的角度去分析。编码解决了字符是否可以被计算的问题,而字体解决的是字符渲染成图像,被人识别的问题。
即,如果你希望可以显示中文,你的服务器就必须有中文字体。
最后我们来总结:字符编码就是把二进制字节码文件转成计算机能够懂的文字;字体就是把计算机中的文字转换成人能够看懂的图像
磁盘管理
存储类型
Linux 支持多种接口类型的存储设备:
- hd:IDE 设备,实际名称为 hda, hdb,即第一个 IDE 设备,第二个 IDE设备,以此类推
- sd:SATA, USB, SCSI 设备,实际名称为 sda, sdb,同上
每个设备又可以被分区,例如第一个 IDE 设备的第一个分区,就被命名为 hda1,以此类推...
以上就是关于设备、分区在 Linux 系 统中的命名。
命令 lsblk
可以非常清晰的展示上面描述的信息和规则
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 251:0 0 40G 0 disk
├─vda1 251:1 0 800M 0 part /boot
├─vda2 251:2 0 28.7G 0 part
│ ├─rootvg-rootlv 252:0 0 18.7G 0 lvm /
│ └─rootvg-crashlv 252:1 0 10G 0 lvm /var/crash
├─vda14 251:14 0 4M 0 part
└─vda15 251:15 0 495M 0 part /boot/efi
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 40G 0 disk
└─vda1 253:1 0 40G 0 part /
TYPE 项中的:disk 表示磁盘, part 表示分区, lvm
分区
磁盘分区可用区域,例如将一块SSD磁盘划分:sda1、sda2、sda3、sda4等4个分区。
分区类型
在Linux系统下,磁盘的分区大致可以分为三类,分别为主分区、扩展分区和逻辑分区。
传统的 MBR 分区方式一块硬盘最多只能有四个主分区,需要更多分区,就必须引入扩展分区的概念。
弥补 MBR 分区形式的局限性,又诞生了一种逐渐取而代之的格式 GPT
下面这张图就非常清晰的说明了这三种分区之间的关系:
#查看磁盘分区
$ fdisk -l
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c5246
Device Boot Start End Blocks Id System
/dev/vda4 2048 83886079 41942016 5 Extended
其中:Disk label type: dos 表示 MBR 分区,相对应 Disklabel type: gpt 就表示 GPT 分区类型。
分区扩容
实践中,我们要对云服务器的系统盘进行扩容,除了先通过云控制台购买更大的磁盘空间之外,还需要进行如下的操作:
-
规划好新增的磁盘应该对应的分区,假设为 /dev/vda1 分区
-
对分区进行扩容操作
#1 安装分区扩容软件 growpart
yum install -y cloud-utils-growpart
#2 分区扩容操作
growpart /dev/vda 1
#3 增大或收缩 ext2/ext3/ext4 文件系统
resize2fs /dev/vda1
LVM
LVM 是一个新的磁盘虚拟化管理技术,将多个真实的物理分区虚拟为一个逻辑上物理分区,以便更多的对磁盘进行伸缩和备份。
下面直接列出 LVM 常见的用法:
#1 显示 LV 分区
$ lvdisplay
--- Logical volume ---
LV Path /dev/rootvg/crashlv
LV Name crashlv
VG Name rootvg
LV UUID 2MectT-GQ0J-FkVJ-Phue-7X0S-lH0U-2iJclg
LV Write Access read/write
LV Creation host, time localhost, 2021-10-13 16:53:19 +0000
LV Status available
# open 1
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 252:1
--- Logical volume ---
LV Path /dev/rootvg/rootlv
LV Name rootlv
VG Name rootvg
LV UUID bdLRb7-a1WN-DKRR-XNpX-sE5B-1IsA-XtsDfq
LV Write Access read/write
LV Creation host, time localhost, 2021-10-13 16:53:19 +0000
LV Status available
# open 1
LV Size <18.73 GiB
Current LE 4794
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 252:0
#2 扩容 PV
lv
pvresize
实战案例学习:《阿里云系统盘LVM扩容》。
下面是对案例的简述:
-
云控制台通过购买,新增20G系统盘空间
-
对根目录所在分区进行扩容操作
#1 安装分区扩容软件 growpart
yum install -y cloud-utils-growpart
#2 分区扩容操作
growpart /dev/vda 2
#3 增大或收缩 ext2/ext3/ext4 文件系统
resize2fs /dev/vda2 -
运行
lvdisplay
查看是否存在 LVM 的分区--- Logical volume ---
LV Path /dev/rootvg/crashlv
LV Name crashlv
VG Name rootvg
LV UUID 2MectT-GQ0J-FkVJ-Phue-7X0S-lH0U-2iJclg
LV Write Access read/write
LV Creation host, time localhost, 2021-10-13 16:53:19 +0000
LV Status available
# open 1
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 252:1 -
先扩容 PV
pvdisplay
pvresize <pvname>
pvs -
扩容 LV (最终所需的分区)
lvextend -l +100%FREE <LV's Path>
lvdisplay
lvs -
修正文件系统
# ext4 文件系统
resize2fs <LV's Path>
# xfs文件系统
xfs_growfs <LV's Path>
格式化
格式化指将磁盘分区格式化成不同的文件系统,以方便操作系统集中组织和管理文件。
#将/dev下的 sda5 磁盘格式化为 ext2 的格式类型
mkfs.ext2 /dev/sda5
挂载
对于Linux系统来说,挂载是将格式化后的 分区与系统中的目录匹配起来,使得访问这个目录就相当于访问这个分区。
#将 /dev/sda5 挂载到 test 中
mount /dev/sda5/test
文件系统
Linux除支持Ext4文件系统外,还支持其他各种不同的文件系统,例如集群文件系统以及加密文件系统等。Linux将各种不同文件系统的操作和管理纳入到一个统一的框架中,使得用户程序可以通过同一个文件系统界面,也就是同一组系统调用,能够对各种不同的文件系统以及文件进行操作。这样,用户程序就可以不关心各种不同文件系统的实现细节,而使用系统提供的统一、抽象、虚拟的文件系统界面。这种统一的框架就是所谓的虚拟文件系统转换(Virtual Filesystem Switch),一般简称虚拟文件系统 (VFS)。虚拟文件系统描述如下所示:
Linux系统核心可以支持十多种文件系统类型,比如Btrfs、JFS、ReiserFS、ext、ext2、ext3、ext4、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。
#将系统内所有的文件系统列出来
df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
udev devtmpfs 4047124 0 4047124 0% /dev
tmpfs tmpfs 815312 8252 807060 2% /run
/dev/vda1 ext4 61795304 49591808 9461040 84% /
tmpfs tmpfs 4076556 0 4076556 0% /dev/shm
tmpfs tmpfs 5120 0 5120 0% /run/lock
tmpfs tmpfs 4076556 0 4076556 0% /sys/fs/cgroup
#将系统内的所有特殊文件格式及名称都列出来
df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/hdc2 ext3 9920624 3823112 5585444 41% /
proc proc 0 0 0 - /proc
sysfs sysfs 0 0 0 - /sys
devpts devpts 0 0 0 - /dev/pts
/dev/hdc3 ext3 4956316 141376 4559108 4% /home
/dev/hdc1 ext3 101086 11126 84741 12% /boot
tmpfs tmpfs 371332 0 371332 0% /dev/shm
none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs
用户管理
Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
账号
任何一个要使用系统的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
对于Linux系统来说,名称为root的用户具有最高权限,且权威建议我们应该少用root用户。
用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。实现用户账号的管理,要完成的工作主要有如下几个方面:
- 用户账号的添加、删除与修改。
- 用户口令的管理。
- 用户组的管理。
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
用户组的 管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。
权限
划分用户最主要的目录就是为了分配权限,让具有不同权限的用户做不同的事情。
运行 ls -l
命令,可以查询文件的权限分配情况:
密码与秘钥对
密码是用户登录Linux系统的凭证,一个用户名对应有配套的密码,这个密码由服务器掌管。
密码使用非常广泛,理解上没有困难。而秘钥对相对密码来说,不是特别好理解,这里做出通俗的解释:
我们知道在军事通讯上,有一种工具叫密码本,是通讯双方都持有的一种加密方案。其实秘钥对原理与密码本是非常类似的。
秘钥对分为:私钥和公钥,互成为一对。独立存在没有意义,只有双方同时使用才有用。
服务器上存储的是公钥,本地电脑存储的是私钥,当本地电脑连接服务器的时候,私钥和公钥做一个匹配,匹对通过,双方才能建立连接,允许通讯,否则拒绝连接。
软件包
Linux生态中的软件包资源非常丰富,从某种程度上看,用户是否熟练的下载安装以及更新这些包,决定了能够为所在的企业创作的价值的大小。
除了传统的下载源码在编译的软件包安装方案之外,Linux 操作系统都提供了一个集中的软件包管理机制,即搜索、安装和管理软件包。 Linux 软件包的基本组成部分通常有:共享库、应用程序(二进制)、服务和文档。从另外一个角度看,包文件通常包含编译好的二进制文件和其它资源组成的:软件、安装脚本、元数据及其所需的依赖列表。
包管理通常不仅限于软件的一次性安装,还包括了对已安装软件包进行升级的工具。
- 包:被安装到本地服务器的软件安装包,例如Apache安装包
- 包缓存:安装软件时在本地保存的临时文件,通常存储在 /var/cache/yum 目录下
- 仓库:存放多个软件包的一个远端服务器
- 仓库地址:用于访问仓库的网址
- 本地安装包缓存:本地已经下载的软件缓存,通常存储在 /var/lib/rpm 目录下,可以通过
rpm -
- 本地存储的软件清单:从仓库下载所有的软件清单并存在在本地,可以通过
yum list
检索
本章主要讨论和研究Linux系统的包管理机制、实践方案。
仓库
多个软件包存储在一个集中位置,就称之为仓库「repository」,这种以仓库方式集中存放,有利于软件开发者或包维护者进行管理。
仓库的网址,称之为仓库地址,专业术语叫”源”。
互联网上有大量的源,比如 Redhat 官方的源,也有云厂家提供的源。在配置 Linux 服务器或开发环境时,通常都不仅限于使用官方源。相较于现如今软件版本快速更新迭代而言,系统管理员和开发人员掌握常见 Linux 包管理基本操作还是一项必备的常用技能。
每个操作系统发行版厂家从商业战略的角度,会直接维护或间接维护多个仓库,以实现其分级服务和规避责任的目的。
例如:CentOS 可用的几个仓库有:
- 官方仓库:Ubuntu Packages
- SCL、EPEL、IUS 等第三方仓库
官方仓库中的软件包理论上最稳定可靠,其他仓库作为辅助。另外,像 Ubuntu 官方仓库网站提供了非常便捷的包检索页面,用户寻找包的效率远超过 apt search 的方式。
与此同时,官方为了吸引用户贡献包,也会提供最简单的工具(copr 项目),让用户专注于包配置(sepc文件)方面的工作,而构建编译和托管由平台负责,就可以充分利用社区力量,让仓库的软件变得异常丰富。
仓库越来越多,自然就诞生了跨仓库的搜索引擎,类似 pkgs 便可以检索主流的仓库的包,节省了用户寻找的时间。
仓库源
下面我们列出全球比较流行的仓库:
名称 | 地址 | 概要 |
---|---|---|
RPM Fusion | https://rpmfusion.org/ | RPM Fusion provides software that the Fedora Project or Red Hat doesn't want to ship. That software is provided as precompiled RPMs for all current Fedora versions and current Red Hat Enterprise Linux or clones versions; |
EPEL | https://fedoraproject.org/wiki/EPEL | EPEL (Extra Packages for Enterprise Linux), 是由 Fedora Special Interest Group 维护的 Enterprise Linux(RHEL、CentOS)中经常用到的包。 |
RepoForge | http://repoforge.org/ | Repoforge 是 RHEL 系统下的软件仓库,拥有 10000 多个软件包,被认为是最安全、最稳定的一个软件仓库。 |
Remi | https://www.remi.com | Remi repository 是包含最新版本 PHP 和 MySQL 包的 Linux 源,由 Remi 提供维护。 |
PackMan | http://packman.links2linux.org/ | Packman 是 OpenSUSE 最大的第三方软件源,主要为 OpenSUSE 提供额外的软件包,包括音视频解码器、多媒体应用、游戏等。 |
Dotdeb | http://www.debian.org/ | Dotdeb is an extra repository providing up-to-date packages for your Debian 8 “Jessie” servers . |
Gentoo portage | https://www.gentoo.org | Gentoo Portage 软件源 |
Fedora altarch | https://archives.fedoraproject.org/pub/ | Fedora altarch 是 Fedora Linux 额外平台的安装镜像和官方软件包仓库。 |
Ubuntu Ports | http://ports.ubuntu.com | Ubuntu Ports 是 Arm64,Armhf 等平台的 Ubuntu 软件仓库 |
Centos altarch | http://mirror.centos.org/altarch/ | CentOS 额外平台的安装镜像和官方软件包仓库 |
IUS | https://ius.io/ | IUS(Inline with Upstream Stable)是一个社区项目,它旨在为 Linux 企业发行版提供可选软件的最新版 RPM 软件包。 |
ATOMIC | http://www.atomicorp.com/channels/atomic/ | Atomic源支持Fedora,RHEL和CentOS的YUM包管理。 |
仓库搜索引擎
仓库搜索引擎是收录仓库的网站:
名称 | 地址 | 概要 |
---|---|---|
Linux Packages | https://linux-packages.com/ | 轻松找到有关 Linux 上所有软件包的信息,包括 Ubuntu、Centos、Arch、Debian... |
以上是"大卖场"式的仓库源,实际上很多知名的开源软件,例如:MySQL,Apache等还提供自建的仓库,供用户使用。
下图是MySQL官方的仓库文件下载页面,mysql80-community-release-el8-1.noarch.rpm这种文件就是用户安装仓库地址的rpm包。
Linux 提供方便的仓库管理命令:
# 安装仓库管理套件
yum -y install yum-utils
# 范例:启用某个仓库
yum-config-manager --enable remi-php70
安装仓库
安装仓库通俗的讲,就是将仓库的网址(地址)信息写入到服务器的指定文件夹(文件)中。类似我们为了方便自己购物,将不同的购物网站的网站收藏到浏览器是一个道理。
- CentOS仓库网址存放地:/etc/yum.repos.d
- Ubuntu仓库网址存放地:/etc/apt/sources.list
以CentOS仓库为例,查看 /etc/yum.repos.d 目录,我们会发现下面有几个以 repo 结尾的文件
打开每个.repo文件,你会看到其中的主要信息就是网址
那这些.repo文件是如何被安装的呢?主要有如 下几种方式:
#1 yum 安装
yum install epel-release
#2 下载 RPM包安装
wget -O /etc/yum.repos.d/epel.repo https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -i epel-release-latest-7.noarch.rpm
#3 直接在 /etc/yum.repos.d 新增一个.repo文件,内容如下
[rpmfusion-free]
name=RPM Fusion for Fedora $releasever - Free
baseurl=https://mirrors.tuna.tsinghua.edu.cn/rpmfusion/free/fedora/releases/$releasever/Everything/$basearch/os/
mirrorlist=http://mirrors.rpmfusion.org/mirrorlist?repo=free-fedora-$releasever&arch=$basearch
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmfusion-free-fedora-$releasever-$basearch
[rpmfusion-free-debuginfo]
name=RPM Fusion for Fedora $releasever - Free - Debug
mirrorlist=http://mirrors.rpmfusion.org/mirrorlist?repo=free-fedora-debug-$releasever&arch=$basearch
enabled=0
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmfusion-free-fedora-$releasever-$basearch
[rpmfusion-free-source]
name=RPM Fusion for Fedora $releasever - Free - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/rpmfusion/free/fedora/releases/$releasever/Everything/source/SRPMS/
mirrorlist=http://mirrors.rpmfusion.org/mirrorlist?repo=free-fedora-source-$releasever&arch=$basearch
enabled=0
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmfusion-free-fedora-$releasever-$basearch
我们知道仓库网址上有一个特殊的数据库文件(软件列表),这个文件记录这个网址所提供的所有安装包,有的仓库只有少数几个安装包,有的仓库提供成千上万个安装包。
同时本地也有一个数据库文件(RPM 数据库 ),它记录本地已经安装的软件包名称、版本、来源等信息。当用户使用yum安装软件的时候,本地就会到仓库中下载软件列表,通过与本地的RPM数据库做对比,然后决定是否安装或提示已经存在无需安装。
自建仓库
在安装MySQL的时候,我们就发现,MySQL官方提供了自己的仓库以供用户使用。也就意味着,仓库是可以自行建设的。
参考:《配置本地Yum仓库》
管理包
虽然大多数流行的 Linux 发行版在包管理工具、方式和形式都大同小异,但却还是有平台差异:
系统 | 格式 | 工具 |
---|---|---|
Debian | .deb | apt, apt-cache、apt-get、dpkg |
Ubuntu | .deb | apt、apt-cache、apt-get、dpkg |
CentOS | .rpm | yum |
Fedora | .rpm | dnf |
下图是典型的deb包组成部分:
Debian 及其衍生产品如:Ubuntu、Linux Mint 和 Raspbian 的包格式为.deb文件,apt 是最常见包操作命令,可:搜索库、安装包及其依赖和管理升级。而要直接安装现成.deb包时需要使用dpkg命令。
CentOS、Fedora 及 Red Hat 系列 Linux 使用RPM包文件,并使用yum命令管理包文件及与软件库交互。
在最新的 Fedora 版本中,yum命令已被dnf取代进行包管理。
更新本地数据库
大多数 Linux 都使用本地数据库来存储远程可用的包仓库列表,所以在安装或升级包之前最好更新(同步)一下这个数据库。
系统 | 命令 |
---|---|
Debian / Ubuntu | sudo apt-get update |
CentOS | yum check-update |
Fedora | dnf check-update |
升级已安装的包
在没有包管理方式时,要升级并保持 Linux 已装软件处在最新版本上是一个巨大的工程,管理员和用户不得不手动跟踪上游软件版本变化及安全警告。在有了包管理系统之后,只需几条命令便可保持软件最新。
系统 | 命令 | 备注 |
---|---|---|
Debian / Ubuntu | sudo apt-get upgrade | 仅升级已安装的软件包 |
sudo apt-get dist-upgrade | 可添加或删除程序包,以满足新的依赖。 | |
CentOS | sudo yum update | |
Fedora | sudo dnf upgrade |
查找/搜索软件包
大多数 Linux 桌面版本都提供用户可搜索和安装软包的界面,这是找寻和安装软件的最佳方法。但对于追求效率和服务器管理员来说,使用命令行工具查找/搜索软件包才是正途。
系统 | 命令 | 备注 |
---|---|---|
Debian / Ubuntu | apt-cache search 搜索内容 | |
CentOS | yum search 搜索内容 | |
yum search all 搜索内容 yum --showduplicates list gitlab-ee | ||
搜索所有内容,包括包描述。 | ||
Fedora | dnf search 搜索内容 | |
dnf search all 搜索内容 | 搜索所有内容,包括包描述。 |
查看某个软件包信息
在决定安装哪个包之前,我们往往都需要查看该软件包的详细说明。包的说明文件中通常包括:包名、版本号及依赖列表等元数据,可以使用如下命令来查看。
系统 | 命令 | 备注 |
---|---|---|
Debian / Ubuntu | apt-cache show 包名 | 显示有关软件包的本地缓存信息 |
dpkg -s 包名 | 显示包的当前安装状态 | |
CentOS | yum info 包名 | |
yum deplist 包名 | 列出包的以来 | |
Fedora | dnf info 包名 | |
dnf repoquery –requires 包名 | 列出包的以来 |
# 通过 rpm 命令查看已安装软件包的信息
$ rpm -qi rabbitmq-server
Name : rabbitmq-server
Version : 3.8.3
Release : 1.el7
Architecture: noarch
Install Date: Sat 11 Apr 2020 03:16:18 PM CST
Group : Development/Libraries
Size : 14010653
License : MPLv1.1 and MIT and ASL 2.0 and BSD
Signature : RSA/SHA256, Mon 09 Mar 2020 11:24:36 PM CST, Key ID 6b73a36e6026dfca
Source RPM : rabbitmq-server-3.8.3-1.el7.src.rpm
Build Date : Mon 09 Mar 2020 11:24:34 PM CST
Build Host : b0cb34e7-576c-46ec-669f-7b518b2352e1
Relocations : (not relocatable)
URL : https://www.rabbitmq.com/
Summary : The RabbitMQ server
Description :
RabbitMQ is an open source multi-protocol messaging broker.
# 通过 rpm 查看未安装的软件包的信息
$ rpm -qpi rabbitmq-server
# 通过 yum 查看软件包信息
$ yum info rabbitmq-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
Name : rabbitmq-server
Arch : noarch
Version : 3.8.3
Release : 1.el7
Size : 13 M
Repo : installed
From repo : rabbitmq_rabbitmq-server
Summary : The RabbitMQ server
URL : https://www.rabbitmq.com/
License : MPLv1.1 and MIT and ASL 2.0 and BSD
Description : RabbitMQ is an open source multi-protocol messaging broker.
从软件仓库安装包
一旦我们知道某个软件包的名称之后,便可以使用如下命令从软件仓库安装包。
系统 | 命令 | 备注 |
---|---|---|
Debian / Ubuntu | sudo apt-get install 包名 | |
sudo apt-get install 包1 包2 … | 安装所有列出的包 | |
sudo apt-get install -y 包名 | 无需提示直接安装 | |
CentOS | sudo yum install 包名 | |
sudo yum install 包1 包2 … | 安装所有列出的包 | |
sudo yum install -y 包名 | 无需提示直接安装 | |
yum install yum-plugin-downloadonly 包名 | 只下载包而不安装 | |
sudo yumdownloader 包名 | 下载包到当前目录 | |
Fedora | sudo dnf install 包名 | |
sudo dnf install 包1 包2 … | 安装所有列出的包 | |
sudo dnf install -y 包名 | 无需提示直接安装 |
从本地文件系 统直接安装包
很多时候,我们在进行测试或从某个地方直接拿到软件包之后需要从本地文件系统直接安装包。Debian 及衍生系统可以使用 dpkg 进行安装,CentOS 和 Fedora 系统使用 yum 和 dnf 命令进行安装。
系统 | 命令 | 备注 |
---|---|---|
Debian / Ubuntu | sudo dpkg -i 包名.deb | |
sudo apt-get install -y gdebi&& sudo gdebi 包名.deb | 使用gdebi检索缺少的依赖关系 | |
CentOS | sudo yum install 包名.rpm | |
Fedora | sudo dnf install 包名.rpm |
移除已安装的包
包管理器知道哪些文件是由哪个包提供的,所以卸载不需要的软件包之后可以获得一个干净的系统。
系统 | 命令 | 备注 |
---|---|---|
Debian / Ubuntu | sudo apt-get remove 包名 | |
sudo apt-get autoremove | 自动移除已知不需要的包 | |
CentOS | sudo yum remove 包名 | |
Fedora | sudo dnf erase 包名 |
锁定软件包版本
有些时候,我们在对系统进行更新操作时,不需要对某些软件包进行升级操作,要把该包锁定在某个特定版本下。这个时候我们就需要用到相关的插件,以yum为例:
yum install yum-plugin-versionlock
安装 yum-plugin-versionlock 之后,系统新增一个配置文件:/etc/yum/pluginconf.d/versionlock.list
可以直接编辑此文件,往其中添加锁定项,也可以通过下面的命令添加锁定项
yum versionlock gcc-*
上述配置不允许将gcc软件包升级到大于执行锁定时安装的软件包的版本。
制作包
我们知道 rpm/deb 包都是存储在仓库中的可以运行的包,使得我们安装软件非常的简单和方便。
如果我们需要安装的软件,在互联网上找不到对应的包,怎么办?通常的做法是下载源码编译安装。
编译安装可以解决我们自身安装软件的问题,但我们无法给他人共享我们的安 装成功,因此我们如果可以自己制作 rpm/deb 包,然后发布到互联网上,一定有很多人下载,这样分享自己的创作成果毫无疑问会得到极大的收获和鼓舞。
下面我们以 RPM 包为例,详细介绍制作过程(参考来源)。
知识
安装颗粒度
与安装相关的技术知识颗粒度由小到大分别为:Make 编译 > RPM 包制作 > 包仓库建设。
颗粒度越大,受惠的人群越广。
spec 文件
Spec 文件是 RPM 包的编排文件,简单理解为制作脚本,它是制作 RPM 包最核心的内容。
下面是一个简单的 Spec 文件(假设名称为 hello.spec):
Name: hello-world
Version: 1
Release: 1
Summary: Most simple RPM package
License: FIXME
%description
This is my first RPM package, which does nothing.
%prep
# we have no source, so nothing here
%build
cat > hello-world.sh <<EOF
#!/usr/bin/bash
echo Hello world
EOF
%install
mkdir -p %{buildroot}/usr/bin/
install -m 755 hello-world.sh %{buildroot}/usr/bin/hello-world.sh
%files
/usr/bin/hello-world.sh
%changelog
# let's skip this for now
将以上文件的内容保存到 Spec 文件后,运行如下的命令,便完成一个 RPM 包的制作。
rpmdev-setuptree
rpmbuild -ba hello.spec
通过 tree
命令查询安装结果:
$ tree rpmbuild
rpmbuild
|-- BUILD
| `-- hello-world.sh
|-- BUILDROOT
|-- RPMS
| `-- x86_64
| `-- hello-world-1-1.x86_64.rpm
|-- SOURCES
|-- SPECS
`-- SRPMS
`-- hello-world-1-1.src.rpm
7 directories, 3 files
从以上的范例,可以直接得出几个坚定的结论:
- RPM 包制作中的 Build 不一定是编译,它也可以是其他动作,例如:拷贝一个文件
- RPM 包名称会根据描述信息自动名词,非常规范,可读性也很好
- 生成 RPM 包的同时,也会生成一个 SRPM 包
- Spec 语法基本就是 Shell 语法
- 依赖组件不是必须的
Makefile
Makefile 顾名思义是 make
时所需的一个编排文件,如果用不着 make
,那么 Makefile 也就不需要。
关于 Make 命令,参考官方文档:GNU Make
交叉编译
生态工具
在云计算发展的今天,包管理丰富多彩。在实践中,有一些非常好用好玩的工具:
- packagecloud.io: 提供包管理托管的网站,范例参考:RabbitMQ on packagecloud
- 软件分发即服务:https://bintray.com/
- C/C++编译工具: https://conan.io/
- 包检索工具:https://pkgs.org/
- Snap包: https://snapcraft.io/
- Flatpak包:https://www.flatpak.org/
发行版特别说明
下面总结主流 Linux 发行版上的包管理相关的独特性
RedHat
RedHat 系统免费,但是仓库需要订阅。
下面重点介绍 RedHat 如何使用 CentOS-base 仓库的方案
CentOS
CentOS 是 RedHat 的同步办法,完全免费。
Debian
Debian 官方仓库的软件包非常丰富,版本更新及时。
Debian 也可以使用 Ubuntu 社区的仓库,例如:ppa,但是使用 apt-add-repository --yes --update ppa:ansible/ansible
增加仓库软件包的时候,默认会增加 Ubuntu 最新版本的地址。
Ubuntu
OracleLinux
OracleLinux 是 RedHat 家族的分支,与 CentOS 非常类似,但完全基于 RedHat 内核。
[root@iZj6c6izdnwbwt5jb0i2r0Z ~]# cat /proc/version
Linux version 4.14.35-1902.305.4.el7uek.x86_64 (mockbuild@jenkins-10-147-72-125-9cc530f8-159f-444e-98e9-d1e5d2b5e4e2) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16.0.3) (GCC)) #2 SMP Tue Aug 4 14:17:05 PDT 2020
OracleLinux 非常注重打造自己的生态,官方提供了大量在线安装包,并用心维护,基本能够方便用户快速的安装主流软件。
运行命令 yum list *release-el7
查看所有可用的源:
mysql-release-el7.x86_64 1.0-3.el7 ol7_latest
oracle-ceph-release-el7.x86_64 1.0-2.el7 ol7_latest
oracle-epel-release-el7.x86_64 1.0-3.el7 ol7_latest
oracle-gluster-release-el7.x86_64 1.0-6.el7 ol7_latest
oracle-golang-release-el7.x86_64 1.0-6.el7 ol7_latest
oracle-nodejs-release-el7.x86_64 1.0-5.el7 ol7_latest
oracle-olcne-release-el7.x86_64 1.0-5.el7 ol7_latest
oracle-openstack-release-el7.x86_64 1.0-2.el7 ol7_latest
oracle-ovirt-release-el7.x86_64 1.0-1.el7 ol7_latest
oracle-php-release-el7.x86_64 1.0-4.el7 ol7_latest
oracle-release-el7.x86_64 1.0-3.el7 ol7_latest
oracle-softwarecollection-release-el7.x86_64 1.0-3.el7 ol7_latest
oracle-spacewalk-client-release-el7.x86_64 1.0-4.el7 ol7_latest
oracle-spacewalk-server-release-el7.x86_64 1.0-4.el7 ol7_latest
oraclelinux-developer-release-el7.x86_64 1.0-5.el7 ol7_latest
oraclelinux-release-el7.x86_64 1.0-12.1.el7 ol7_latest
AmazonLinux
AmazonLinux 官方对其发行版的性质描述非常少,似乎刻意回避。实际上,AmazonLinux 也是 RedHat 家族的分支,非常类似 CentOS。
经过实践探索,CentOS 相关的仓库(例如:CentOS-base.repo)也是可以在 AmazonLinux 上使用的。
值得注意的是,AmazonLinux 默认的源会设置优先级(priority=10),导致 yum 无法自主灵活的选择其他仓库的安装包。
- amzn2-extras.repo
- amzn2-core.repo
所以,建议删除以上两个官方默认仓库的优先级设置,把安装的自主权交还给 yum。
文件管理
拥有者
规定文件只能被指定用户访问访问
范例:
# 修改wwwroot文件夹所属的用户和用户组为nginx
chown -R nginx.nginx /data/wwwroot
权限
Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
范例:
# 分别修改文件和文件夹的读、写、执行权限
find /data/wwwroot/default -type f -exec chmod 640 {} \;
find /data/wwwroot/default -type d -exec chmod 750 {} \;