一、touch命令
二、systemctl
1、介绍
2、常用命令
三、rpm命令
1、介绍
2、相关命令
四、 Linux chkconfig系统服务管理命令
1、介绍
2、运行级别(0-6)
3、相关命令及含义
4、如何增加一个脚本服务
5、其它
五、Linux怎么设置开机自启动
六、防火墙
1、介绍
2、4 个表和 5 个链
3、相关命令
七、chpasswd命令
八、/etc/shadow与/etc/passwd两个文件
九、Linux之chattr命令
十一、lsattr命令
十二、sed命令
1、介绍
2、选项参数
3、sed -i 常见用法
十三、grep命令
1、介绍
2、命令
十四、/etc目录
十五、/var目录
1、介绍
2、目录介绍
十六、linux下如何查看某软件是否已安装
十七、关于cloud-init
1、介绍
2、案例
3、安装
十八、systemd
1、介绍
2、sysvinit
3、upstart
4、主角 systemd 登场
5、target 和运行级别
十九、unit(单元)
二十、Selinux
二十一、BIOS
1、介绍
2、BIOS的引导过程
3、BIOS与Bootloader的区别
二十二、BootLoader
1、介绍
2、常用的BootLoader
3、BootLoader基本原理
Linux touch命令不仅可以用于在Linux上创建空文件。 您可以使用它来更改现有文件的时间戳,包括其访问权限和修改时间。
Linux 服务管理两种方式service和systemctl
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。
systemd对应的进程管理命令是systemctl。
systemctl命令兼容了service,即systemctl也会去/etc/init.d目录下,查看,执行相关程序
1、列出系统所有服务(---空格翻页 q推出):systemctl list-units --all --type=service
2、查看服务的状态:systemctl status firstrun
这个平常看进程比较实用:会列出有没有正在执行、开机时是否启动等信息
Loaded:可以看进程是否被运行了
Active:看下当前服务的状态,inactive (dead)说明已经运行结束了或者说被kill了
Process:可以看到运行的时候的进程号,运行的结果是成功还是失败,下面是code=exited, status=0/SUCCESS,说明运行成功了并已经退出了,0说明运行成功了。非0是运行失败。
Main PID:这个和Process差不多。
3、查看服务有没有正在运行中:systemctl is-active firstrun。
一般脚本中需要做简单的判断,会使用这个命令。
4、设置firstrun服务开机自启动:systemctl enable firstrun
5、查看firstrun服务是否为开机自启动:systemctl is-enabled firstrun
如下返回:enabled
6、停用开机自启动服务:systemctl disable firstrun
7、启动firstrun服务:systemctl start firstrun
8、停止firstrun服务:systemctl stop firstrun
9、重启firstrun服务:systemctl restart firstrun
10、只重启正在运行中的服务:systemctl try-restart 服务名
11、查看启动失败的服务列表:systemctl --failed
12、查看启动成功的服务列表:systemctl list-unit-files|grep enabled
13、查看firstrun服务的运行配置:systemctl show firstrun
14、不关闭firstrun服务的情况下,重新载入配置文件,让设置生效:systemctl reload firstrun
rpm前:
Linux的早期时代(也许吧?我猜的。也可能是Unix。),想要在系统上安装一款应用程序,是比较复杂的。需要专业的人员自行获取程序的源代码,并且编译安装,这是非常的复杂且需要一定的专业功底的,这种方式叫做源码编译安装(后面会描述)。
rpm出现:
再后来就有人/组织将这个过程简化了,他们将事先已经编译好的软件打包后,放到互联网上供用户下载。用户下载适用于自己的操作系统和硬件平台的软件包之后,只需要将其“解压”,那么该软件包所包含的各种文件(二进制程序文件、文档文件、库文件和配置文件等)就会基于包作者事先定义好的位置进入各自对应的目录下了。在CentOS上,这种打包工具就叫做rpm,即rpm安装。
rpm缺陷:
但是这种工具又存在一个缺陷,那就是它无法自动解决RPM包之间的依赖性。
假设安装A包需要依赖于B包,安装B包又要依赖于C包。
A --> B --> C
当你安装A包的时候提示你要安装B包,你安装B包的时候又提示你要安装C包,它无法自动去解决这个依赖关系。并且你还要自己去下载被依赖的B包和C包。
补充:之后又出现了YUM解决了rpm包依赖安装问题。
在不同的Linux发行版中,这种软件包的组织形式有点不同,见下表:
正好在梳理镜像制作的时候遇到报错,顺便看下rpm相关命令。
以下可知,包安装的时候冲突了。所以需要卸载掉已经安装的,卸载前需要先查询。
-i:安装软件包
-U:升级指定的套件档。
--nodeps:不验证软件包的依赖 -
-v:可视化,提供更多的详细信息的输出
-h:显示安装进度 另外的常用的附带参数为:
--force:强制安装,即使覆盖其他包的文件也要安装
-a:查询所有已经安装的软件包
-f 查询 文件所属于的软件包
-q:查询软件包(通常用来看下还未安装的软件包)
-l 显示软件包的文件列表
-d 显示被标注为文档的文件列表
-c 显示被标注为配置文件的文件列表 最后这两个用的很少了
Linux chkconfig 命令用于检查,设置系统的各种服务。
这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。
谨记:chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。
简单地说,比如你安装了mysql,并且你把启动的脚本放在了/etc/rc.d/init.d目录下,有时候你需要开机自动启动它(比如在多用户情况下),而有时候则不需要(比如在单用户情况下),因此,就可以使用chkconfig命令来进行控制,这个命令就相当于一个开关,不过这个开关有7个档,表示在不同级别下的运行状态是on还是off。
chkconfig 实际上是通过改变七个不同运行等级目录 /etc/rc[0-6].d 中服务脚本的符号链接,来设置操作系统在每一个运行等级中会执行哪些系统服务。chkconfig 不是用于立即启动或停止某一个服务,这一点与 service 不同。
运行级别的原理:
(1)在目录 /etc/rc.d/init.d 下有许多服务管理脚本,每个服务被称为 service;
(2)在 /etc/rc.d 下有 7 个名为 rcN.d 的目录,对应系统的 7 个运行级别;
(3)rcN.d 目录下都是一些符号链接文件,这些链接文件都指向 init.d 目录下的 service 脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中 nn 为两位数字。
(4)系统会根据指定的运行级别进入对应的 rcN.d 目录,并按照文件名顺序检索目录下的链接文件:
对于以 K 开头的文件,系统将终止对应的服务
对于以 S 开头的文件,系统将启动对应的服务
如下可知,会有不同运行级别的rc#.d目录。
chkconfig在没有参数运行时,会默认显示所有服务;如果加上服务名,并在服务名后面指定了on,off或者reset,那么chkconfig会改变指定服务的启动信息。
每个被chkconfig 管理的服务需要在对应的/etc/rc.d/init.d下的脚本加上两行或者更多行的注释。
第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 – 代替运行级。
第二行对服务进行描述,可以用\ 跨行注释。
例如,mysqld.init 包含的代码:
# chkconfig: 345 64 36
# description: MySQL database server.
# processname: mysqld
表明 mysqld 脚本应该在运行级 3, 4, 5 启动,启动优先权为64,停止优先权为 36。
Linux操作系统将操作环境分为以下七个层次,即:
Linux中有很多运行级别,常见的有2、3、4、5级多用户。很多人都知道5是运行X-Windows的级别,0代表关机。操作级别的改变可以通过init命令进行切换。例如,如果您想将系统保持在单用户状态,可以使用init1进行切换。在切换Linux运行级别的过程中,系统会自动在目录/etc/rc[0-6]中找到k和s开头的文件。d对应的运行级别,并按照下面的数字顺序执行这些脚本。维护这些脚本是一项乏味的任务。Linux提供chkconfig命令来更新和查询不同运行级别的系统服务。
chkconfig --list :列出所有的系统服务,以及这些服务在运行级别0到6中已被启动(on)还是停止(off)。
chkconfig telnet on:将telnet 配置为在每次系统启动时启动。设定telnet在各等级为on,“各等级”包括2、3、4、5等级
停止防火墙:service iptables stop
设置防火墙开机不自动启动:chkconfig iptables off
chkconfig telnet off:关闭服务
chkconfig --add httpd:增加httpd服务
chkconfig –-del httpd:删除httpd服务
1.创建脚本/root/test-service.sh
vi /root/test-service.sh
echo "test-service"
添加可执行权限
chmod +x /root/test-service.sh
2.脚本服务必须存放在/etc/ini.d/目录下,比如 test-service
vi /etc/init.d/test-service
#!/bin/bash
#chkconfig: 35 100 01
##description: 测试服务添加
/bin/bash /root/test-service.sh >/dev/null 2>/dev/null
3.添加可执行权限
chmod +x /etc/init.d/test-service
4.添加服务
chkconfig --add test-service
5.查看服务
chkconfig --list inotify-log
修改服务的默认启动等级:chkconfig --level 345 haoCodingService on
linux设置开机自启动的方法:
1、在“/etc/init.d”目录下添加自启动脚本(Service管理)。
/etc/init.d
是符号链接文件,实际上是链接到目录 /etc/rc.d/init.d
service管理是一种传统方式,即在/etc/rc.d/init.d下写脚本是一种老的方式,当前比较新的方式是systemctl,即在如下目录写脚本:/etc/systemd/system/multi-user.target.wants。
2、在“/etc/rc.local”文件中添加自启动命令“/usr/./hello.sh”或“cd /opt && ./hello.sh”。
3、将脚本放入:/etc/systemd/system/multi-user.target.wants(systemctl管理)
我们进入/etc/systemd/system/multi-user.target.wants看下:看到了很多我们熟悉的服务,这些服务都是开机自动启动。
参考:linux中/etc/rc.local脚本和init.d中脚本的区别_modi000的博客-CSDN博客_/etc/rc.local的作用
iptables 是 Linux 防火墙系统的重要组成部分,iptables 的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者由该设备转发、路由时,都可以使用 iptables 进行控制。
iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则。
Linux默认不会启动防火墙,可以运行iptables查看当前防火墙的状态。
如下说明安装了防火墙,但是服务被关了。
[root@localhost ~]# /etc/rc.d/init.d/iptables status
Firewall is stopped.
如下说明没有配置防火墙(注意,是没有配置,不能说明没有安装),/etc/rc.d/init.d/iptables可能不存在,如下就说明没有配置。
查看是否安装了防火墙程序(和是否配置无关):如下说明安装了
iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。
“四表”是指 iptables 的功能,默认的 iptables规则表有 filter 表(过滤规则表)、nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表):
“五链”是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则需要写入到这些具体的数据链中。
使用 iptables 命令可以对具体的规则进行查看、添加、修改和删除
查看防火墙:iptables -nvL
各参数的含义为:
-L 表示查看当前表的所有规则,默认查看的是 filter 表,如果要查看 nat 表,可以加上 -t nat 参数。
-n 表示不对 IP 地址进行反查,加上这个参数显示速度将会加快。
-v 表示输出详细信息,包含通过该规则的数据包数量、总字节数以及相应的网络接口。
防火墙默认会阻止绝大部分端口号的访问,在实际生产环境下,运维工程师需要为服务器设置详细的访问规则。在练习过程中,我们为了方便建议把防火墙直接关闭。由于防火墙服务默认开机自动启动,所以除了停止服务,还要设置为开机不自动启动。
服务名:iptables
停止防火墙:service iptables stop
设置开机不自动启动:chkconfig iptables off
ACL(访问控制列表)和防火墙都执行过滤流量的功能,那么他们的区别是什么呢?
首先防火墙是一个独立功能(可以是专有硬件也可以是安装在通用服务器上的软件),而ACL是路由器或三层网络设备上的功能。
防火墙通过跟踪记录流量的状态,检查数据包,可对数据包执行至7层(应用层)探测;
ACL对数据包逐包执行无状态检查,检查端口和协议内容(4层)。
看这个命令,其实就是change password,顾名思义,就是更新密码。
chpasswd命令是批量更新用户口令的工具,是把一个文件内容重新定向添加到/etc/shadow中。
chpasswd命令从系统的标准输入读入用户的名称和口令,并利用这些信息来更新系统上已存在的用户的口令.
# see VM root password, encoded
yum install -y bc
passwd=`dc -e xxx`
echo "root:$passwd" | chpasswd
/etc/passwd 是用户数据库,包含了用户名、加密口令和用户的其他信息,是Linux/UNIX安全的关键文件之一,用于用户登录时校验,应仅对root可写。
由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。 有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。
shadow文件的内容如下:
[root@localhost ~]# cat /etc/shadow
root:$6$HRSr9B6Y.poElQwj$fZMVlWB7tJMv.GWr8wQKhO7ZBKALjf/MErS9BWaTpWO/DNDVIl2Eo5bjHp/PtLmrSwm4u4a0dZRNIiQ4GbxN8/::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
lp:*:17110:0:99999:7:::
sync:*:17110:0:99999:7:::
shutdown:*:17110:0:99999:7:::
halt:*:17110:0:99999:7:::
mail:*:17110:0:99999:7:::
operator:*:17110:0:99999:7:::
games:*:17110:0:99999:7:::
ftp:*:17110:0:99999:7:::
nobody:*:17110:0:99999:7:::
systemd-bus-proxy:!!:18366::::::
systemd-network:!!:18366::::::
dbus:!!:18366::::::
polkitd:!!:18366::::::
tss:!!:18366::::::
postfix:!!:18366::::::
sshd:!!:18366::::::
它的文件格式与/etc/passwd类似,由9个字段组成,字段之间用”:”隔开。
这些字段是:账号名称:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不修改密码时间:失效时间:标志
1、登录名(账号名称):是与/etc/passwd文件中的登录名相一致的用户账号。
2、加密口令(密码)
这个字段内的数据是账号的真正密码,且是经过编码的。虽然加密后的密码很难被破解出来,但还是有可能被破解的。所以这个的文件权限预设为-rw-------或----------,只有root账号才能读写该文件。由于各种密码的编码技术不一样,因此不同的编码系统会造成这个字段的长度不同。由于固定的编码系统产生的密码长度必须一致,因此当该字段的长度被改变后,密码就会失效,通过在该字段前加上*或!改变密码长度,可以让密码失效。
3、最后一次修改时间
“最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改密码时的天数。时间起点对不同的系统可能不一样。大部分操作系统中,这个时间起点是1970年1月1日。
4、最小时间间隔:指的是两次修改密码之间所需的最小天数,表示账号密码在被修改之后至少经过几天后才能被修改。
5、最大时间间隔:指的是口令保持有效的最大天数,表示在修改密码之后,最多要在几天之内修改一次密码,如果不修改,则账号密码就会过期。
6、警告时间:表示的是从系统开始警告用户到用户密码正式失效之间的天数。在这段时间内,系统会发送警告信息给对应用户,告诉用户还有n天密码就要失效。
7、不修改密码时间:表示的是用户密码过期后,允许不修改密码的天数。在这期间,用户任然可以用对应账号登录系统,但登录后,系统会强制要求你必须重新设定密码才能继续使用。如果过了期限还没更改密码,则密码彻底失效,该账号再也无法用该密码来登录。
8、失效时间:给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
9、标志:该字段被保留,暂无任何内容,以便之后可能加入新字段信息。
Linux文件保护禁止修改、删除、移动文件等,使用chattr +i保护文件不被修改。
如chattr +i /etc/resolv.conf,设置/etc/resolv.conf文件不允许修改。如下说明文件已经有i属性,即不可修改
我们修改/etc/resolv.conf文件验证下:报错,提示不能修改,说明确实有保护作用。
+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。
A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
S:硬盘I/O同步选项,功能类似sync。
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文 件安全,只有root才能设定这个属性。
c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
d:即no dump,设定文件不能成为dump程序的备份目标。
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
j:即journal,设定此参数使得当通过 mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
s:保密性地删除文件或目录,即硬盘空间被全部收回。
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion.
各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。
案例:
[root@80uncle /]# chattr +i /etc/passwd
[root@80uncle /]# chattr +i /etc/shadow
[root@80uncle /]# chattr +i /etc/group
[root@80uncle /]# chattr +i /etc/gshadow
Linux lsattr命令用于显示文件属性。
用chattr执行改变文件或目录的属性,可执行lsattr指令查询其属性。
比如/etc/resolv.conf 这个文件设置为不可修改:chattr +i /etc/resolv.conf,想看看是否有生效:lsattr /etc/resolv.conf,结果如下:
可见已经生效了。
一般文件属性:可以看到是没有i属性的。
sed修改文件中的内容。
sed是一种流编辑器,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等。
sed -i function
-i :直接修改读取的文件内容,而不是输出到终端(危险动作)。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
替换操作:s命令
全面替换:g,使用后缀 /g 标记会替换每一行中的所有匹配。
1、
2、附加g选项告诉sed执行全局替换:sed -i 's/原字符串/新字符串/g' /app/filename
对所有文件的某个字符串进行替换:
sed -i "s/要查找的文本/替换后的文本/g" `grep -rl "要查找的文本" ./`
解释:
grep -rl "要查找的文本" ./:查找到包含关键字的所有文件名
sed -i "s/要查找的文本/替换后的文本/g" `grep -rl "要查找的文本" ./`:对所有找到的文件名
1.批量查找某个目录下包含待查找内容的行并显示查找内容在所在文件中的行号,例如:
grep -rn "要查找的文本" ./
2.批量查找并替换当前目录下的文件内容
sed -i "s/要查找的文本/替换后的文本/g" `grep -rl "要查找的文本" ./`
解释:
grep -rl "要查找的文本" ./:查找到包含关键字的所有文件名
sed -i "s/要查找的文本/替换后的文本/g" `grep -rl "要查找的文本" ./`:对所有找到的文件名 进行关键字的替换。
3.批量查找并替换任意目录下的文件内容。
sed -i "s/要查找的文本/替换后的文本/g" `grep -rl "要查找的文本" /任意目录`
之前熟悉grep主要的使用方式是过滤,但是还有一些其它用法。
grep是Linux中最常用的”文本处理工具”之一,grep与sed、awk合称为Linux中的三剑客。
grep的全称为: Global search Regular Expression and Print out the line。全称中的”Regular Expression”表示正则表达式。
所以,从grep的全称中可以了解到,grep是一个可以利用”正则表达式”进行”全局搜索”的工具,grep会在文本文件中按照指定的正则进行全局搜索,并将搜索出的行打印出来。
当然,不使用正则表达式时也可以使用grep,但是当grep与正则表达式结合在一起时,威力更强大。
-r,递归查找某个目录,包含下面所有的文件。你也可以根据这个查某个字符串在哪个文件中出现。
配置次数
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符,不包括0次
\? 匹配其前面的字符0 或 1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m 次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$,用于模式匹配整行
^$ 空行
^[[:space:]].*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定;用于单词模式的右侧
\
. 匹配任意单个字符,不能匹配空行
[] 匹配指定范围内的任意单个字符
[^] 取反
[:alnum:] 或 [0-9a-zA-Z]
[:alpha:] 或 [a-zA-Z]
[:upper:] 或 [A-Z]
[:lower:] 或 [a-z]
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 或[0-9]
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
/etc目录都是些系统配置文件,系统配置目录,应用程序配置文件,应用程序配置目录。
linux系统运行时,会读取/etc目录的各种配置文件,
常用的如:
/etc/bashrc:个性化设置
/etc/centos-release:centos版本信息
/etc/redhat-release:centos版本信息
/etc/crontab:定时任务配置
/etc/sudoers:为部分账号配置sudo权限的命令(即菩提账号也能执行部分root才能执行的命令)
/etc/fstab:挂载点信息,并在开机时自动挂载
/etc/firstrun:定制镜像的初始化脚本
/etc/hostname:配置主机名
/etc/hosts:指定域名与ip映射关系
/etc/init.d:service管理的开启自启动服务
/etc/shadow:用户登录口令保存,只有root可读,安全性很高
/etc/passwd:用户登录口令保存,所有用户可读,安全性较低(虽然也是加密,但是还是可破解的)
/etc/
/etc/
/var目录主要存放的是一些经常变动的文件,如缓存文件、日志文件、程序运行时产生的文件等。
比如系统日志,均在/var/log/下面。
/var/cache:应用程序运行过程中产生的一些缓存
/var/lib:存放程序执行过程中使用到的一些数据文件、在该目录下各个软件有各自的目录
/var/lock:某些资源或设备同一时刻只能被一个程序使用或访问,因此在一个程序使用的时候,就为该资源上锁(lock),以防止被其他程序使用,该目录就放置这些相关信息
/var/log:系统中各种日志文件存放的目录
/var/mail:放置个人电子邮箱的目录
/var/spool:该目录通常放置一些队列数据,用完之后一般会被删除
因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否安装了。总结起来就是这样几类:
1、rpm包安装的,可以用rpm -qa看到,如果要查找某软件包是否安装,用 rpm -qa | grep “软件或者包的名字”。
rpm -qa |grep iptables
2、
yum方法安装的,可以用yum list installed查找,如果是查找指定包,命令后加 | grep “软件名或者包名”;
另外,顺便看下yum的其它命令:
3、如果是以源码包自己编译安装的,例如.tar.gz或者tar.bz2形式的,这个只能看可执行文件是否存在了
4、使用which显示环境变量路径的方式:which iptables
which java:
5、whereis java
6、locate命令
locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
cloud-init是云平台为Linux操作系统的虚拟机或裸金属做系统初始化配置的开源服务软件。
阿里云、百度云、华为云、AWS、Azure和OpenStack等主流云平台均支持cloud-init。
阿里云版cloud-init能在ECS实例启动阶段完成系统初始化配置,包括NTP、软件源、主机名和SSH密钥对等,同时执行实例自定义数据(User data)脚本。
cloud-init 是 linux 的一个工具,当系统启动时,cloud-init 可从 nova metadata 服务或者 config drive 中获取 metadata,完成包括但不限于下面的定制化工作:
此处以百度云BBC为例。
对接BBC时,需要执行userdata,我们看日志发现,我们的userdata其实就是cloud-init执行的:
此处提供了百度云的cloud-init的安装。
BBC是默认安装好的。
安装cloudbase-init - 云服务器BCC | 百度智能云文档
systemd即为system daemon,是linux下的一种init软件。在Unix中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识。
Linux 操作系统的启动首先从BIOS开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化。
内核初始化的最后一步就是启动 PID 为 1 的 init 进程。这个进程是系统的第一个进程。它负责产生其他所有的用户进程。init 进程以守护进程(也就是服务)的方式存在,是所有其他进程的祖先。
init 进程非常独特,能够完成其他进程无法完成的任务。
init 系统能够定义、管理和控制 init 进程的行为。它负责组织和运行许多独立的或相关的初始化工作(因此被称为 init 系统),从而让计算机系统进入某种用户预定义的运行模式。
对于一个操作系统而言,仅仅将内核运行起来是毫无实际用途的,必须由 init 系统将操作系统初始化为可操作的状态。比如启动 shell 后,便有了人机交互,这样就可以让计算机执行一些程序完成有实际意义的任务。或者启动 X 图形系统以便提供更佳的人机界面,更加高效的完成任务。
随着计算机系统软硬件的发展,init 系统也在不断的发展变化之中。大体上的演进路线为 sysvinit -> upstart -> systemd。
sysvinit 就是 System V 风格的 init 系统,顾名思义,它源于 System V 系列的 UNIX。最初的 linux 发行版几乎都是采用 sysvinit 作为 init 系统。sysvinit 用术语 runlevel 来定义 "预订的运行模式"。比如 runlevel 3 是命令行模式,runlevel 5 是图形界面模式,runlevel 0 是关机,runlevel 6 是重启。sysvinit 会按照下面的顺序按部就班的初始化系统:
除了负责初始化系统,sysvinit 还要负责关闭系统,主要是在系统关闭是为了保证数据的一致性,需要小心地按照顺序进行任务的结束和清理工作。另外,sysvinit 还提供了很多管理和控制系统的命令,比如 halt、init、mesg、shutdown、reboot 等等。
sysvinit 的优点是概念简单。特别是服务(service)的配置,只需要把启动/停止服务的脚本链接接到合适的目录就可以了。
sysvinit 的另一个重要优点是确定的执行顺序,脚本严格按照顺序执行(sysvinit 靠脚本来初始化系统),一个执行完毕再执行下一个,这非常有益于错误排查。
同时,完全顺序执行任务也是 sysvinit 最致命的缺陷。如果 linux 系统只用于服务器系统,那么漫长的启动过程可能并不是什么问题,毕竟我们是不会经常重启服务器的。但是现在 linux 被越来越多的用在了桌面系统中,漫长的启动过程对桌面用户来说是不能接受的。除了启动慢,sysvinit 还有一些其它的缺陷,比如不能很好的处理即插即用的设备,对网络共享磁盘的挂载也存在一定的问题,于是 init 系统开始了它的进化之旅。
由于 sysvinit 系统的种种弊端,Ubuntu 的开发人员决定重新设计和开发一个全新的 init 系统,即 upstart 。upstart 是第一个被广泛应用的新一代 init 系统。
systemd 是 linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。systemd 和 ubuntu 的 upstart 是竞争对手,但是时至今日 ubuntu 也采用了 systemd,所以 systemd 在竞争中胜出,大有一统天下的趋势。其实,systemd 的很多概念都来源于苹果 Mac OS 操作系统上的 launchd。
systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂,下图展示了 systemd 的架构(此图来自互联网):
systemd 的主要优点:
兼容性:systemd 提供了和 sysvinit 兼容的特性。系统中已经存在的服务和进程无需修改。这降低了系统向 systemd 迁移的成本
启动速度:systemd 的目标是:1、尽可能启动更少的进程;2、尽可能将更多进程并行启动
按需启动:systemd 提供按需启动能力,对比sysvinit,sysvinit 系统初始化的时候,会将所有可能用到的后台服务进程全部启动运行。
cgroups:采用 linux 的 cgroups 跟踪和管理进程的生命周期,systemd 利用了 Linux 内核的特性即 cgroups 来完成跟踪的任务。当停止服务时,通过查询 cgroups ,systemd 可以确保找到所有的相关进程,从而干净地停止服务。
更多可参考:systemd 介绍_shliang310的博客-CSDN博客_systemd
systemd 用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其它服务,来创建自己的目标。下表列举了 systemd 中的 target 和 sysvinit 中常见的 runlevel 的对应关系:
sysvinit runlevel | systemd target | 描述 |
0 | poweroff.target | 关闭系统。 |
1,s,single | rescue.target | 单用户模式。 |
2,4 | multi-user.target | 用户定义/域特定运行级别。默认等同于 3。 |
3 | multi-user.target | 多用户,非图形化。用户可以通过多个控制台或网络登录。 |
5 | graphical.target | 多用户,图形化。通常为所有运行级别 3 的服务外加图形化登录。 |
6 | reboot.target | 重启。 |
emergency | emergency.target | 紧急 Shell。 |
系统初始化需要做的事情非常多。需要启动后台服务,比如启动 ssh 服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被 systemd 抽象为一个配置单元,即 unit。可以认为一个服务是一个配置单元,一个挂载点是一个配置单元,一个交换分区的配置是一个配置单元等等。systemd 将配置单元归纳为以下一些不同的类型。然而,systemd 正在快速发展,新功能不断增加。所以配置单元类型可能在不久的将来继续增加。下面是一些常见的 unit 类型:
service :代表一个后台服务进程,比如 mysqld。这是最常用的一类。
socket :此类配置单元封装系统和互联网中的一个套接字 。当下,systemd 支持流式、数据报和连续包的 AF_INET、AF_INET6、AF_UNIX socket 。每一个套接字配置单元都有一个相应的服务配置单元 。相应的服务在第一个"连接"进入套接字时就会启动(例如:nscd.socket 在有新连接后便启动 nscd.service)。
device :此类配置单元封装一个存在于 Linux 设备树中的设备。每一个使用 udev 规则标记的设备都将会在 systemd 中作为一个设备配置单元出现。
mount :此类配置单元封装文件系统结构层次中的一个挂载点。Systemd 将对这个挂载点进行监控和管理。比如可以在启动时自动将其挂载;可以在某些条件下自动卸载。Systemd 会将 /etc/fstab 中的条目都转换为挂载点,并在开机时处理。
automount :此类配置单元封装系统结构层次中的一个自挂载点。每一个自挂载配置单元对应一个挂载配置单元 ,当该自动挂载点被访问时,systemd 执行挂载点中定义的挂载行为。
swap:和挂载配置单元类似,交换配置单元用来管理交换分区。用户可以用交换配置单元来定义系统中的交换分区,可以让这些交换分区在启动时被激活。
target :此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已。这样便可以对配置单元做一个统一的控制。这样就可以实现大家都已经非常熟悉的运行级别概念。比如想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍以便进入目标所代表的系统运行状态。 (例如:multi-user.target 相当于在传统使用 SysV 的系统中运行级别 5)
timer:定时器配置单元用来定时触发用户定义的操作,这类配置单元取代了 atd、crond 等传统的定时服务。
snapshot :与 target 配置单元相似,快照是一组配置单元。它保存了系统当前的运行状态。
path:文件系统中的一个文件或目录。
scope:用于 cgroups,表示从 systemd 外部创建的进程。
slice:用于 cgroups,表示一组按层级排列的单位。slice 并不包含进程,但会组建一个层级,并将 scope 和 service 都放置其中。
每个配置单元都有一个对应的配置文件,系统管理员的任务就是编写和维护这些不同的配置文件,比如一个 MySQL 服务对应一个 mysql.service 文件。这种配置文件的语法非常简单,用户不需要再编写和维护复杂的系统脚本了。
1、介绍
概念:它叫做“安全增强型 Linux(Security-Enhanced Linux)”,简称 SELinux,它是 Linux 的一个安全子系统。
作用:其主要作用就是最大限度地减小系统中服务进程可访问的资源(根据的是最小权限原则)。避免权限过大的角色给系统带来灾难性的结果。
2、开启或关闭
#查看selinux状态
[root@vm01]# getenforce
#临时关闭selinux
[root@vm01]# setenforce 0
#永久关闭
[root@vm01]# vi /etc/selinux/config
# SELINUX=enforcing改为SELINUX=disabled
3、踩坑
关闭了selinux之后,reboot虚拟机,在开机页面报错“fail to load selinux policy”。解决方法就是在开机选择centos内核那一步的时候,在选项上按“E”按键。进入编辑界面,在“linux16”位置的最后输入“selinux=0”,如下图所示
然后ctrl+x重启。之后键入命令,如下图所示后。问题解决
#删除selinux
[root@vm01]# yum remove selinux-policy
#安装selinux
[root@vm01]# yum install selinux-policy
在主板上,有一个东西叫ROM(Read Only Memory,只读存储器)。这和咱们平常说的内存RAM(Read Access Memory,随机存取存储器)不同。 而 ROM 是只读的,上面早就固化了一些初始化的程序,也就是BIOS(Basic Input and Output System,基本输入输出系统)。
在x86系统中,将1M空间最上面的0xF0000到0xFFFFF这64K映射给ROM,也就是说,到这部分地址访问的时候,会访问ROM ,当电脑刚加电的时候,会做一些重置的工作,将CS设置为0xFFFF,将IP设置为0x0000,所以第一条指令就会指向0xFFFF0,正是在ROM的范围内。在这里,有一个JMP命令会跳到ROM中做初始化工作的代码,于是,BIOS开始进行初始化的工作。
BIOS 是硬件固化的自举程序,初始化硬件工作状态为主,BOOTLOADER 是为了启动系统而设计的载入程序。
其实 BOOTLOADER 的工作应该由 BIOS 来完成,不过因为各种原因,这两个部分独立出来可以获得更好的自由度。
在很多专用设备上,很多就只有 Bootloader ,没有 BIOS,比如手机。
从中可以大概看看启动过程分别做了什么:
un 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: Initializing cgroup subsys cpuset
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: Initializing cgroup subsys cpu
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: Initializing cgroup subsys cpuacct
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: Linux version 3.10.0-957.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 8 23:39:32 UTC 2018
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: e820: BIOS-provided physical RAM map:
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x0000000000100000-0x000000003ffd8fff] usable
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x000000003ffd9000-0x000000003fffffff] reserved
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x00000000b0000000-0x00000000bfffffff] reserved
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x00000000feffc000-0x00000000feffffff] reserved
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: NX (Execute Disable) protection: active
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: SMBIOS 2.8 present.
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: DMI: Baidu Cloud Baidu Cloud BCC, BIOS rel-1.11.2-0-gf9626ccb91-prebuilt.qemu-project.org 04/01/2014
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: Hypervisor detected: KVM
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: e820: last_pfn = 0x3ffd9 max_arch_pfn = 0x400000000
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: PAT configuration [0-7]: WB WC UC- UC WB WP UC- UC
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: found SMP MP-table at [mem 0x000f5910-0x000f591f] mapped at [ffffffffff200910]
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: Using GB pages for direct mapping
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: RAMDISK: [mem 0x35720000-0x36b87fff]
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: Early table checksum verification disabled
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: ACPI: RSDP 00000000000f5710 00014 (v00 BOCHS )
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: ACPI: RSDT 000000003ffe3c71 00034 (v01 BOCHS BXPCRSDT 00000001 BXPC 00000001)
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: ACPI: FACP 000000003ffe3611 000F4 (v03 BOCHS BXPCFACP 00000001 BXPC 00000001)
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: ACPI: DSDT 000000003ffe0040 035D1 (v01 BOCHS BXPCDSDT 00000001 BXPC 00000001)
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: ACPI: FACS 000000003ffe0000 00040
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: ACPI: APIC 000000003ffe3705 001C0 (v01 BOCHS BXPCAPIC 00000001 BXPC 00000001)
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: ACPI: SRAT 000000003ffe38c5 00370 (v01 BOCHS BXPCSRAT 00000001 BXPC 00000001)
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: ACPI: MCFG 000000003ffe3c35 0003C (v01 BOCHS BXPCMCFG 00000001 BXPC 00000001)
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: SRAT: PXM 0 -> APIC 0x00 -> Node 0
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: SRAT: PXM 0 -> APIC 0x01 -> Node 0
Jun 24 10:47:30 weiwei-test-baiduyun-sshkey-001-d2c7bb159 kernel: SRAT: PXM 0 -> APIC 0x02 -> Node 0
参考:linux系统起来后bios的作用,趣谈linux操作系统笔记-从BIOS到bootloader_一条斑马树的博客-CSDN博客
Bootloader是在系统上电时开始执行一段小程序,主要功能是初始化硬件设备、准备好软件环境,最后调用操作系统内核。
BootLoader有很多,常用的有:ARMBoot, PPCBoot, U-Boot, RedBoot, Blob, Vivi
通常,BootLoader是严重地依赖于硬件而实现的,除了依赖于CPU的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备。由于BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader分为stage1和stage2两个部分。
stage1:存放依赖于CPU体系结构的代码,如设备初始化代码(通常用汇编语言实现)。
stage2:存放实现更复杂的功能的代码,通常使用C语言实现,代码具有更好的可读性和可移植性。
BootLoader的stage1通常包括以下步骤:
(1)、硬件设备初始化
(2)、为加载BootLoader的stage2准备RAM空间
(3)、复制BootLoader的stage2到RAM空间中
(4)、设置好堆栈
(5)、跳转到stage2的C入口点
BootLoader的stage2通常包括以下步骤:
(1)、初始化本阶段要使用到的硬件设备
(2)、检测系统内存映射
(3)、将内存映像和根文件系统映像从Flash上读到RAM空间中。
(4)、为内核设置启动参数
(5)、调用内核