RH124内容不是很多,但是也不知道多少能够写完,细节性的东西不会太多,但是确保每个都能够有印象能理解。本来是打算一篇文章写完的,但最后还是决定写一个系列。
至于RH124和RH134的内容为什么放在了k8s系列的后面,那只是单纯因为这一段时间正在学k8s。争取这两天将RH124和RH134内容写完,至于k8s系列要放到后面更了。
Part1:redhat linux基础介绍
RHEL指的就是红帽企业版linux,虽然要付费,但是有平替。比如rocky,我们使用的就是rocky linux,也很好用。
当然,大家或许用过centOS 7,我也用过这个,不过已经不再维护了。虽然有centos stream,但主要是作为redhat linux的上游版本,至于fedora,则是centos stream的上游了。
终端
这一部分我主要讲一讲终端,终端指的是输入输出设备,有物理终端、虚拟终端和伪终端。
物理终端如串口,虚拟终端则是本地虚拟控制台,有tty1~6,而伪终端则是通过ssh登录的终端,使用pts来标记。
同一个终端可以运行不同的shell,shell是解释命令用的,终端可以使用bash也可以使用sh。
文件目录
这部分主要讲讲linux的文件树结构,每个目录有着对应的作用。以下目录都是在根目录/下,
/var目录用来保存易变的数据,/run则是保存开机后进程运行的数据,/proc则是保存进程状态信息,/mnt给超级用户挂载使用,/boot目录存放引导程序,/dev目录存放设备文件,/etc则是存放配置文件。
还有/usr/bin、/usr/sbin、/usr/lib、/usr/local等目录分别存放用户命令,超级用户命令,库文件,本地自定义软件等。
软硬链接
硬链接不允许跨文件系统,不允许链接目录,并且指向的是同一个inode,删除其中一个另一个都有效。
软链接则可以跨文件系统,可以链接目录,实质上保存的是链接的路径,属于独立的文件,和原文件有不同的inode。如果删除原文件,该软链接会悬空。
命令格式为ln 现有文件 链接文件(-s创建的是软链接),注意可以通过ls -i查看文件的inode。
重定向
>和>>符号,默认是从标准输出中获取数据,也就是文件描述符为1的通道。>是覆盖,>>是追加。可以结合cat 来使用,比如使用cat > file << EOF,来覆盖file文件。
至于EOF,还可以用"EOF"和'EOF',区别在于引号的作用不同,单引号阻止所有的shell扩展,但是双引号保留命令替换和变量扩展。
文件描述符2是标准错误,如果使用&>表示将标准输出和标准错误一同重定向。
tee则是和管道符'|'结合起来时候用,用来分流,将输入分流到标准输出(stdout)和文件或者命令中,使用tee默认是覆盖,使用-a选项则是追加。
重定向符不能连接命令,但是管道符可以。/dev/null是一种特殊设备,表示“黑洞”。
Part2:管理用户和组
首先讲讲用户和组是用来做什么的,linux是多用户多任务的系统,允许每个用户去执行自己的任务,通过划分不同的用户并赋予不同的权限,让linux系统能够高效的运行完成各种任务。
组的话是为了方便用户的管理,通过将一类用户划分到同一个组,主要是方便组内用户的合作。并且这和权限管理有关,每个组有着不同的权限,这样能够更轻松地去管理组而不是用户。
用户管理
主要是讲一讲useradd命令,通过-m说明需要创建家目录,-d可以指定家目录路径,-u指定UID,-g指定主组(默认和用户名同名组),-G指定附加组。
userdel则是删除用户,-r会一并删除家目录。还有usermod命令,可以让用户锁定之类的,或者修改密码过期时间等等。
组的内容也放在这里讲讲,通过groupadd来增加组,使用-u则是指定GID,groupdel则是删除。
配置sudo权限
这个是需要关心的,毕竟权限不足而被拒绝是很难受的事,尤其是自己就是系统的主用户但是没有权限。
可以在配置文件/etc/sudoers中编写,格式为user/group ALL=(ALL:ALL) ALL,如果是组需要在开头写%,第一个ALL表示在所有的主机上,第二个ALL表示任何其他用户,第三个ALL表示任何其他组,第四个ALL表示任何命令。
第二个和第三个ALL可缩写为一个,表示该用户或者组用户可以在系统的任何其他用户或者任何其他组上运行任何命令。
如果有sudo组就很好办了,可以将用户添加到这个sudo组中,这样就可以获取sudo权限了。值得注意的是,除了在/etc/sudoers文件中,还可以在/etc/sudoers.d目录下添加这样的文件。
su、su -、sudo、ssh的区别
su是用来切换用户的,su -也是用来切换用户的,只不过前者保留当前的环境,后者加载目标的环境。
但是这里我自己迷惑了,因为su本来是不会加载目标环境的,但是我发现有的环境变量已经改变了,貌似加载了.bashrc文件。
sudo同样可以切换用户。使用sudo -i切换root,会加载root的完整的环境变量。
ssh是用来远程登录用户的,会新建登录会话,并且最重要的是会加载用户的系统服务(保存在~/.config/systemd/user目录下面),其他的都不会。
Part3:控制对文件的访问
主要是文件的所有组,所有者以及所属权限等内容,有些细节还是需要注意的,特别是特殊权限的作用。
文件系统权限
主要是所属者权限,所属组权限和其他用户权限。有意思的是,如果给文件权限设置为007,则其他用户有所有的权限,但是所属者却连访问的权限都没有了。
不过除了root用户,就只有所属者能够修改文件权限了,可以使用chmod命令修改,所属组用户能够偶修改组权限。
注意如果有r权限,则是可读(文件或目录);如果是x权限,对于目录来说则是可以cd进去,对于文件则是可执行;如果是w权限,意味着文件可写,对于目录来说,需要组合x权限,这样就对目录下的文件可以新增和删除任意文件(即使文件不属于自己)。
但是所属者并不能修改文件的所有权,也就是我创建了这个文件我不能转让给其他人,只有root用户能够修改文件的所属者,使用chown命令。
无论是chmod还是chown都可以用-R来递归的修改文件权限和文件所属。
特殊权限
上面只提到了rwx,但是还有一组特殊权限。通过w+x权限的组合,可以在目录下删除任意文件,即使文件不属于自己,这样的权限可以加以约束。
如果给目录添加o+t权限(对文件无效),则是只有所属用户才能删除该目录下的文件,阻止了对该目录具有w+x权限用户的删除。
如果给目录添加g+s权限(对文件来说则是以文件的所属组身份执行文件),这样用户在该目录下创建的任何文件的所属组都是该目录的所属组。
如果给文件添加u+s权限(对目录无效),则是在执行文件的时候,以文件的所属用户的身份执行,与给文件添加g+s权限有类似的效果。
Part4:监控和管理Linux进程
进程的管理还是很重要的,比如说某个进程占用了哪个端口不释放,这时候就需要杀死它来释放。这个操作还是比较常用的,或者某些后台任务不想让它运行了,也需要借助kill来杀死后台进程。
进程状态和生命周期
R表示正在运行中,S表示正在睡眠中(一般是等待某一条件,如硬件请求),T表示进程已经被停止,Z则表示僵停,该状态表示除了PID之外的资源都差不多释放了。
一般是通过ps aux和ps -ef来查看进程状态,后者包含PPID,也就是父进程的PID;但是前者包括了cpu占用率、内存占用率,所以除非需要查看PPID,否则直接使用ps aux。
其实还有SID,指的是会话首进程ID,那肯定就是与终端交互的shell(如bash、sh)进程了!
控制作业和杀死进程
如果使用命令后面加&符号,表示后台进程,任务会在后台执行。使用jobs可以查看当前shell会话的后台进程列表,使用fg %n可以将列表中编号为n的放到前台执行。
至于相对的,使用bg %n则可以将编号为n的放在后台执行。如果在前台执行,使用ctrl+c可以优雅终止,使用ctrl+z则是将进程暂停并放到后台。
为什么说ctrl+c是优雅终止呢?这就要说到如何杀死进程了。主要有这几个信号,-2(SIGINT)允许进程优雅关闭,即允许保存状态和清理文件,ctrl+c使用的就是这种方式。
-9(SIGKILL)强制终止,-15(SIGTERM)同样允许进程自己清理再终止。kill的默认信号就是-15,当然pkill也是。说到这,就需要再讲一讲kill和pkill的区别了。
kill只能通过进程PID来杀死进程,而pkill则可以通过名称来杀死进程,并且支持模糊匹配,默认能够将包含名称的进程都杀死(除非是用-x表示精确匹配),当然了pkill也支持使用PID。
监控进程活动
最后的话,那肯定是要讲一讲top命令了。用于实时监控系统进程的运行状态,里面还有一些值需要注意,比如说cpu负载平均值,这和cpu数量有关。使用lscpu可以查看当前系统的cpu数量,然后负载平均值就是进程数除以cpu数。
使用q可以退出top命令界面,当然也可以借助top来杀死进程,以及分别按cpu占用率、内存占用率来给系统进程排序。不过具体的使用方法内容有点多,我就不概述了。
Part5:控制服务和守护进程
讲到守护进程,就不得不提一下systemd进程了,这是PID为1的进程,也是系统运行的第一个进程,可以以唤醒其他守护进程并加载配置文件,会做一些系统初始化的任务。
所有的守护进程吗名称都是以d结尾的,并都在后台运行,守护进程会加载自己的配置文件来运行。但是并不是所有的服务单元都是守护进程。
系统服务单元
服务单元有这么一些概念,当使用systemctl list-units --type=service的时候,会显示UNIT、LOAD、ACTIVE、SUB等字段。
UNIT表示的是服务的名字,而LOAD则表示守护进程是否正确解析了服务单元的配置,并将服务单元加载到内存中。ACTIVE则是表示该服务是否激活成功(即使加载到内存也有可能失败),而SUB则是表示服务的具体状态,如running运行、exited退出等。
我们通过systemctl start service来启动服务,可以通过systemctl status service来查看服务的状态,包括load以及active的状态信息。
使用systemctl mask service可以屏蔽服务,不让其运行,即使手动开启也禁止,除非unmask。然后就是服务之间有依赖关系,可以通过systemctl list-dependencies service来查看。
服务单元文件
最需要注意的就是.service文件,这里有两个目录,一个是系统默认服务配置文件的目录/usr/lib/systemd/system,这个目录我们一般不做修改。还有一个是自定义系统服务的配置文件目录/etc/systemd/system,这个目录的优先级比前面的高,会覆盖。
所以我们一般修改/etc/systemd/system目录下的配置文件,也就是.service文件,里面包括服务的启动,暂停以及重载命令(分别需要配置ExecStart、ExecReload、ExecStop)。
注意systemclt reload则是针对服务单元本身的(如修改了服务的配置文件),而且必须是在service文件中定义了ExecReload指令,否则无效。而systemctl daemon-reload则是加载整个系统服务的(如新增了系统服务,或者修改了.service文件)。
当然服务单元文件还有.socket文件,用来给服务进程和本地的客户端进程之间的通信,效率会比较高,因为不会经过网卡和防火墙,数据也不加密。.timer文件也是一种系统单元文件,定义何时触发对应的 `.service`文件(执行任务),两者命名需要一致。
写到这RH124的内容已经过半了,虽然内容不多,但是还是不太好写。因为简单的命令不想写,至于理解上也没什么难度,不过还是要保证整体内容的都要讲到。
这篇文章就把RH124剩下的内容都完结吧,主要还剩下配置和保护SSH、管理网络、安装和更新软件包以及访问Linux系统文件。
管理网络要使用nmcli工具,至于安装和更新软件包则使用的dnf包管理器,访问linux文件系统则是要学习mount挂载。内容也很重要,因为rhcsa认证考试会考。
Part6:配置和保护SSH
这里先讲一讲ssh和ssl的区别。ssh是secure shell的缩写,而ssl则是secure sockets layer的缩写,一个工作在应用层,一个工作在传输加密层。ssh通过比对服务器公钥的md5值来验证,而ssl则是通过ca证书来验证对方。
[1]ssh配置文件
家目录下会有一个.ssh目录,下面放着known_hosts和config文件,前者用于存放已经远程登录的主机信息(下次不用比对md5值),后者用于远程登录的预设参数。
当然了还有公私钥文件id_rsa和id_rsa.pub文件,以及作为服务端允许远程登录的authorized_keys,这个文件存放允许登录的主机信息。
其实在/etc/ssh目录下也存放着ssh_known_hosts和sshd_config文件,以及ssh_config文件,sshd_config表示服务端配置文件,ssh_config则表示客户端配置文件(系统全局配置,会被覆盖)。
[2]允许root远程登录
接下来主要是设置root是否允许远程登录,还有root是否允许密码登录,通过/etc/ssh/sshd_config文件来配置。分别修改的是/etc/sshd_config文件(服务端)中的PermitRootLogin还有PasswordAuthentication字段。
分别将这两个字段设置为yes即可,不过还有补充的是,可以通过ssh-keygen生成本地的公私钥,用于客户端ssh连接。注意客户端和服务端的公私钥不是一起的,而是分开的。服务端的公私钥和配置文件(除了authorized_keys文件)都放在/etc/ssh目录下。
然后就是ssh-copy-id将本地公钥上传到远程服务器(authorized_keys)中,第一次需要输入密码,并验证md5值。
Part7:管理网络
管理网络的工具有很多,比如ifconfig(属于net-tools工具),以及ip(iproute2工具集,替代ifconfig),当然还有nmcli工具(nmtui图形化工具)。
前两者都是临时修改,对底层网络进行配置,而nmcli则是通过修改配置文件永久修改。
网卡的命名规则:之前都使用ethn来命令网卡,但是后面使用以太网(有线)接口en来替代,无线局域网WLAN接口则用wl替代。
但有时候通过nmcli查看网卡状态总是unmanaged,这时候就只能使用ip或者ifconfig来修改了(内核),具体情况我也不了解,也没办法。
[1]修改主机名
通过host命令可以查看当前主机的主机名,其实是保存在/etc/hostname文件里面的,可以使用hostname name来动态修改。
或者通过hostnamectl hostname name永久修改,最直接的方式就是编辑/etc/hostname文件来修改。不过不建议手动修改,因为/etc/hosts文件中可能有127.0.0.1 hostname这样的条目,也就是本地dns解析。
如果手动修改/etc/hostname文件,会导致他们在之间的关联出现问题,除非全部手动修改。补充一点就是/etc/hosts是本地域名解析文件,在/etc/resolv.conf文件中则保存着DNS服务器的IP地址,同时有domain、search字段。
[2]查看主机网络
可以通过ifconfig命令来查看网络,不过推荐使用ip。ip link show查看网卡的状态,还有MTU值等,ip route show查看路由,ip addr show查看ipv4地址和子网掩码。
如果网卡处于down的状态可以使用ip link set ens-33 up 来启用,当然ip link还能创建虚拟网卡。可以通过ip addr add 192.168.241.141/24 dev ens-33来动态设置IP,注意一个网卡能够有多个IP。
对应的使用该ip addr del来删除指定的IP,还有就是通过ip route add default via 192.168.241.2 dev ens-33来指定下一跳网关IP,通过ip route del删除。
除了设置IP外,可能需要查看端口的占用情况,可以使用netstate -tuln来查看网络情况(only servers),netstate -ta查看所有的。不过在这个我觉得名称并不合适,其实应该叫套接字情况统计,也就是socket statistics。
有个ss工具替代了netstate,使用ss -ta一样能够观察到端口的占用情况。
[3]NetworkManager服务
前面输了半天,总算讲到重点内容了。也就是NetworkManager服务,服务配置文件(也就是网络配置)保存在/etc/NetworkManager/system-connections目录下,并使用nmcli工具来管理。
通过nmcli dev status来查看网卡的状态,通过nmclli con show 则可以查看配置文件的状态(是否启用,--active看启用的)。可以通过`nmcli con mod "配置文件名" 字段 值`来修改配置文件,然后通过nmcli con down 再up "配置文件名"来启用。
或者通过`nmcli con add con-name "配置文件名" ifname ens-33 字段 值`来添加,然后再用nmcli con up "配置文件名"启用。当然,这讲的都是对配置文件的操作,也可以对网卡进行操作。
如使用nmcli dev disconnect ens-33 断开连接,nmcli dev connect ens-33来启用连接。
接下来讲一讲所谓的字段有哪些,主要是ipv4.addresses,ipv4.dns,ipv4.gateway等,注意的是如果是手动配置,需要使用字段ipv4.method manual,否则会有问题。还可以设置connection.autoconnect yes让配置文件自动启用。
Part8:安装和更新软件包
这部分又是一堆内容,主要是讲讲包管理器的,从rpm包管理器,到yum包管理器,再到dnf包管理器,一代一代升级。在讲包管理器之前,先理清楚两个词的概念,一个是下载,一个是安装。
下载是将软件包从远程服务器或本地存储(如U盘)复制到当前主机,需要通过网络或存储介质进行数据传输。
而安装则是系统集成,下载的软件包里面有可执行文件,库文件以及配置文件等等。安装软件包就是将已下载的软件包解压、配置并集成到操作系统中,使其可运行。主要包括文件部署以及环境配置,因为有些软件包可能需要设置环境变量之类的。
[1]包管理器
rpm是本地包管理工具,不处理软件包的依赖,只是将下载好的软件包安装到系统上。
rpm包管理工具并不管理仓库,但是yum和dnf开始管理仓库。yum和dnf能够自动处软件理依赖关系,对于本地没有的软件包则会从仓库中寻找并下载安装。
不过就拿dnf(yum升级版,主要是性能上提升,而不是功能上的扩展)来说,实际上是调用rpm包管理器来实现安装的,但扩展了依赖管理功能以及仓库管理功能。
[2]配置软件仓库
可以直接编写/etc/yum.repos.d目录下后缀名为.repo的仓库文件,文件名倒是不重要,而是文件里面的仓库id重要,使用[reponame]标明。
一个仓库需要有name、baseurl、gpgcheck(gpgkey)、enabled等字段,name一般和仓库id保持一致,如果gpgcheck=1,那么就需要指定gpgkey的路径,一般将enabled设置为1。
使用dnf repolist all查看所有的仓库,使用dnf makecache去验证。还有dnf search、dnf list等等命令。dnf upgrade则是更新系统中所有的软件,从软件仓库中寻找对应的软件,并比较软件版本。
Part10:访问Linux系统文件
首先讲讲挂载,和挂载要素。使用mount挂载文件系统,挂载点需要是空目录;使用unmount取消挂载,但是需要确保该挂载点没有进程使用,可以使用lsof来查看该挂载点目录否是有进程占用。
挂载要素指的是设备文件、挂载点、文件系统、挂载选项。设备文件如磁盘分区、U盘等,需要先建立文件系统,再使用mount挂载。使用mount是临时挂载,如果要永久挂载,则需要编辑/etc/fstab文件。
比如/dev/vdb1 /mnt/data ext4 defaults 0 0,defaults是挂载选项,包含rw,suid,dev,exec,auto,nouser,async等默认选项。至于第一个0表示永不备份(禁用dump工具对该分区备份),第二个0表示系统启动时不检查该文件系统。
可以使用df -h查看文件系统的挂载情况,对于未挂载的设备文件,则可以通过lsblk查看(显示挂载和未挂载的设备)。使用lsblk -fp则可以看到设备文件的UUID,现在一般用UUID来挂载而不是设备的路径。
使用free -h则是查看内存的占用情况,包括交换分区的使用情况。要注意swap并不属于文件系统,它既没有目录/文件结构,也不能通过路径访问。文件系统有ext4类型(通用文件系统,稳定),xfs文件系统(高性能),NTFS文件系统(兼容windows,双系统共享分区)等。