Advanced
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包管理。 |