先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
1> :以覆盖的方法将“正确的数据”输出到指定的文件或设备上;
1>>:以累加的方法将“正确的数据”输出到指定的文件或设备上;
2> :以覆盖的方法将“错误的数据”输出到指定的文件或设备上;
2>>:以累加的方法将“错误的数据”输出到指定的文件或设备上;
Linux账号管理与ACL权限设置
=================
用户组
有效用户组和初始用户组
我想要让 dmtsai 这个使用者,加入 vbird1, vbird2, vbird3 这三个群组,且不影响 dmtsai 原本已经支持的次要群组时,该如何动作?
usermod -a -G vbird1,vbird2,vbird3 dmtsai
groups:查看用户组
newgrp:有效用户组的切换
exit :注意,记得退出newgrp的环境
chown 目录:改变目录用户者(加-R可把目录下的文件也改变)
chgrp 目录:改变用户组 -R,同上
账号管理
useradd 选项 用户名
系统账号的UID都是小于1000,默认不会建立家目录
要让 test 变成 root 的权限,那么就将 /etc/passwd 里面, test 的 UID 与 GID 字段变成 0 即可
实例1
# useradd –d /home/sam -m sam
此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。
实例2
# useradd -s /bin/sh -g group –G adm,root gem
此命令新建了一个用户gem,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。
passwd
修改用户密码格式为【sudo passwd 用户名】
使用useradd建立账号默认账号是锁定的,直接passwd修改账号密码就好了
要帮一般账号修改密码需以【passwd账号】格式,使用【passwd】表示修改自己的密码
与root不同的是,密码的规范非常严格,只有出现【Retype】密码才被接受,并看到【successfuly】才算修改密码成功
为方便系统管理,可用【–stdin】
举例来说,帮vbired2修改密码成为abc543cc
这个动作会直接更新使用者的密码而不用再次的手动输入!好处是方便处理,缺点是这个密 码会保留在指令中, 未来若系统被攻破,人家可以在 /root/.bash_history 找到这个密码呢! 所以这个动作通常仅用在 shell script 的大量创建使用者帐号当中!
让某个账号暂时无法使用密码登录主机,办法就是让它的密码变成不合法(shadow第二字段长度变掉)
将 /etc/passwd 的 shell 字段写成 /sbin/nologin ,即可让该帐号暂时无法登陆主机; 将 /etc/shadow 内的密码字段,增加一个 * 号在最前面,这样该帐号亦无法登陆! 将 /etc/shadow 的第八个字段关于帐号取消日期的那个,设置小于目前日期的数字, 那么他就无法登陆系统了!
chage【使用者在第一次登陆时, 强制她们一定要更改密码后才能够使用系统资源】
usermod
# usermod -s /bin/ksh -d /home/z –g developer sam
此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。
userdel
userdel -r username:连同使用者的家目录也一起删除
如果想要完整的将某个帐号完整的移除,最好可以在下达 userdel -r username 之前, 先以“ find / -user username ”查出整个系统内属于 username 的文件,然后再加以删除吧!
如果该帐号只是【暂时不启用】的话,那么将 /etc/shadow 里头帐号失效日期 (第八字段) 设置为 0 就可以让该帐号无法使用,但是所有跟该帐号相关的数据都会留下来
用户功能
id username:查看账号信息
finger[-s-m] username:列出用户相关属性
chfn[-fopeh][账号名]:修改用户finger的数据(/etc/passwd的第五个栏位)
chsh[-ls]:-s修改shell,-l列出系统上可用shell
新增与删除用户
groupadd[-g GID][-r]用户组名称(增)
groupmod[-g GID][-n]用户组(改)
groupdel用户组(删)
linux磁盘管理
Linux 磁盘管理常用三个命令为 df、du 和 fdisk。
-
df(英文全称:disk full):列出文件系统的整体磁盘使用量
-
du(英文全称:disk used):检查磁盘空间使用量
-
fdisk:用于磁盘分区
df
df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
语法:
df [-ahikHTm] [目录或文件名]
选项与参数:
-
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-
-k :以 KBytes 的容量显示各文件系统;
-
-m :以 MBytes 的容量显示各文件系统;
-
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-
-H :以 M=1000K 取代 M=1024K 的进位方式;
-
-T :显示文件系统类型, 连同该分区 的文件系统名称 (例如 ext3) 也列出;
-
-i :不用硬盘容量,而以 inode 的数量来显示
du
Linux du 命令也是查看使用空间的,但是与 df 命令不同的是 Linux du 命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍 Linux du 命令。
语法:
du [-ahskm] 文件或目录名称
选项与参数:
-
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-
-h :以人们较易读的容量格式 (G/M) 显示;
-
-s :列出总量而已,而不列出每个各别的目录占用容量;
-
-S :不包括子目录下的总计,与 -s 有点差别。
-
-k :以 KBytes 列出容量显示;
-
-m :以 MBytes 列出容量显示;
磁盘挂载与卸除
Linux 的磁盘挂载使用 命令,卸载使用 命令。mountumount
磁盘挂载语法:
mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n] 装置文件名 挂载点
实例 1
用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面!
[root@www ~]# mkdir /mnt/hdc6 [root@www ~]# mount /dev/hdc6 /mnt/hdc6 [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on …中间省略… /dev/hdc6 1976312 42072 1833836 3% /mnt/hdc6
磁盘卸载命令 语法:umount
umount [-fn] 装置文件名或挂载点
选项与参数:
-
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-
-n :不升级 /etc/mtab 情况下卸除。
卸载/dev/hdc6
[root@www ~]# umount /dev/hdc6
ACL的使用
setfacl;设置某个目录/文件的ACL规范
getfacl:获取某个目录/文件的ACL设置选项
用户身份切换
su -c:仅执行一次root命令
sudo
visudo与/etc/sudoers(ALL代表任何身份,主机和命令)
1. “使用者帐号”:系统的哪个帐号可以使用 sudo 这个指令的意思;
2. “登陆者的来源主机名称”:当这个帐号由哪部主机连线到本 Linux 主机,意思是这个帐号 可能是由哪一部网络主机连线过来的, 这个设置值可以指定用户端计算机(信任的来源 的意思)。默认值 root 可来自任何一部网络主机 3. “(可切换的身份)”:这个帐号可以切换成什么身份来下达后续的指令,默认 root 可以 切换成任何人; 4. “可下达的指令”:可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。 默认 root 可以切换任何身份且进行任何指令之意。
利用 wheel 群组以及免密码的功能处理 visudo
重点是那个 NOPASSWD 啦!该关键字是免除密码输入的意思喔!
通过别名创建 visudo:
sudo 搭配 su 的使用方式:
创建一个 ADMINS 帐号别名
接下来,上述的 pro1, pro2, pro3, myuser1 这四个人,只要输入“ sudo su - ”并且输入“自己的 密码”后, 立刻变成 root 的身份。“这些你加入的使用者,全部都是你能够信任的用户!
PAM
…
Linux主机上的用户信息传递
查询使用者: w, who, last, lastlog
另外,如果您想要知道每个帐号的最近登陆的时间,则可以使用 lastlog 这个指令
使用者对谈: write, mesg, wall
如果 vbird1 这个人不想要接受任何讯息,直接下达这个动作
想重新启用 mesg y
查看目前musg状态就mesg
sudo apt-get install mailutils:安装mail
“ mail -s “邮件标题” username@localhost
可以先用 vi 将信件内容编好, 然后再以 mail -s “nice tomeet you” vbird1 < filename 来将文件内容传输即可。
例题:
请将你的主文件夹下的环境变量文件 (~/.bashrc) 寄给自己!
答:mail -s “bashrc file content” dmtsai < ~/.bashrc
例题:通过管线命令直接将 ls -al ~ 的内容传给 root 自己!
答:ls-al ~ | mail -s “myfile” root
Centos大量创建账号
#!/bin/bash
# This shell script will create amount of linux login accounts for you.
# 1\. check the "accountadd.txt" file exist? you must create that file manually.
# one account name one line in the "accountadd.txt" file.
# 2\. use openssl to create users password.
# 3\. User must change his password in his first login.
# 4\. more options check the following url:
# 0410accountmanager.html#manual_amount
# 2015/07/22 VBird export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# 0\. userinput usergroup=""
# if your account need secondary group, add here. pwmech="openssl"
# "openssl" or "account" is needed. homeperm="no"
# if "yes" then I will modify home dir permission to 711
# 1\. check the accountadd.txt file action="${1}"
# "create" is useradd and "delete" is userdel.
if [ ! -f accountadd.txt ];
then
echo "There is no accountadd.txt file, stop here."
exit 1
fi [ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt usernames=$(cat accountadd.txt)
for username in ${usernames}
do
case ${action} in "create") [ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp="" useradd ${usegrp} ${username} # 新增帐号
[ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -base64 6) || usepw=${username} echo ${usepw} | passwd --stdin ${username} # 创建密码
chage -d 0 ${username} # 强制登陆修改密码
[ "${homeperm}" == "yes" ] && chmod 711 /home/${username}
echo "username=${username}, password=${usepw}" >> outputpw.txt ;; "delete")
echo "deleting ${username}" userdel -r ${username} ;; *)
echo "Usage: $0 [create|delete]" ;; esac done
重点回顾
Linux 操作系统上面,关于帐号与群组,其实记录的是 UID/GID 的数字而已;
使用者的帐号/群组与 UID/GID 的对应,参考 /etc/passwd 及 /etc/group 两个文件 /etc/passwd 文件结构以冒号隔开,共分为七个字段,分别是“帐号名称、密码、UID、 GID、全名、主文件夹、shell” UID 只有 0 与非为 0 两种,非为 0 则为一般帐号。
一般帐号又分为系统帐号 (1~999) 及可登陆者帐号 (大于 1000) 帐号的密码已经移动到 /etc/shadow 文件中,该文件权限为仅有 root 可以更动。该文件 分为九个字段,内容为“ 帐号名称、加密密码、密码更动日期、密码最小可变动日期、密 码最大需变动日期、密码过期前警告日数、密码失效天数、 帐号失效日、保留未使用” 使用者可以支持多个群组,其中在新建文件时会影响新文件群组者,为有效群组。
而写 入 /etc/passwd 的第四个字段者, 称为初始群组。
与使用者创建、更改参数、删除有关的指令为:useradd, usermod, userdel等,密码创建 则为 passwd; 与群组创建、修改、删除有关的指令为:groupadd, groupmod, groupdel 等;
群组的观察与有效群组的切换分别为:groups 及 newgrp 指令;
useradd 指令作用参考的文件有: /etc/default/useradd, /etc/login.defs, /etc/skel/ 等等 观察使用者详细的密码参数,可以使用“ chage -l 帐号 ”来处理;
使用者自行修改参数的指令有: chsh, chfn 等,观察指令则有: id, finger 等 ACL 的功能需要文件系统有支持,CentOS 7 默认的 XFS 确实有支持 ACL 功能! ACL 可进行单一个人或群组的权限管理,但 ACL 的启动需要有文件系统的支持;
ACL 的设置可使用 setfacl ,查阅则使用 getfacl ;
身份切换可使用 su ,亦可使用 sudo ,但使用 sudo 者,必须先以 visudo 设置可使用的 指令;
PAM 模块可进行某些程序的验证程序!与 PAM 模块有关的配置文件位于 /etc/pam.d/ 及 /etc/security/ 系统上面帐号登陆情况的查询,可使用 w, who, last, lastlog 等; 线上与使用者交谈可使用 write, wall,离线状态下可使用 mail 传送邮件!
磁盘配额高级文件系统
软件磁盘阵列
硬件磁盘阵列的设备文件名为/dev/sd[a-p],使用SCSI模块
软件磁盘阵列使用的设备文件是系统的设备文件/dev/md0./dev/md1等
逻辑卷管理器
LVM>VG>LV>PE
计划任务
at:仅执行一次的计划任务
任务计划会被记录到/var/spool/at中
at 默认只能是root,可以利用文件(相反)
/etc/allow:写在这个文件中的用户才能使用at
/etc/at.deny:如果/etc/allow不存在就查这个文件,写在这个at.deny中的用户则不能使用 at
atq:查询at任务
atrm (jobnumber):删除jobnumber
batch:系统有空时才执行后台任务
uptime:查看负载
crontab:循环执行的计划任务
与at的配置一样在/cron中
例题:假若你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 发一封信给他,这封信 的内容已经写在 /home/dmtsai/lover.txt 内了,该如何进行?
答:直接下达 crontab -e 之后,编辑成为: > 59 23 1 5 * mail kiki < /home/dmtsai/lover.txt 那样的话,每年 kiki 都会收到你的这封信喔!(当然啰,信的内容就要每年变一变啦!)
例题:假如每五分钟需要执行 /home/dmtsai/test.sh 一次,又该如何?
答:同样使用 crontab-e 进入编辑: > */5 * * * * /home/dmtsai/test.sh
例题:假如你每星期六都与朋友有约,那么想要每个星期五下午 4:30 告诉你朋友星期六的约 会不要忘记,则:答:还是使用 crontab -e 啊! > 30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt
系统的配置文件: /etc/crontab, /etc/cron.d/*
重启crond服务: systemctl restart crond
如果你想要自己开发新的软件,该软件要拥有自己的 crontab 定时指令时,就可以将“分、 时、日、月、周、身份、指令”的配置文件放置到 /etc/cron.d/ 目录下! 在此目录下的文件 是“crontab 的配置文件脚本”。
个人化的行为使用“ crontab -e
系统维护管理使用“ vim /etc/crontab
自己开发软件使用“ vim /etc/cron.d/newfile
可唤醒停机期间的工作任务:anacron
天数:anacron 执行当下与时间戳记 (/var/spool/anacron/ 内的时间纪录档) 相差的天 数,若超过此天数,就准备开始执行,若没有超过此天数,则不予执行后续的指令。 延迟时间:若确定超过天数导致要执行调度工作了,那么请延迟执行的时间,因为担心 立即启动会有其他资源冲突的问题吧! 工作名称定义:这个没啥意义,就只是会在 /var/log/cron 里头记载该项任务的名称这 样!通常与后续的目录资源名称相同即可。 实际要进行的指令串:有没有跟 0hourly 很像啊!没错!相同的作法啊!通过 run-parts 来处理的!
但如果是放置在 /etc/cron.weekly/ 目录下,那么 该工作就会定期,几乎一定会在一周内执行一次~如果你关机超过一周,那么一开机后的数 个小时内,该工作就会主动的被执行喔
进程管理与SELinus初探
任务管理
[ctrl]+c 来终止
直接将指令丢到后台中“执行”的 &
将 /etc/ 整个备份成为 /tmp/etc.tar.gz 且不想要等待,那么可以这样做:
将“目前”的工作丢到后台中“暂停”:[ctrl]-z
暂时将vim丢到后台中等待
+ 代表最近一个被丢进背景的工作
观察目前的后台工作状态: jobs
其实 + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号 码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了
将背景工作拿到前台来处理:fg
fg %1 将第一号工作捉到前台后又放回后台
让工作在背景下的状态变成运行中: bg
kill -SIGTERM是根据kill -l中的别名代替
用 man 7 signal 去查阅相关数据
另外, kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字了
脱机管理
为 at 是将工作放置到系统背景, 而与终端机无关。如果不想要使用 at 的话,那你也可以尝试使用 nohup 这个指令来处理喔!这个 nohup 可以让你在离线或登出系统后,还能够让工作继续进行。他的语法有点像这样:
nohup 并不支持 bash 内置的指令,因此你的指令必须要是外部指令才行
如果你再次登陆的话,再使用 pstree 去查阅你的程序,会发现 sleep500.sh 还在执行中,并不会被中断掉
如果你想要让在背景的工作在你登出后还能够继续的执行,那么使用 nohup 搭配 & 是不错的运行情境
进程管理
利用静态的 ps 或者是动态的 top,还能以 pstree 来查阅程序树之间的关系
ps :将某个时间点的程序运行情况撷取下来
一个是只能查阅自己 bash 程序的“ps -l ”一个则是可以查阅所有系统运行的程序“ ps aux ”!注意,你没看错,是“ ps aux ”没有那 个减号 (-) !
仅观察自己的 bash 相关程序: ps -l
F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有: 若为 4 表示此程序的权限为 root ; 若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。 S:代表这个程序的状态 (STAT),主要的状态有: R (Running):该程序正在运行中; S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。 D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印) T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态; Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。 UID/PID/PPID:代表“此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号 码” C:代表 CPU 使用率,单位为百分比; PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先顺序,数值越小代表该 程序越快被 CPU 执行。详细的 PRI 与 NI 将在下一小节说明。 ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪 个部分,如果是个 running 的程序,一般就会显示“ - ” / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。 TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口 (pts/n); TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时 间; CMD:就是 command 的缩写,造成此程序的触发程序之指令为何。
观察系统所有程序: ps aux
现 ps -l 与 ps aux 显示的项目并不相同!
USER:该 process 属于那个使用者帐号的? PID :该 process 的程序识别码。 %CPU:该 process 使用掉的 CPU 资源百分比; %MEM:该 process 所占用的实体内存百分比; VSZ :该 process 使用掉的虚拟内存量 (KBytes) RSS :该 process 占用的固定的内存量 (KBytes) TTY :该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z) START:该 process 被触发启动的时间; TIME :该 process 实际使用 CPU 运行的时间。 COMMAND:该程序的实际指令为何?
范例四:列出类似程序树的程序显示:
其实还可以使用 pstree 来达成这个程序树喔!以上面的例子来看,鸟哥是通过 sshd 提供的网络服务取得一个程序, 该程序提供 bash 给我 使用,而我通过 bash 再去执行 ps axjf !这样可以看的懂了吗?其他各字段的意义请 man ps(虽然真的很难 man 的出来!) 啰
最后面接上代表僵尸进程(用reboot杀)
apache 8683 0.0 0.9 83384 9992 ? Z 14:33 0:00 /usr/sbin/httpd
top:动态观察程序的变化
第一行(top…):这一行显示的信息分别为: 目前的时间,亦即是 00:53:59 那个项目; 开机到目前为止所经过的时间,亦即是 up 6:07, 那个项目;
已经登陆系统的使用者人数,亦即是 3 users, 项目; 系统在 1, 5, 15 分钟的平均工作负载。我们在第十五章谈到的 batch 工作方式为负载 小于 0.8 就是这个负载啰!代表的是 1, 5, 15 分钟,系统平均要负责运行几个程序 (工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统程序是否太过 繁复了! 第二行(Tasks…):显示的是目前程序的总量与个别程序在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值,如果不是 0 !好好看看到底是那个 process 变成僵尸了吧? 第三行(%Cpus…):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注 意的是 wa 项目,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题 比较大!因此这里得要注意这个项目耗用 CPU 的资源喔! 另外,如果是多核心的设 备,可以按下数字键“1”来切换成不同 CPU 的负载率。 第四行与第五行:表示目前的实体内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重 申,要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的实体 内存实在不足! 第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。
至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是: PID :每个 process 的 ID 啦! USER:该 process 所属的使用者; PR :Priority 的简写,程序的优先执行顺序,越小越早被执行; NI :Nice 的简写,与 Priority 有关,也是越小越早被执行; %CPU:CPU 的使用率; %MEM:内存的使用率; TIME+:CPU 使用时间的累加;
如果你想要使用内存使用率排序,则 可以按下“M”, 若要回复则按下“P”即可(大写)。如果想要离开 top 则按下“ q ”吧!如果你想要将 top 的结果输出成为文件时, 可以这样做:
修改NI的值
在你完成上面的动作后,在状态列会出现如下的信息:
pstree
由 pstree 的输出我们也可以很清楚的知道,所有的程序都是依附在 systemd 这支程序下面 的! 仔细看一下,这支程序的 PID 是一号喔!因为他是由 Linux 核心所主动调用的第一支程 序!所以 PID 就是一号了。 这也是我们刚刚提到僵尸程序时有提到,为啥发生僵尸程序需要 重新开机? 因为 systemd 要重新启动,而重新启动 systemd 就是 reboot !
进程的管理
查看信号可以使用 kill -l(小写的 L ) 或者是 man 7 signal 都可以查询到
kill -signal PID
kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入 数字)。 要再次强调的是: kill 后面直接加数字与加上 %number 的情况是不同的! 这个很 重要喔!因为工作控制中有 1 号工作,但是 PID 1 号则是专指“ systemd ”这支程序!你怎么 可以将 systemd 关闭呢? 关闭 systemd ,你的系统就当掉了啊!所以记得那个 % 是专门用 在工作控制的喔
例题:以 ps 找出 rsyslogd 这个程序的 PID 后,再使用 kill 传送讯息,使得 rsyslogd 可以重 新读取配置文件。答:由于需要重新读取配置文件,因此 signal 是 1 号。至于找出 rsyslogd 的 PID 可以是这样做: > ps aux | grep ‘rsyslogd’ | grep -v ‘grep’| awk ‘{print $2}’ 接下来则是实际使用 kill -1 PID,因此,整串指令会是这样: > kill -SIGHUP $(ps aux | grep ‘rsyslogd’ | grep -v ‘grep’| awk ‘{print $2}’) 如果要确认有没有重新启动 syslog ,可以参考登录文件的内容,使用如下指令查阅: > tail -5 /var/log/messages
如果你有看到类似“Aug 5 01:25:02 study rsyslogd: [origin software=“rsyslogd” swVersion=“7.4.7” x-pid=“742” x-info=“http://www.rsyslog.com”] rsyslogd was HUPed”之类的 字样,就是表示 rsyslogd 在 8/5 有重新启动 (restart) 过了!
如果未来你想要将某个莫名其妙的登陆者的连线删除的话,就可以通过使用 pstree -p 找到相关程序, 然后再以 kill -9 将该程序删除,该条连线就会被踢掉了
killall -signal 指令名称
总之,要删除某个程序,我们可以使用 PID 或者是启动该程序的指令名称, 而如果要删除某 个服务呢?呵呵!最简单的方法就是利用 killall , 因为他可以将系统当中所有以某个指令名 称启动的程序全部删除
查看系统资源信息
free :观察内存使用情况
Mem 那一行显示的是实体内存的量,Swap 则是内存交换空间的量。 total 是总量, used 是已被使用的量, free 则是剩余可用的量
cat /proc/version:查看系统版本及环境
uname:查阅系统与核心相关信息
我的 Linux 主机使用的核心名称为Linux,而主机名称为 study.centos.vbird,核心的版本为 3.10.0-229.el7.x86_64 ,该核心版本创建的日期为 2015-3-6,适用的硬件平台为 x86_64 以上等级的硬件平台
uptime:观察系统启动时间与工作负载
Proto :网络的封包协定,主要分为 TCP 与 UDP 封包,相关数据请参考服务器篇;
Recv-Q:非由使用者程序链接到此 socket 的复制的总 Bytes 数;
Send-Q:非由远端主机传送过来的 acknowledged 总 Bytes 数;
Local Address :本地端的 IP:port 情况
Foreign Address:远端主机的 IP:port 情况
State :连线状态,主要有创建(ESTABLISED)及监听(LISTEN)
Proto :一般就是 unix 啦;
RefCnt:连接到此 socket 的程序数量;
Flags :连线的旗标;
Type :socket 存取的类型。主要有确认连线的 STREAM 与不需确认的 DGRAM 两种;
State :若为 CONNECTED 表示多个程序之间已经连线创建。
Path :连接到此 socket 的相关程序的路径!或者是相关数据输出的路径。
dmesg :分析核心产生的讯息
vmstat :侦测系统资源变化
程序字段 (procs) 的项目分别为:
r :等待运行中的程序数量;
b:不可被唤醒的程序数量。这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多程序就无法被执行或一直在等待而无法被唤醒之故)。
内存字段 (memory) 项目分别为:
swpd:虚拟内存被使用的容量;
free:未被使用的内存容量;
buff:用于缓冲内存;
cache:用于高速缓存内存。 这部份则与 free 是相同的。
内存交换空间 (swap) 的项目分别为:
si:由磁盘中将程序取出的量;
so:由于内存不足而将没用到的程序写入到磁盘的 swap 的容量。 如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与内存之间传来传去,系统性能会很差!
磁盘读写 (io) 的项目分别为:
bi:由磁盘读入的区块数量;
bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌!
系统 (system) 的项目分别为:
in:每秒被中断的程序次数;
cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与周边设备的沟通非常频繁! 这些周边设备当然包括磁盘、网卡、时间钟等。
CPU 的项目分别为:
us:非核心层的 CPU 使用状态;
sy:核心层所使用的 CPU 状态;
id:闲置的状态;
wa:等待 I/O 所耗费的 CPU 状态;
st:被虚拟机 (virtualmachine) 所盗用的 CPU 使用状态 (2.6.11 以后才支持)。
认识系统服务
通过 systemctl 管理服务
通过 systemctl 管理单一服务 (service unit) 的启动/开机启动与观察状态
active (running):正有一只或多只程序正在系统中执行的意思,举例来说,正在执行中的 vsftpd 就是这种模式。
active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行
active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来说,打印的伫列相关服务就是这种状态! 虽然正在启动中,不过,也需要真的有伫列进来 (打印工作) 这样他才会继续唤醒打印机服务来进行下一步打印的功能。
inactive:这个服务目前没有运行的意思。
enabled:这个 daemon 将在开机时被执行
disabled:这个 daemon 在开机时不会被执行
static:这个 daemon 不可以自己启动 (enable 不可),不过可能会被其他的 enabled的服务来唤醒 (相依属性的服务)
mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。可通过systemctl unmask 方式改回原本状态
强迫服务注销 (mask) 的练习
那如何取消注销呢?当然就是 unmask 即可啊!
认识与分析日志文件
=========
Linux 常见的登录文件文件名:(需root权限)
/var/log/boot.log: 开机的时候系统核心会去侦测与启动硬件,接下来开始各种核心支持的功能启动等。这些流程都会记录在 /var/log/boot.log 里面哩! 不过这个文件只会存在这次开机启动的信息,前次开机的信息并不会被保留下来!
/var/log/cron: 还记得第十五章例行性工作调度吧?你的 crontab 调度有没有实际被进行? 进行过程有没有发生错误?你的 /etc/crontab 是否撰写正确?在这个登录文件内查询看看。
/var/log/dmesg: 记录系统在开机的时候核心侦测过程所产生的各项信息。由于 CentOS默认将开机时核心的硬件侦测过程取消显示, 因此额外将数据记录一份在这个文件中;
/var/log/lastlog: 可以记录系统上面所有的帐号最近一次登陆系统时的相关信息。第十三章讲到的 lastlog 指令就是利用这个文件的记录信息来显示的。
/var/log/maillog 或 /var/log/mail/*: 记录邮件的往来信息,其实主要是记录 postfix(SMTP 协定提供者) 与 dovecot (POP3 协定提供者) 所产生的讯息啦。 SMTP 是发信所使用的通讯协定, POP3 则是收信使用的通讯协定。 postfix 与 dovecot 则分别是两套达成通讯协定的软件。
/var/log/messages: 这个文件相当的重要,几乎系统发生的错误讯息 (或者是重要的信息) 都会记录在这个文件中; 如果系统发生莫名的错误时,这个文件是一定要查阅的登录文件之一。
/var/log/secure: 基本上,只要牵涉到“需要输入帐号密码”的软件,那么当登陆时 (不管登陆正确或错误) 都会被记录在此文件中。 包括系统的 login 程序、图形接口登陆所使用的 gdm 程序、 su, sudo 等程序、还有网络连线的 ssh, telnet 等程序, 登陆信息都会被记载在这里;
/var/log/wtmp, /var/log/faillog: 这两个文件可以记录正确登陆系统者的帐号信息(wtmp) 与错误登陆时所使用的帐号信息 (faillog) ! 我们在第十章谈到的 last 就是读取 wtmp 来显示的, 这对于追踪一般帐号者的使用行为很有帮助!
/var/log/httpd/, /var/log/samba/: 不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项讯息!上述的目录内则是个别服务所制订的登录文件。
记录日志文件的服务
. :代表“比后面还要严重的等级 (含该等级) 都被记录下来”的意思,例如: mail.info代表只要是 mail 的信息,而且该信息等级严重于 info (含 info 本身)时,就会被记录下来的意思。
.=:代表所需要的等级就是后面接的等级而已, 其他的不要!
.!:代表不等于, 亦即是除了该等级外的其他等级都记录。
例题:
我的 messages 这个文件需要记录所有的信息,但是就是不想要记录 cron, mail 及news 的信息,那么应该怎么写才好?
答:可以有两种写法,分别是:> .;news,cron,mail.none /var/log/message
>.;news.none;cron.none;mail.none /var/log/messages
使用“,”分隔时,那么等级只要接在最后一个即可,如果是以“;”来分的话, 那么就需要将服务与等级都写上去啰!这样会设置了吧!
CentOS 7.x 默认的 rsyslog.conf 内容
1. #kern.*:只要是核心产生的讯息,全部都送到 console(终端机) 去。console 通常是由外部设备连接到系统而来, 举例来说,很多封闭型主机 (没有键盘、屏幕的系统) 可以通过连接 RS232 连接口将讯息传输到外部的系统中, 例如以笔记本电脑连接到封闭主机的 RS232 插口。这个项目通常应该是用在系统出现严重问题而无法使用默认的屏幕观察系统时, 可以通过这个项目来连接取得核心的讯息。
2. *.info;mail.none;authpriv.none;cron.none:由于 mail, authpriv, cron 等类别产生的讯息较多, 且已经写入下面的数个文件中,因此在 /var/log/messages 里面就不记录这些项目。除此之外的其他讯息都写入 /var/log/messages 中。这也是为啥我们说这个messages 文件很重要的缘故!
3. authpriv.*:认证方面的讯息均写入 /var/log/secure 文件;
4. mail.*:邮件方面的讯息则均写入 /var/log/maillog 文件;
5. cron.*:例行性工作调度均写入 /var/log/cron 文件;
6. *.emerg:当产生最严重的错误等级时,将该等级的讯息以 wall 的方式广播给所有在系统登陆的帐号得知, 要这么做的原因是希望在线的使用者能够赶紧通知系统管理员来处理这么可怕的错误问题。
7. uucp,news.crit:uucp 是早期 Unix-like 系统进行数据传递的通讯协定,后来常用在新闻群组的用途中。 news 则是新闻群组。当新闻群组方面的信息有严重错误时就写入/var/log/spooler 文件中;
8. local7.*:将本机开机时应该显示到屏幕的讯息写入到 /var/log/boot.log 文件中;
在上面的第四行关于 mail 的记录中,在记录的文件 /var/log/maillog 前面还有个减号“ - ”是干嘛用的?由于邮件所产生的讯息比较多,因此我们希望邮件产生的讯息先储存在速度较快的内存中 (buffer) ,等到数据量够大了才一次性的将所有数据都填入磁盘内,这样将有助于登录文件的存取性能。 只不过由于讯息是暂存在内存内,因此若不正常关机导致登录信息未回填到登录文件中,可能会造成部分数据的遗失。
自行增加登录文件文件功能
千万别给他记录在/etc/rsyslog.conf 当中,方便你的管理
如果你想要让“所有的信息”都额外写入到/var/log/admin.log 这个文件时, 你可以怎么作呢?
# 1\. 先设置好所要创建的文件设置! [root@study ~]# vim /etc/rsyslog.conf # Add by VBird 2015/08/19 <==再次强调,自己修改的时候加入一些说明 *.info /var/log/admin.log <==有用的是这行啦! # 2\. 重新启动 rsyslogd 呢! [root@study ~]# systemctl restart rsyslog.service [root@study ~]# ll /var/log/admin.log -rw-r–r–. 1 root root 325 Aug 20 00:54 /var/log/admin.log # 瞧吧!创建了这个登录文件出现啰!
登录文件的安全性设置
如果日志文件无法记录
重新启动 rsyslog.service 让他再继续提供服务才行喔
加入了这个属性之后,你的 /var/log/admin.log 登录文件从此就仅能被增加,而不能被删除,直到 root 以“ chattr -a /var/log/admin.log ”取消这个 a 的参数之后,才能被删除或移动喔
让某一部主机当成 “登录文件服务器”,用他来记录所有的十部 linux 主机的信息
服务器会启动监听的端口,用户端则将登录文件再转出一份送到服务器去。 而既然是登录文件“服务器”,所以当然有服务器与用户端 (client)
至于 client 端的设置就简单多了!只要指定某个信息传送到这部主机即可! 举例来说,我们的登录文件服务器 IP 为 192.168.1.100 ,而 client 端希望所有的数据都送给主机, 所以,可以在 /etc/rsyslog.conf 里面新增这样的一行:
使用 journalctl 观察登录信息
检测操作,了解到登录文件的实时变化,用两个终端实验
[crtl]+c 关闭journalctl -f
启动流程,模块管理与Loader
nit 0 systemctl poweroff
init 1 systemctl rescue
init [234] systemctl isolate multi-user.target
init 5 systemctl isolate graphical.target
init 6 systemctl reboot
depmod 创建文件需求
我们的 kernel 核心模块扩展名一定是 .ko 结尾的, 当你使用 depmod之后,该程序会跑到模块标准放置目录 /lib/modules/$(uname -r)/kernel , 并依据相关目录的定义将全部的模块捉出来分析,最终才将分析的结果写入 modules.dep 文件中的呐! 这个文件很重要喔。(和modprobe有关)
查看内核模块
lsmod 查看内核载入多少模块
模块内容包括有:
1.模块名称(Module);
2.模块的大小(size);
3.此模块是否被其他模块所使用 (Used by)。
modinfo 除了可以“查阅在核心内的模块”之外,还可以检查“某个模块文件”, 因此,如果你想要知道某个文件代表的意义为何,利用 modinfo 加上完整文件名
自行手动载入模块modprobe
是因为 modprobe 会主动的去搜寻 modules.dep的内容,先克服了模块的相依性后, 才决定需要载入的模块有哪些,很方便。至于 insmod则完全由使用者自行载入一个完整文件名的模块, 并不会主动的分析模块相依性。
insmod 立刻就将该模块载入啰~但是 insmod 后面接的模块必须要是完整的“文件名”才行!
使用 modprobe 真的是要比 insmod 方便很多!因为他是直接去搜寻 modules.dep 的纪录
rmmod 删除模块
尝试使用 modprobe 载入 cifs 这个模块,并且观察该模块的相关模块是哪个?答:我们使用 modprobe 来载入,再以 lsmod 来观察与 grep 撷取关键字看看:
备份要点
/etc
/home
/root
/var/spool/mail/,
/var/spool/cron/,
/var/spool/at//var/lib/
make用法
main: main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o -lm
makefile 的基本语法与变量
标的(target): 目标文件1 目标文件2
gcc -o 欲创建的可执行文件 目标文件1 目标文件2
命令列必须要以 tab 按键作为开头”才行!他的规则基本上是这样的:
在 makefile 当中的 # 代表注解;
需要在命令行 (例如 gcc 这个编译器指令) 的第一个字符;
目标 (target) 与相依文件(就是目标文件)之间需以“:”隔开。
# 1\. 先编辑 makefile 来创建新的规则,此规则的标的名称为 clean : [root@study ~]# vi makefilemain: main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o -lm clean :rm -f main main.o haha.o sin_value.o cos_value.o # 2\. 以新的标的 (clean) 测试看看执行 make 的结果: [root@study ~]# make clean <==就是这里!通过 make 以 clean 为标的 rm -rf main main.o haha.o sin_value.o cos_value.o
如果我们想要创建 main 的话,输入“make main”,如果想要清除有的没的,输入“make clean”即可啊!而如果想要先清除目标文件再编译 main 这个程序的话,就可以这样输入:“make cleanmain”,如下所示:
1. 变量与变量内容以“=”隔开,同时两边可以具有空格;
2. 变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
3. 变量与变量内容在“=”两边不能具有“:”;
4. 在习惯上,变量最好是以“大写字母”为主;
5. 运用变量时,以 ${变量} 或 $(变量) 使用;
6. 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
7. 在命令行界面也可以给予变量。
软件安装RPM,SRPM与YUM
================
rpm安装
RPM 升级与更新 (upgrade/freshen)
RPM 查询 (query)
1. 我想要知道我的系统当中,以 c 开头的软件有几个,如何实做?
2. 我的 WWW 服务器为 Apache ,我知道他使用的 RPM 软件文件名为 httpd 。现在,我想要知道这个软件的所有配置文件放置在何处,可以怎么作?
3. 承上题,如果查出来的设置文件已经被我改过,但是我忘记了曾经修改过哪些地方,所以想要直接重新安装一次该软件,该如何作?
4. 如果我误砍了某个重要文件,例如 /etc/crontab,偏偏不晓得他属于哪一个软件,该怎么办?
答:
1. rpm -qa | grep ^c | wc -l
2. rpm -qc httpd
3. 假设该软件在网络上的网址为: http://web.site.name/path/httpd-x.x.xx.i386.rpm 则我可以这样做: rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm --replacepkgs
4. 虽然已经没有这个文件了,不过没有关系,因为 RPM 有记录在 /var/lib/rpm 当中的数据库啊!所以直接下达: rpm -qf /etc/crontab 就可以知道是那个软件啰!重新安装一次该软件即可!
RPM 验证与数码签章 (Verify/signature)
S :(file Size differs) 文件的容量大小是否被改变
M :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可执行等参数已被改变
5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
pm]( ) 则我可以这样做: rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm --replacepkgs
4. 虽然已经没有这个文件了,不过没有关系,因为 RPM 有记录在 /var/lib/rpm 当中的数据库啊!所以直接下达: rpm -qf /etc/crontab 就可以知道是那个软件啰!重新安装一次该软件即可!
RPM 验证与数码签章 (Verify/signature)
S :(file Size differs) 文件的容量大小是否被改变
M :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可执行等参数已被改变
5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
[外链图片转存中…(img-4rm4vC6I-1715288173228)]
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!