Linux核心知识
操作系统启动流程
cmos:记录的开机时的配置信息的,专门会有一块电池给它供电
Linux操作系统完整的启动
1.首先,计算机会加载BIOS,这是计算机上最接近硬件的软件,主要功能是进行加电自检
2.加电自检通过后,BIOS会默认会从磁盘的第0柱面,第0磁道,第一个扇区中读取MBR(主引导记录).一个扇区512字节,存放主引导程序(446字节)和磁盘分区表DPT(64字节),最后两个字节为MBR的结束位
3.CentOS默认会使用Grub作为引导操作系统的程序,Grub比较大,常见的方式为在MBR中写入Grub的地址,这样系统实际会载入Grub作为操作系统的引导程序
4.运行Grub,Grub最重要的功能就是根据其配置文件加载kernal镜像,并运行内核加载后的第一个程序/sbin/init,这个程序会根据/etc/inittab来进行初始化工作.这里最重要的就是根据文件中设置的值来确定系统的runlevel,默认为3
5.Linux执行/etc/rc.sysinit脚本,该脚本会设置系统变量,网络配置,启动swap,设定/proc,加载用户自定义模块,加载内核设置等
6.根据用户级别runlevel值来启动对应的服务,会运行/etc/rc3.d/下所有的脚本
7.运行/etc/rc.local,最终会生成终端或图形界面等待用户的登录
Linux内核系统调用
中断
入门
用户和密码
1.root用户修改密码: password
2.root用户添加用户: useradd ypf
3.root用户修改ypf用户的密码 passwd ypf
4.查看帮助手册: useradd -h 或者 man useradd
创建的用户,其实是放在 /etc/passwd 文件里
组的信息我们放在 /etc/group 文件中
命令chown改变所属用户,chgrp改变所属组。
用户开启重启和用户登录注销
关机重启
shutdown
shutdown -h now #立即关机
shutdown -h 1 #一分钟以后关机
shutdown -r now #立刻重启
halt #就是直接关机
reboot #重启系统
syn #把内存中的数据同步到磁盘,centos7用不了,不知道为什么
登录和注销
#切换用户登录
su 用户名
#注销用户,图形界面无效
logout
安装软件
- rpm
1.CentOS 下面使用rpm -i jdk-XXX_linux-x64_bin.rpm进行安装,Ubuntu 下面使用dpkg -i jdk-XXX_linux-x64_bin.deb。其中 -i 就是 install 的意思。
2.凭借rpm -qa和dpkg -l就可以查看安装的软件列表,-q 就是 query,a 就是 all,-l 的意思就是 list。
3.可以使用rpm -qa | more和rpm -qa | less这两个命令,它们可以将很长的结果分页展示出来。我们还是利用管道的机制。more 是分页后只能往后翻页,翻到最后一页自动结束返回命令行,less 是往前往后都能翻页,需要输入 q 返回命令行,q 就是 quit。
4.如果要删除,可以用rpm -e和dpkg -r。-e 就是 erase,-r 就是 remove。
- 软件管家 CentOS 下面是 yum,Ubuntu 下面是 apt-get。
1.例如搜索jdk、yum search jdk和apt-cache search jdk,可以搜索出很多很多可以安装的 jdk 版本。如果数目太多,你可以通过管道 grep、more、less 来进行过滤。
2.选中一个之后,我们就可以进行安装了。你可以用yum install java-11-openjdk.x86_64和apt-get install openjdk-9-jdk来进行安装。
3.安装以后,如何卸载呢?我们可以使用yum erase java-11-openjdk.x86_64和apt-get purge openjdk-9-jdk。
4.Linux 允许我们配置从哪里下载这些软件的,地点就在配置文件里面。对于 CentOS 来讲,配置文件在/etc/yum.repos.d/CentOS-Base.repo里。对于 Ubuntu 来讲,配置文件在/etc/apt/sources.list里。
5.其实无论是先下载再安装,还是通过软件管家进行安装,都是下载一些文件,然后将这些文件放在某个路径下,然后在相应的配置文件中配置一下;主执行文件会放在 /usr/bin 或者 /usr/sbin 下面,其他的库文件会放在 /var 下面,配置文件会放在 /etc 下面。
6.如果是 tar.gz 这种格式的,通过 tar xvzf jdk-XXX_linux-x64_bin.tar.gz 就可以解压缩了。
7.通过 tar 解压缩之后,也需要配置环境变量,可以通过 export 命令来配置。
export JAVA_HOME=/root/jdk-XXX_linux-x64 export PATH=$JAVA_HOME/bin:$PATH
export 命令仅在当前命令行的会话中管用,一旦退出重新登录进来,就不管用了
8.在当前用户的默认工作目录,例如 /root 或者 /home/cliu8 下面,有一个.bashrc 文件,每次登录的时候,这个文件都会运行,因而把它放在这里。这样登录进来就会自动执行。当然也可以通过 source .bashrc 手动执行。
运行程序
1. Linux 执行程序最常用的一种方式,通过 shell 在交互命令行里面运行。
Linux 不是根据后缀名来执行的。它的执行条件是这样的:只要文件有 x 执行权限,都能到文件所在的目录下,通过./filename运行这个程序。当然,如果放在 PATH 里设置的路径下面,就不用./ 了,直接输入文件名就可以运行了,Linux 会帮你找。
2. Linux 运行程序的第二种方式,后台运行。
我们往往使用nohup命令。这个命令的意思是 no hang up(不挂起),也就是说,当前交互命令行退出的时候,程序还要在。
程序不能霸占交互命令行,而是应该在后台运行。最后加一个 &,就表示后台运行。
另外一个要处理的就是输出,原来什么都打印在交互命令行里,现在在后台运行了,输出到哪里呢?输出到文件是最好的。
最终命令的一般形式为 nohup command >out.file 2>&1 &
这里面,“1”表示文件描述符 1,表示标准输出,“2”表示文件描述符 2,意思是标准错误输出,“2>&1”表示标准输出和错误输出合并了。合并到哪里去呢?到 out.file 里
那这个进程如何关闭呢?我们假设启动的程序包含某个关键字,那就可以使用下面的命令。
ps -ef |grep 关键字 |awk '{print $2}'|xargs kill -9
其中 ps -ef 可以单独执行,列出所有正在运行的程序,grep 上面我们介绍过了,通过关键字找到咱们刚才启动的程序。awk 工具可以很灵活地对文本进行处理,这里的 awk '{print $2}'是指第二列的内容,是运行的程序 ID。我们可以通过 xargs 传递给 kill -9,也就是发给这个运行的程序一个信号,让它关闭。如果你已经知道运行的程序 ID,可以直接使用 kill 关闭运行的程序。
3. 程序运行的第三种方式,以服务的方式运行
例如在 Ubuntu 中,我们可以通过 apt-get install mysql-server 的方式安装 MySQL,然后通过命令systemctl start mysql启动 MySQL,通过systemctl enable mysql设置开机启动。之所以成为服务并且能够开机启动,是因为在 /lib/systemd/system 目录下会创建一个 XXX.service 的配置文件,里面定义了如何启动、如何关闭。
在 CentOS 里有些特殊,MySQL 被 Oracle 收购后,因为担心授权问题,改为使用 MariaDB,它是 MySQL 的一个分支。通过命令yum install mariadb-server mariadb进行安装,命令systemctl start mariadb启动,命令systemctl enable mariadb设置开机启动。同理,会在 /usr/lib/systemd/system 目录下,创建一个 XXX.service 的配置文件,从而成为一个服务。
总结此章节常用命令
文件系统
文件系统的功能规划
1. 文件系统要有严格的组织形式,使得文件能够以块为单位进行存储
2. 文件系统中也要有索引区,用来方便查找一个文件分成的多个块都存放在了什么位置
3. 如果文件系统中有的文件是热点文件,近期经常被读取和写入,文件系统应该有缓存层
4. 文件应该用文件夹的形式组织起来,方便管理和查询
5. Linux 内核要在自己的内存里面维护一套数据结构,来保存哪些文件被哪些进程打开和使用
文件系统相关命令行
格式化,也即将一块盘使用命令组织成一定格式的文件系统的过程
1.通过命令 fdisk -l,查看格式化和没有格式化的分区。
# fdisk -l Disk /dev/vda: 21.5 GB, 21474836480 bytes, 41943040 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: 0x000a4c75 Device Boot Start End Blocks Id System /dev/vda1 * 2048 41943006 20970479+ 83 Linux Disk /dev/vdc: 107.4 GB, 107374182400 bytes, 209715200 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
从上面的命令的输出结果可以看出,vda 这块盘大小 21.5G,是格式化了的,有一个分区 /dev/vda1。vdc 这块盘大小 107.4G,是没有格式化的。
2.可以通过命令 mkfs.ext3 或者 mkfs.ext4 进行格式化。
mkfs.ext4 /dev/vdc
也可以选择不将整块盘格式化为一个分区,而是格式化为多个分区。下面的这个命令行可以启动一个交互式程序。
fdisk /dev/vdc
分区结束之后,可能会出现 vdc1, vdc2 等多个分区,这个时候你可以 mkfs.ext3 /dev/vdc1 将第一个分区格式化为 ext3,通过 mkfs.ext4 /dev/vdc2 将第二个分区格式化为 ext4.
3.格式化后的硬盘,需要挂在到某个目录下面,才能作为普通的文件系统进行访问。
mount /dev/vdc1 /根目录/用户A目录/目录1
4.有挂载就有卸载,卸载使用 umount 命令。
umount /根目录/用户A目录/目录1
常用命令
文件和目录权限
文件隐藏属性
查看隐藏属性
lsattr home
修改文件属性
chattr +a ypf.txt
属性a: 这种属性的文件只能在尾部追加而不能删除
属性i: 即使root用户也不能增加修改删除的文件,常用于系统或关键服务的位置
改变文件的权限: chmod
权限组合为r=4,w=2,x=1
递归修改目录下的所有子文件
chmod -R 777 ypf.txt
改变文件的拥有者: chown
chown ypf ypf.txt
修改文件的用户组
chown :ypf ypf.txt
同时修改文件的拥有者和用户组
chown ypf:ypf ypf.txt
修改文件的拥有组: chgrp
chgrp ypf a.txt
递归的进行修改
chgrp -R ypf a.txt
文件特殊属性: SUID/SGID/Sticky
suid: s权限在用户权限上,表明这一命令设置了sticky权限,则该用户组的所有用户可以使用root身份去运行这个命令,suid权限只能作用于二进制文件,给二进制文件添加suid权限的方法
chmod u+s someFile
sgid: 如果某二进制文件的用户组设置了s权限,则该用户组的所有用户都能以该用户的身份去运行这个命令,添加sgid的方法
chmod g+s someFile
sticky: 只能设置到目录上,设置了这个权限的目录,所有用户都可以在这个目录中创建或修改文件,但是有该文件的创建者和root用户可以删除这个文件,给目录添加t权限的方式
chmod o+t someDir
默认权限和umask
对于root用户,文件的默认权限为644,目录的默认权限为755;对于普通用户来说,文件的默认权限是664,目录的默认权限是775
umask遮罩,文件创建的默认权限为666遮罩后的值,目录创建的默认权限为777遮罩后的值
root用户遮罩值为022,普通用户遮罩值为002
查看文件类型: file
file someFile/someDir
查找文件
一般查找: find
find PATH-name fileName
如查找一个文件
find /-name *ypf*
使用数据库查找: locate
locate命令依赖于一个数据库文件,Linux默认每天都会检索一下系统中的所有文件,然后将检索到的文件记录到该数据库中.在执行这个命令之前,都需要执行undatedb,查找速度快于find
undatedb locate *ypf*
注:centos7不能使用,不知道为什么
查找执行文件: which/whereis
which用于从系统的PATH变量所定义的目录中查找可执行文件的绝对路径,如查找passwd这个命令在系统中的绝对路径
which passwd
使用whereis也可以找到其路径,和which不同的是,它不但能找到二进制文件,还能找出相关的man文件
whereis passwd
文件压缩和打包
gzip/gunzip: 原文件不保留
用来压缩和解压缩单个文件,压缩后的文件以.gz结尾,
#压缩文件 gzip ypf.txt #解压缩文件 gunzip ypf.txt.gz
tar: 原文件保留
不但可以打包文件,还可以将这个目录中全部文件整合成一个包,整合的同时还能使用gzip的功能进行压缩.一般来说,整合后的包使用.tar为后缀名,使用gzip压缩后的文件使用.gz为后缀名.因为tar有打包和压缩的功能,通常用.tar.gz为后缀名,或者简写为.tgz
#压缩文件 tar -zcvf ypf.tar.gz /ypf
其中-z使用gzip压缩,-c创建压缩文件,-v显示当前被压缩的文件,-f指定文件名
#解压缩文件 tar -zxvf ypf.tar.gz
其中-z是解压缩
如果需要指定压缩后的路径,则使用-C参数
tar -zxvf ypf.tar.gz -C /tmp
网络管理
常用命令
1.网络接口配置
使用ifconfig检查和配置网卡
MTU: 代表最大存储单元,即网卡一次所能传输的最大分包
RX和TX: 接收和发送的包
collision: 发生冲突数,如果不为0,则很可能存在网络故障
txqueuelen:传输缓冲区长度大小
将IP配置信息写入配置文件
网络配置文件所处的目录为/etc/sysconfig/network-scripts/,eth0的配置文件为ifcfg-eth0
DEVICE: 定义了设备的名称
BOOTPROTO: 定义了获取IP的方式(dhcp,static:静态配置IP地址)
ONBOOT: 启动时是否激活该设备
修改为静态IP
DEVICE=eht0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.243
NETMASK=255.255.255.0
修改完成后需要重启端口或重启网络服务
#重启网卡
ifconfig eth0 down
ifconfig eth0 up
#重启网络服务
service network restart
2.路由和网关设置
使用route来操作网关
#添加默认网关
route add default gw 192.168.1.243
#删除默认网关
route del default gw 192.168.1.243
route del default
#查看系统当前路由表
route -n
重启后便不能使用,可以将其配置在ifcfg-eth0中,或者配置在/etc/sysconfig/network中
GATEWAY=192.168.1.243
3.DNS客户端配置
设置主机为DNS客户端的配置文件为/etc/resolv.conf
4.网络测试工具
ping命令: 会对端主机发送一个ICMP的echo请求包,端主机会在收到这个包的时候回应一个ICMP的reply包
ping 192.168.1.243
host命令: 用来查询DNS记录
host www.baidu.com
#指定一个可用的DNS服务器,而是不是使用/etc/resolv.conf文件中定义的DNS查询
host www.baidu.com 8.8.8.8
tranceroute:
tranceroute www.baidu.com
5.常见网络故障排查
硬件故障:网卡物理损坏和链路故障
软件故障:网卡驱动故障
1.确认网卡本身能否正常工作,ping回环接口lo,IP地址为127.0.0.1,如果ping不通,这一证实本机的tcp/ip协议栈有问题
2.确认网卡是否出现了物理或驱动故障,使用ping本机的IP地址
3.确认能否同同网段的其他主机通信,这一步是为了确认二层网络设备(交换机或hub)能否正常工作
4.看能否ping同网关,如果数据可以到达网关,则说明主机和本地网络工作正常
5.看能否ping同公网上的IP,如果可以则说明本地路由设置正确
6.能否ping同公网上的某个域名
进程管理
常用命令
1.进程的观察: ps,top
1.ps: 输出的是瞬间的状态信息
ps aux: 显示所有包含其它使用者的进程
ps -ef: 常用
2.top: 输出的是实时的状态信息
f: 显示更多的字段 1: 查看每个逻辑CPU的使用情况 O: 另选排序规则
快捷键
M:按照Memory排序 P:按照CPU使用率排序 N:按照PID排序 T:按照CPU使用时间排序
K: 杀死一个进程 R:renice一个进程
2.进程的终止: kill,killall
kill [信号代码] 进程id
常用信号代码共三种:
HUP(1)重启, KILL(9)强行杀掉, TERM(15)正常结束
软重启或原地重启: 重启不会改变进程的pid
直接杀死进程可能会造成内存泄漏
查看进程的pid
pidof dhcpd
killall 更加简单高效
killall httpd
3.查询进程打开的文件: lsof
重定向
常用命令
1.文件标识符和标准输入输出
Linux使用0~9的整数指明了与特定进程相关的数据流,系统在启动一个进程的时候会同时为这个进程打开三个文件:标准输入(stdin)文件标识符0,标准输出(stdout)文件标识符1,标准错误输出(stderr)文件标识符2
2.I/O重定向
符号 | 含义 |
> | 标准输出覆盖重定向 |
>> | 标准输出追加重定向 |
>& | 标识输出重定向:将一个标识的输出重定向到另一个标识的输入 |
< | 标准输入重定向 |
| | 管道 |
标准输出重定向: >或>>
ls /usr 1>stdout.txt 2>stderr.txt
ls /usr 1>>stdout.txt 2>>stderr.txt
标识输出重定向: >&
#将标准输出和标准错误同时指定到一个文件中
command > stdout_stderr.txt 2>&1
#不保存错误输出
command > stdout.txt 2> /dev/null
标准输入重定向: <
sort < helloworld.txt
3.使用exec
命令 | 说明 |
exec <file | 将file文件中的内容作为exec的标准输入 |
exec >file | 将file文件作为标准输出 |
exec 3<file | 指定文件标识符 |
exec 3<&- | 关闭文件标识符 |
exec 3>file | 将写入文件标识符的内容写入到指定文件(这里的文件时file) |
exec 4<&3 | 创建文件标识符3的拷贝4 |
1.将file文件中的内容作为exec的标准输入
exec <command.txt
2.将file文件作为标准输出
即本次会话的所有标准输出重定向到out01.txt文件中,exec >/dev/tty 是将标准输出重定向到了显示器(/dev/tty为显示终端)
3.指定文件标识符
文件标识符也是一种设备,这个设备会出现在/dev/fd目录中
4.关闭文件标识符
5.将写入指定文件标识符的内容写入到指定文件
6.创建文件标识符的拷贝
4.Here Document: 此处文档
end为一个作为标注的分隔符
将要输入的内容保存在helloworld.txt文件中
字符处理
常用命令
使用grep搜索文本
grep [-ivnc] '需要匹配的字符' 文件名
i:不区分大小写,c:统计包含匹配的行数,n:输出行号,v:反向匹配
使用sort排序
sort [-ntkr] 文件名
n:采用数字排序,t:指定分隔符,k:指定第几列,r:反向排序
使用uniq删除重复内容
uniq [-ic]
i:忽略大小写,c:计算重复行数
uniq一般都需要和sort一起使用因为uniq命令只会对比相邻的行,如果重复的行非连续,则uniq会失效
cat a.txt |sort|uniq
使用cut截取文本
它处理的对象为每行,用法如下
cut -f指定的列 -d'分隔符'
例:打印文件/etc/passwd中这个用户和用户的家目录
cat /etc/passwd |cut -f1,6 -d':'
例:打印每个用户的用户名,家目录和shell
cat etc/passwd |cut -f1,6-7 -d':'
当每一行没有特定的分隔符的时候,可以打印特定的字符,用法如下
cut -c指定列的字符
例:打印每一行第1~5个字符,第7~10个字符
cat /etc/passwd |cut -c1-5,7-10
使用tr做文本转换
主要是做文本转换或删除
例:将文件/etc/passwd转换成大写,然后删除文本中的冒号
#转换成大写 cat /etc/passwd |tr '[a-z]' '[A-Z]' #或者 cat /etc/passwd |tr 'a-z' 'A-Z' #删除冒号 cat /etc/passwd |tr -d ':' #转成大写并删除冒号 cat /etc/passwd |tr 'a-z' 'A-Z' |tr -d ':'
使用paste做文本合并:逐行合并
将文本进行逐行合并,中间默认tab隔开,也可以使用-d指定特定的分隔符
#默认使用tab合并 paste a.txt b.txt #使用-d指定特定的分隔符进行合并 paste -d' ' a.txt b.txt
使用split分隔大文件
#指定参数l,按行进行分割
split -l500 bigFile.txt smail_file_
#指定参数b,按照文件大小来分割
split -b64m bigFile.txt smail_file_
正则表达式
基础正则表达式
1. "."符号: 匹配除了换行以外的任意一个字符
2. "*"符号: 匹配前一个字符0次或任意多次
3. "\{n,m\}"符号
\{n\}: 匹配前面的字符n次
\{n,\}: 匹配前面的字符n次及以上
\{n,m\}: 批签前面的字符n到m次
4. "^": 用于匹配开头的字符,如"^root"匹配以字母root开始的行
5. "$": 用于匹配尾部,如"abc$"代表以abc结尾的行
6. "[]": 用于匹配方括号内出现的任意字符
7. "\": 表示转义
8. "\<"和"\>": 用于定义单词的左右边界
扩展正则表达式
"?": 用于匹配前一个字符0次或1次
"+": 用于匹配前一个字符1次或多次
"|": 表示或者
通配符
"*": 代表0个或多个字符
"?": 任意一个字符
"{}": 匹配所有括号内包含以逗号分隔的字符
"^"和"!"这两个符号往往和[]一起使用,出现在[]中的时候,表示取反
常用命令
使用命令:systemctl status firewalld.service
查看防火墙状态
使用命令:systemctl stop firewalld.service
关闭运行的防火墙
输入命令:systemctl disable firewalld.service,禁止防火墙服务器