Linux操作系统

Linux简单命令

显示日期和时间:date

显示日历的命令:cal

简单好用的计算器:bc

热键:

  1. tab 补齐
  2. ctrl + c 中断
  3. ctrl + d 结束

命令求助:

  1. 命令 --help
  2. man 命令
  3. info 命令

简单文本编辑器: nano(使用非常简单)

Linux关机重启:

将数据同步写入硬盘:sync

常用的关机重启命令:

shutdown - h now(关机)

shutdown - r now(重启)

shutdown -h xx:xx(指定时间关机)

shutdown -h +10(十分钟后关机)

reboot(重启)

halt(系统停止)

poweroff(系统关机)

 

Linux的文件权限与目录配置

用户与用户组

用户与root信息存放在/etc/passwd

密码存放在/etc/shadow

用户组信息存放在/etc/group

Linux文件权限概念

Linux文件属性

ls -al 查看文件属性

-rwxrwxrwx. 链接数 文件拥有者 文件所属群组 文件大小 最后修改时间 文件名

第一个字符: -代表文件,d代表目录,l代表链接文件,b代表设备文件中的存储设备,c代表设备文件中的输入输出设备

第一组rwx为拥有者u的权限,第二组rwx为群组g的权限,第三组为其它人o的权限

对于文件而言: r:4可读 w:2可以修改(不是新建删除) x:1可执行

对于目录而言: r:4可以查看该目录下的文件或目录详情 w:2可以创建,删除,移动,修改文件或文件名目录等 x:1可以切换到该目录下

修改文件属性与权限

chgrp [-R]  group filename/dirname 修改文件所属用户组

-R 递归修改

chown [-R] owner filename/dirname 修改文件所属用户或者用户组

chown [-R] owner:group filename/dirname 修改文件所属用户或者用户组

-R 递归修改

chmod [-R] 777 filename/dirname 修改文件权限

chmod [a,u,g,o] [+-=] [rwx] filename/dirname

Linux目录配置:

/根目录

/bin 存放执行文件的目录

/boot 存放启动时会用到的文件的目录

/dev 设备

/etc 配置

/lib 系统函数库

/media 媒体(光盘,软盘,dvd等设备暂时挂载)

/mnt 暂时挂载额外设备

/opt 第三方软件

/run 系统启动后产生的各项信息存放目录

/sbin root命令存放目录

/srv service网络服务使用的数据目录

/tmp 临时文件存放目录

/usr(unix software resource) (第二层FHS设置,不变性数据)

  1. /usr/bin 存放用户命令的目录 /bin 链接至 /usr/bin
  2. /usr/lib 系统函数库 /lib 链接至 /usr/lib
  3. /usr/sbin 存放root命令的目录 /sbin 链接至 /usr/bin
  4. /usr/share 存放制度的数据文件,包括共享文件

/var (第二层FHS设置,变动性数据)

  1. /var/cache 应用程序运行时产生缓存
  2. /var/lib 程序执行过程中,需要使用到的数据文件的目录比如(mysql的/var/lib/mysql)
  3. /var/lock 设备锁
  4. /var/log 日志文件放置的目录
  5. /var/mail 电子邮箱的目录
  6. /var/run 程序或服务启动后,会将pid放置在该目录下
  7. /var/spool 放置一些队列数据

/lost + found 文件系统发生错误时,遗失片段放置在该目录

/proc 虚拟文件系统,放置的数据都是在内存中。可以查看cpu,内存,等等信息/proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/ioports、/proc/net/*等

/sys 虚拟文件系统,记录内核和系统硬件相关信息

Linux操作系统_第1张图片

uname -r 查看linux的内核版本

uname -m 查看linux的架构版本

Linux文件与目录管理

目录与路径

目录的相关操作

cd 切换目录

cd ~ 返回家目录

cd - 返回上次目录

cd .. 返回上层目录

pwd 显示当前目录

mkdir [-mp] dirname 建立一个新目录

-p 创建多级目录

-m 指定目录权限 mkdir -m 777 dirname

rmdir [-p]  dirname 删除一个新目录

-p 删除多级目录(子目录被删除,父目录变成空,则父目录也被删除)

文件与目录管理

ls [-ald] filename/dirname 文件与目录查看

-a 显示包括隐藏文件

-l 显示详细信息包括文件属性和权限等

-d 只显示目录

cp [-aipr] 源文件或目录 目标文件或目录  复制

-a 文件属性和权限一同复制

-i 文件存在覆盖前询问

-p 连同文件属性和权限一同复制

-r 递归复制

rm [-rf] filename/dirname 删除

-r 递归删除

-f 强制force,忽略不存在的文件

mv 移动或重命名

mv source destination 

basename 获取路径的文件名

basename /etc/sysconfig/network

network

dirname 获取路径的目录

dirname /etc/sysconfig/network

/etc/sysconfig

文件内容查看

cat [-n] file 查看文件内容

-n 打印行号

tac 跟cat相反,从最后一行开始显示

nl file 显示的同时输出行号

more file 一页一页显示内容

less file 跟more类似,但是可以向前翻页

head [-n number] file 查看前n行

tail [-n number] file 查看后n行

tail -f file 动态更新文件内容

od 查看非文本文件

 touch 修改文件时间或创建文件

touch file 创建文件

touch -d "2 days ago" file  修改文件的atime和mtime(无法修改ctime)

touch -t 201406150202 file 修改文件的atime和mtime (无法修改ctime)

stat filename 查看文件的atime(访问改变时间) mtime(内容修改时间)ctime(状态修改时间) 

文件与目录的默认权限和隐藏权限

文件默认权限

umask 查看默认权限

umask -S 具体显示

umask 002 设置默认权限

建立文件时的默认权限: -rw-rw-rw - (0022) = -rw-r--r--

建立目录时的默认权限:drwxrwxrwx - (0022) = drwxr-xr-x

文件的隐藏属性

chattr [+-= ] [ai] filename/dirname 增加隐藏属性

-a 当设置之后只能增加数据,无法修改,只有root能设置

-i 设置之后文件就不能被增删改查了

lsattr 查看隐藏属性

文件特殊权限

SUID:4

SUID权限针对二进制程序有效,且执行者必须拥有x权限,那么在执行期间,执行者具有文件拥有者的权限。

-rwsrwxrwx:(如果是S,则表示没有x权限,为空的SUID权限)

SGID:2

1.SGID针对二进制程序,且执行者拥有x权限,那么在执行期间,执行者具有用户组的权限。

2.SGID针对目录,且执行者具有r,x权限,用户在该目录下的有效用户组会变成该目录的用户组,比如w权限新增文件和目录,那么文件的用户组为该目录的用户组

-rwxrwsrwx:(如果是S,则表示没有x权限,为空的SUID权限)

SBIT:1

SBIT针对目录,执行者具有w,x权限,即写入权限,那么执行者在该目录下建立文件或目录后,只有root和自己才有权利删除。

-rwxrwxrwt:(如果是T,则表示没有x权限,为空的SUID权限)

chmod 7777 filename 即可设置特殊权限

file filename 观察文件类型

命令与文件的查找

脚本文件的查找

which [-a] command

-a 根据path找到所有命令而不是第一个

type command 

文件查找

whereis 只找系统中某些指定目录

whereis filename

whereis -l 查看哪些目录

locate则利用数据库来查找文件名

locate keyword

locate -S 查看数据库文件的名字和数据量

updatedb 更新locate数据库

find [PATH] [option] [action]

1. find / -mtime [+-] n  查看n天修改过的文件

2. find / -user xxx 根据用户查找

类似的-group xxx

find / -nouser 或者 find / -nogroup 找到那些不正常的文件

3. find / -name filename 根据文件名查找

find / -name "*keyword*" 根据关键字查找

4. find / -perm /7000 根据文件属性进行查找(/7000指具有SUID,SGID,SBIT特殊权限得到文件)

5 find / -perm /7000 -exec ls -l {} \;  find / -perm /7000找到的内容会替代{},然后执行ls

Linux磁盘与文件系统管理

认识Linux文件系统

文件系统特性

超级区块:记录此文件系统的整体信息,包括inode与数据区块的总量,使用量和剩余量

inode:记录文件的权限和属性,一个文件占用一个inode,同时记录文件的数据所存储的数据区块的号码

数据区块:实际记录文件的内容,文件太大会占用一个区块

ext2,ext3,ext4文件系统由多个存储区群组构成,每个存储区群组又包含超级区块,inode和数据区块。

blkid 显示出目前系统被格式化的设备

dumpe2fs 设备文件名(ext2,ext3,ext4文件系统)查看文件系统详情

xfs_info 挂载点|设备文件名 查看文件系统详情

XFS文件系统简介

数据区:由多个存储区群组构成,每个存储区群组又包含超级区块,inode和数据区块。

活动登录区:记录文件系统的变化,类似文件区

实时运行区:xfs会在这个区段找到一个到数个extent区块,将文件放置在这个区块内,等分配完毕后,再写入到数据区的inode和数据区块中。

文件系统的简单操作

磁盘与目录的容量

df [-ih] [目录或文件名] 列出文件系统的整体磁盘使用量

-h 人性化显示

-i 容量以inode数量显示

df -aT 将系统内的所有特殊文件名称和格式都列出来

-a 列出所有文件系统

-T 文件系统的名称也列出

du -[sh] 文件或目录  查看文件系统的磁盘使用量

-h 人性化显示

-s 仅列出总量

硬链接和符号链接

硬链接(不能跨文件系统,不能链接目录):在某个目录下新增一条文件名链接到某个inode号码的关联记录,不会占用inode和区块

符号链接:类似windows的快捷键,创建一个新的文件,文件内容是链接的文件的inode,会占用inode和区块

ln 源文件 目标文件 创建硬链接

ln -s 源文件 目标文件 创建符号连接

磁盘的分区,格式化,检验与挂载

步骤:

  1. 磁盘分区
  2. 分区格式化,建立文件系统
  3. 对文件系统进行检验
  4. 挂载到挂载点

观察分区状态

lsblk(list block device) 列出所有的存储设备

blkid 列出设备的UUID等参数

parted 列出磁盘的分区表类型与分区信息

parted /dev/sda1 print 

磁盘分区

MBR分区使用fdisk,GPT分区使用gdisk

gdisk 设备名称  对磁盘进行分区

gdisk /dev/sda (不能是/dev/sda1)

partprobe [-s] 更新linux的分区表信息

磁盘格式化(创建文件系统)

mkfs(make filesystem)

xfs文件系统 mkfs.xfs /dev/sda1

ext4文件系统 mkfs.ext4 /dev/sda1

文件系统的检验

xfs_repair 设备名称

xfs_repair /dev/sda1

fsck.ext4 设备名称

fsck.ext4 /dev/sda1

文件的挂载与卸载

mount /dev/sda1 /mnt/test 挂载

mount UUID="" /mnt/test

umount 设备名称或者挂载点 卸载

umount /dev/sda1 

umount /mnt/test 

磁盘与文件参数自定义

mknod 设备文件名  主设备码 次设备码

xfs_admin 修改XFS文件系统的UUID与Lable Name

tune2fs 修改ext4的label name与UUID

设置启动挂载

启动挂载/tec/fstab及/etc/mtab

cat /etc/fstab 查看启动时挂载文件

特殊设备loop挂载(镜像文件不 刻录就挂载使用)

mount -o loop /tmp/Centos.iso /data/centos_dvd 挂载

umount /data/centos_dvd 卸载

内存交换分区(swap)创建

方法1:设置一个内存交换分区

方法2:建立一个虚拟内存文件

物理分区创建内存交换分区

1.分区gdisk或者fdisk分区

2.格式化,mkswap 设备文件名

3.使用 swapon 设备文件名启动swap分区

4.free 或者swapon -s查看内存使用情况

文件创建内存交换文件

1.使用dd在/tmp下面新增一个128M的文件

dd if=/dev/zero of=/tmp/swap bs=1M count=128

2.mkswap将/tmp/swap这个文件格式化为内存交换文件

mkswap /tmp/swap

3.使用swapon将/tmp/swap启动

swapon /tmp/swap

4.使用swapoff关闭swap file 并设置自启动

自启动 vim或者nano /etc/fstab里面设置

利用GNU的parted进行分区操作(参考鸟哥私房菜256页)

文件与文件系统压缩

Linux系统常见的压缩命令

*.Z compress程序压缩的文件

*.zip zip程序压缩的文件

*.gz gzip程序压缩的文件

*.bz2 bzip2程序压缩的文件

*.xz xz程序压缩的文件

*.tar tar程序打包的文件,并没有压缩过

*.tar.gz tar程序打包的文件,并经过gzip压缩

*.tar.bz2 tar程序打包的文件,并经过bzip2压缩 

*.tar.xz tar程序打包的文件,并经过xz压缩

gzip,zcat/zmore/zless/zgrep

gzip应用最广泛,可以解开compress,zip与gzip压缩文件

gzip 文件名 压缩

gzip -d 文件名.gz 解压缩

zcat/zmore/zless 文件名.gz 查看内容

zgrep -n ‘http’ 文件名.gz 使用方法同grep 关键字查找文件内容

bzip2,bzcat/bzmore/bzless/bzgrep

使用方法同gzip

xz,xzcat/xzmore/xzless/xzgrep

使用方法同gzip

打包命令:tar

tar [-cxzjJvfC] 文件名

-c 压缩

-x 解压

-z 通过gzip压缩 文件名.tar.gz

-j 通过bzip2压缩 文件名.tar.bz2

-J通过xz压缩 文件名.tar.xz

-v 显示压缩和解压过程中的文件名

-C解压时,解压到指定目录

常用:

tar -zcvf 文件名  压缩

tar -ztvf 文件名.gz 查看压缩

tar -zxvf 文件名.gz 解压

XFS文件系统的备份与还原

xfs文件系统备份xfsdump

xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据

xfsdump -I 查看备份情况

xfs文件系统备份还原xfsrestore

xfsrestore [-f 备份文件] [-L S_label] [-s] 待恢复目录

xfsrestore -I 查看还原情况

光盘写入工具

mkisofs:建立镜像文件

cdrecord:光盘刻录工具

其他常见的压缩与备份工具

dd

dd不仅可以制作文件还可以用于备份

dd if="input_file" of="output_file" bs="block_size" count="number"

例如 dd if="/etc/passwd" of="/etc/passwd.back"

cpio

cpio可以备份任何文件

cpio -ovcB > [file|device] 备份

cpio -ivcdu < [file|device] 还原

cpio -ivct < [file|device] 查看

vim程序编辑器

vi与vim

vi和vim都是文本编辑器,vim是vi的增强版

vi使用

三种模式:

1.一般命令模式

2.编辑模式

3.命令模式

刚进入vi时为一般命令模式,按a,A,i,I,o,O,r,R,按:,?,/进入命令模式,编辑模式按ESC回到一般命令模式,命令模式按:wq保存并退出编辑器。

一般模式按键说明:

光标移动

hjkl 分别代表左下上右,也可以使用方向键,可以数字加方向,比如30h代表向左移动30个字符

ctrl+f 向下移动一页=page down

ctrl+b向上移动一页=page up

0或者home移动到该行最前处

$或者end移动到该行末尾

G 移动到文件最后一行

gg 移动到文件第一行

查找替换

/word 向下查找字符串

?word 向上查找字符串

n 找到下一个,N找到上一个

:n1,n2s/word1/word2/g n1和n2行之间查找word1,并将其替换成word2

:1,$s/word1/word2/g 从第一行到最后一行,将word1替换成word2

:1,$s/word1/word2/g 从第一行到最后一行,将word1替换成word2,之前需要询问是否替换

删除复制与粘贴

x与X,x向后删除一个字符,X向前删除一个字符

nx 向后连续删除n个字符

dd 删除整行

ndd 删除n行

yy 复制光标的那一行

nyy  复制光标所在的向下n行

p与P  p将复制的数据向下粘贴,P将复制的数据向上粘贴

u 恢复前一个操作

ctrl + r 重复上个操作

. 重复前一个操作

进入插入或替换的编辑模式

i与I 插入模式,当前光标处插入

a与A 插入模式,从光标所在行的最后一个字符插入

o与O 插入模式  ,在光标所在行的下一行插入

r与R 替换模式,r替换一次,R一直替换,知道按esc停止

ESC 退出编辑模式

命令行模式的保存,退出等命令

:w 将编辑的数据写入硬盘文件中

: w! 若文件属性为只读,则强制写入

:q退出

:q! 不修改退出

:wq 保存后退出

vim的额外功能

可视区块

v 字符选择

V 行选择

ctrl + v 区块选择

y 复制

d 删除

p 粘贴

多文件编辑

vim file1 file2 同时编辑多个文件

:n 编辑下一个文件

:N 编辑上一个文件

:files 列出vim开启的所有文件

多窗口功能

:sp [filename] 打开一个新窗口,加filename则表示创建一个新文件

ctrl + w + 下 ,ctrl + w + 上 切换窗口

ctrl + w + q 退出窗口

(ctrl + w先按,然后下上q)

认识与学习BASH

查看命令是否为Bash Shell 的内置命令:type

type name

命令的执行与快速编辑按钮

长命令使用\+Enter来换行

ctrl + u/ctrl + k 分别向前或向后删除命令串

ctrl + a/ctrl + e 光标分别移动到前面或者后面

Shell变量

变量的使用与设置:echo,变量设置规则,unset

echo $PATH 输出变量

echo -e xxxx

-e 可以使得\a \n等转移字符生效

变量的设置规则,

myname=jack 两遍不能有空格,开头字符不能是数字

变量包含空格,可使用单引号或双引号包含

双引号内的特殊字符比如$,可以保持原有特性,单引号内的特殊字符比如$则代表一般字符,特殊字符可以使用转义字符来显示

一串命令的执行中,需要用到其他命令提供的信息时,可以通过`命令`或者$(命令)执行

其他子程序需要用到该变量,则需要export PATH 使其变成环境变量

(系统默认变量为大写字符,自行设置的变量为小写字符)

取消变量的方法:unset 变量名

环境变量的功能

env 或者export查看环境变量

set 观察所有的变量

export 变量名称 将自定义的变量加入环境变量

变量键盘读取,数组与声明:read,array,declare

read读取来自键盘输入的变量 read variable

read -p "提示信息" variable

-p 输入前打印提示信息

declare或者typeset [-aix] variable 

-a variable定义成数组类型

-i variable定义成整数类型

-x variable 跟export一样变成环境变量

var[0] = "small main"

var[1] = "big main"

echo ${var[1]}

echo ${var[2]}

与文件系统及程序的限制关系:ulimit

ulimit -a 显示所有限制

ulimit -f 10240 设置文件大小设置

命令别名与历史命令

命令别名设置:alias,unalias

alias lm="ls -al | more" 设置别名

alias 查看别名

unalias lm 将lm命令删除

历史命令:history

history 查看历史命令

Bash shell的操作环境

路径与命令查找顺序

1.以相对/绝对路径执行命令,例如[/bin/ls]或者[./ls]

2.由alias找到该命令执行

3.bash内置命令

4.通过$PATH变量的顺序找到第一个命令执行

bash的登录与欢迎信息:/etc/issue,/etc/motd

cat /etc/issue 编辑登录信息

cat /etc/motd 编辑欢迎信息

bash的环境配置文件

login与non-login shell读取bash环境配置文件不同

login shell:取得bash shell时需要完整的登录流程,即输入用户名和密码。比如tty1~tty6非图形界面登录

non-login shell:1.x-Windows图形界面登录,然后打开终端。2.bash开启一个子进程

login shell只会读取两个配置文件

1./etc/profile:系统整体的设置,最好不要修改该文件

2.~/.bash_profile或者~/.bash_login或者~/.profile:属于个人设置,自己添加的数据写在这个地方(三个文件按顺序读取,且只会读取其中一个)

最终读取~/.bashrc配置文件,即也可以在该文件下配置自定义环境变量

source(或者.) 配置文件名 将配置文件内容读取到shell环境中,因为/etc/profile或者~/bash_profile等都是login时才生效,需要注销登录后才能生效。

non-login shell只会读取~/.bashrc配置文件

终端的环境配置:stty,set

stty -a 查看终端环境的参数配置

set [-uvCHhmBx]帮助设置终端的值

ctrl + C终止当前命令

ctrl + D输入结束

ctrl + Z暂停当前命令

通配符与特殊符号

通配符

符号 意义
* 代表0到无穷个任意字符
代表一定有一个任意字符
[] 一定有括号内的一个字符,[abcd],一定有一个字符,可能是abcd其中一个
[-] 代表在编码内的所有字符,[0-9],代表0-9之间的所有数字,[a-z]
[^] 表示反向选择,[^abc]一定有一个不是abc的字符

 

 

 

 

 

 

 

 

特殊符号

符号 意义
# 注释符号,视为说明不执行

\

转义符;将特殊字符或者通配符转换成普通字符
| 管道;分割两个管道命令的符号
连续命令执行分隔符
~ 家目录
$ 使用变量前导符
& 任务管理:将命令变成后台任务
逻辑运算符非not的意思
/ 目录符号:路径分隔符
>,>> 数据流重定向:输出定向,分别是替换和累加
<,<< 数据流重定向:输入定向
'' 单引号,不具有变量替换功能
"" 双引号,具有变量替换功能
`` 中间为执行命令,也可以使用$()
() 在中间为子shell的起止与结束
{} 在中间为命令区块组合

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

数据流重定向

执行命令,使得文件读取数据到内存,然后处理后输出到屏幕上

标准输入(stdin):代码为0,使用<或者<<

标准输出(stdout):代码为1,使用>或者>>

标准错误输出(stderr):代码为2,使用2>或者2>>

find /home -name .bashrc > list_right 2> list_error 将正确信息写入list_right, 将错误信息写入list_error

find /home -name .bashrc > list 2>& 1==find /home -name .bashrc &> list 将正确和错误信息写入同一个文件

cat > catfile < ~/.bashrc 将bashrc文件内容复制到catfile文件中

cat > catfile << "eof" eof代表结束符,当键盘敲出eof时结束

命令执行的判断根据:;,&&,||

cmd;cmd(不考虑命令相关性的连续命令执行)

cmd1 && cmd2 ,如果cmd1错误,则cmd2不会执行

cmd1 || cmd2, 如果cmd1正确,则cmd2不会执行

管道命令(pipe)

ls -al /etc | less

|仅能处理经由前面一个命令传来的正确信息,也就是标准输出的信息,对于标准错误并没有直接处理的能力。

管道命令必须要能够接受来自前一个命令的数据成为标准输入继续处理才行

选取命令:cut,grep

cut用来切割内容

cut -d'分隔符' -f fields, 根据分隔符,选取哪一段

echo $PATH | cut -d':' -f 5       根据:分隔符,选取$PATH里面的第五段

export | cut -c 12-  选取exprot内容的12个字符以后的内容

grep 分析一行信息,有需要的信息,则把该行拿出来

grep 'test' /etc/profile

echo $ PAtH | grep ' root'

排序命令:sort,wc,uniq

sort用来排序

cat /etc/passwd | sort

uniq 重复数据仅显示一条

cat /etc/passwd | sort | uniq

-c 进行计数

wc 统计文件中的字,行和字符数

双向重定向:tree

tee 会同时将数据流分送到文件与屏幕,而输出到屏幕的起始就是stdout,可以继续用下个命令处理

tee [-a] file

-a 追加的方式,将数据加入到文件中

last | tee last.list | cut -d' ' -f 1

字符转换命令:tr,col,join,paste,expand

tr可以用来删除一段信息中的文字,或进行文字信息转换

tr[-ds] set1...

-d 删除信息中的set1 这个字符

-s:替换掉重复的字符

tr [a-z] [A-Z] 将小写字符替换成大写字符

tr -d':' 删除:字符

col -x 将tab键转换成对应的空格键

join:两个文件当中,有相同数据的那行,才将它加在一起

paste 直接将两行粘在一起,默认用tab分隔开

paste [-d] file1 file2

-d 指定分隔符

expand 就是将tab转成空格键

expand [-t] file

-t 后面跟数字,按照多少个空格键替换,默认8个

划分命令:split

split [-bl] file PREFIX

-b: 后面可接欲划分成的文件大小,可加单位b,k,m等

-l 以行数来划分

split -b 300k /etc/services services

参数代换:xargs

xargs就是产生某个命令的参数的意思

很多命令不支持管道命令,可以通过xargs来提供该命令使用标准输入。

关于-号的用途
可以作为stdin与stdout来使用

tar -zcvf - /home | tar -zxvf - -C /tmp/homeback

正则表达式与文件格式化处理

基础正则表达式

[:alnum:] 代表英文大小写字符以及数字

[:alpha:] 代表大小写字符

[:upper:]代表大写字母

[:lower:]代表小写字母

[:digit:]代表数字

^word 以word为首

word$ 以word结束

.代表任意字符

\转移字符

*0至多个字符

[]含有其中一个字符

[n1-n2] [a-z]

[^list] 反向选择

\{n,m\}n-m个字符

\{n\} n个字符

\{n,\}n个以上字符

sed工具

sed 可以将数据进行替换,删除,新增,选取待定等功能

sed [-n] [操作]

-n 安静模式

a:下行新增 ,c替换,d删除,i:下行插入,p:打印,s替换

sed '2,5d' 删除

sed '2a drink tea'

sed '2i drink tea'

sed -n '5, 7p'

sed 's/要被替换的字符/新的字符/g'

扩展正则表达式

+ 一个或者一个以上re字符

?0个或者一个re字符

| 或

()群组字符串

()+一个或者多个群组字符串

文件格式化与相关处理

格式化打印:printf

printf '打印格式' 实际内容(跟c语言的一样)

%ns n个字符

%ni n位整数

%N.nf N位整数,n位小数

printf '%s\t %s\t %s \t %s\t %s\t' $(cat printf.txt)

awk:好用的数据处理工具

awk '条件类型1{操作1} 条件类型2{操作2}...' filename

last -n 5 | awk '{print $1 "\t" $3}'

整个awk的处理流程:

1.读入第1行,并将第1行的数据写入$0,$1,$2等变量中

2.根据"条件类型"的限制,判断是否需要进行后续"操作"

3.完成所有操作与条件类型

4.递归处理后续行

awk是以行为一次处理单位,以字段为最小的处理单位

NF:每行拥有的字段数

NR:目前awk处理的是第几行

FS:目前的分隔符,默认是空格键

last -n 5 | awk '{print $1 "\t lines:" NR "\t columns:" NF}'

条件类型

> ,< ,>=, <=,  ==,!=

awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' 第一行还是默认以空格键处理

awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'

文件对比工具

diff from-file to-file 比较差异

cmp from-file to-file 比较差异

文件打印设置:pr

pr filename 打印文件内容

学习Shell脚本

shell脚本编写注意事项:

1.命令是从上而下,从左至右地分析与执行。

2.命令,选项,参数间的多个看空格会被忽视掉。

3.空白行也会被忽视掉。

4.读取到Enter符号就尝试开始执行该行命令。

5.一行内容太多,可以使用\[Enter]来扩展至下一行

6.#可以作为注解

shell执行(直接命令执行,shell.sh文件必须具备r和x权限):

1.绝对路径,使用/home/jackacmlove/shell.sh来执行命令。

2.相对路径,在/home/jackacmlove 工作目录下通过./shell.sh来执行命令。

3.变量[PATH]功能,将shell.sh放在PATH指定的目录内,例如~/bin 然后执行。

4. 以bash程序来执行:通过[bash shell.sh]或[sh shell.sh]来执行。

shell脚本的良好编写习惯

脚本的文件头处记录好:

1.脚本的功能

2.脚本的版本信息

3.脚本的作者与联络方式

4.脚本的版权声明方式

5.脚本的History(历史记录)

6.脚本内较特殊的命令,使用[绝对路径]的方式来执行

7.脚本运行时需要的环境变量预先声明与设置

简单的shell脚本学习

简单范例

1.交互式脚本:变量内容由用户决定

#!/bin/bash

read -p "Please input your first name" firstname
read -p "Please input your last name" lastname
echo -e "\n your full name is : $firstname $lastname"

2.随日期变化:利用date建立文件

echo -e "I will use 'touch' command to create 3 files."
read -p "Please input your filename: " fileuser
filename=${fileuser:-"filename"}
date1=$(date --date="2 days ago" +%Y%m%d)
date2=$(date --date="1 days ago" +%Y%m%d)
date3=$(date +%Y%m%d)
file1=${filename}${date1}
file2=${filename}${date2}
file3=$filename$date3
touch "${file1}"
touch "${file2}"
touch $file3

3.数值运算:简单的加减乘除

#!/bin/bash
echo -e "You SHOULD input 2numbers, I will multiplying them! \n"
read -p "fisrt number:" firstnum
read -p "second number:" secnum
total=$(($firstnum*$secnum))
echo -e "\nThe result of $firstnum * $secnum is ===> $total"

var=$((运算内容))

echo "4*5" | bc

脚本的执行方式差异(source,sh script,./script)

1.利用直接执行的方式来执行脚本,即前面介绍的几种方式

实际是利用子进程来执行的,那么变量或者操作结束后不会传回父进程

2.利用source来执行脚本:在父进程中执行

善用判断式

利用test命令的测试功能

检测系统,判断文件目录或者相关属性

test -e /jackacmlove 判断文件或目录是否存在(执行不会显示信息)

test -e /jackacmlove && echo "exist" || echo "Not exist"

-f 是否存在且为文件

-d 是否存在且为目录

利用判断符号[]

在中括号内的每个组件都需要有空格来分隔

在中括号内的变量,最好都以双引号括起来

在中括号内的常数,最好都以单或双引号括起来

shell脚本的默认变量($0,$1,$2.....)

$0代表文件名,后面还有$1,$2....

可以获取其参数 

$#代表参数的个数

$@代表参数组成的集合["$1" "$2" "$3"]

$* 代表参数集合["$1 $2 $3"]

shift:造成参数变量号码偏移。

shift n 向右移动n个参数

条件判断式

利用if...then

单层,简单条件判断式

if [ 条件判断式 ]; then

fi

[(条件1) -o (条件2)] == [(条件1)] || [(条件2)]

多重,复杂条件判断式

if [ 条件判断式 ]; then

else

fi

还有种情况

if [条件判断式];then

elif [条件判断式]; then

else

fi

利用case ... esac判断

case $变量名称 in

"第一个变量的内容" )

          程序段

          ;;

"第二个变量的内容" )

          程序段

          ;;

*)

         不包含第一个变量和第二个变量内容的代码执行段

         exit 1

        ;;

esac

利用function功能

function fname() {

        程序段

}

shell脚本的执行方式是由上而下,由左至右,因此在shell脚本当中的function的设置一定要在程序的最前面

循环(loop)

while do done,until do done(不定循环)

while [condition]  条件成立,循环

do

         程序段落

done

until [condition] 条件成立,终止循环

do

       程序段落

done

for...do...done(固定循环)

for var in con1 con2 con3 ...

do

          程序段落

done

$(seq 1 100)  seq连续的意思, 1-100个连续数字

for ... do ... done的数值处理

for (( 初始值;限制值;赋值运算))

do 

      程序段落

done

类似:for(int i = 0; i < 100; i++) {}

shell脚本的跟踪与调试

sh [-nvx] scripts.sh

-n:不要执行脚本,仅查询语法问题

-v:在执行脚本前,将脚本内容输出到屏幕上

-x:将使用到的脚本内容显示到屏幕上,即将执行过程全部列出来

Linux账号管理与ACL权限设置

关于用户组:有效与初始用户组,groups,newgr

初始用户组就是/etc/passwd里面的gid对应的用户组

有效用户组就是目前支持的用户组,通过groups查看,第一个就是有效用户组

groups能够查看所有支持的用户组

newgr 用户组 切换有效用户组 切换有效用户组即重新开启一个shell,可以使用exit退出

账号管理

新增与删除用户:useradd,相关配置文件,passwd,usermod,userdel

useradd 用户 创建普通用户即uid通常大于1000

普通用户会创建一个跟用户名相同的用户组,且会在/home目录下创建用户家目录,权限为700

useradd -r 用户 创建系统用户即uid通常小于1000

系统用户会创建一个跟用户名相同的用户组,系统用户不会创建家目录

用户账号与密码参数方面的文件:/etc/passwd,/etc/shadow

用户组相关文件:/etc/group,/etc/gshadow

用户的家目录:/home/账号名称

passwd [--stdin] 账号名称 修改自己的密码

--stdin 通过管道数据作为密码修改

passwd -S 账号名称 查看账号密码参数

chage [-ld] 账号  查看设置账号参数

-l 列出账号详细密码信息

chage -d 0 用户名  登录系统后,立刻修改密码

usermod跟useradd 类似,用来微调用户信息

usermod -G 用户组 username  设置用户的用户组,只会有一个用户组

usermod -a -G 用户组 username 添加用户的用户组

userdel  [-r] 用户名 删除用户

-r 连同用户家目录一同删除

完整删除步骤:

1. find / -user username 找到所有文件

2. rm -rf 掉他们

3. userdel -r username

用户功能

id 查看某人或者自己的相关uid/gid

finger 也能查看用户的详细信息,但是需要安装

chfn [用户名] 类似change finger的意思,修改用户信息

chsh [-ls] change shell 的简写

-l: 列出用户所有的shell

-s:设置一个shell

新增删除用户组

groupadd [-r] groupname 新增用户组

-r:新增系统用户组,uid小于1000

groupmod  [-g gid] [-n group_name] groupname

-g:修改用户组的id

-n group_name:修改用户名

groupdel groupname 删除用户组,必须保证用户组不是初始用户组

用户组管理员

gpasswd groupname 给用户组设置密码

gpasswd -r groupname 删除用户组密码

gpasswd -A user1,user2 。。。。 groupname 将user1,user2设置成groupname的管理员

gpasswd -a user3 groupname 添加用户user3到用户组

gpasswd -d user4 groupname 删除用户user4到用户组

该用户组成员就能newgrp了

主机的详细权限规划:ACL(访问控制列表)的使用

ACL主要设置用户,用户组以及默认属性的权限

ACL的设置技巧:getfacl,setfacl

setfacl:设置文件或目录的ACL规范

getfacl:获取文件或目录的ACL设置选项

setfacl [-bkRd] [-m | -x acl参数] 目标文件名

-m: 设置后续acl参数

-x:删除后续acl参数

-b:删除所有acl参数

-k:删除默认acl参数

-R:递归设置acl参数

-d:设置默认acl参数

1.针对使用者的方式[u::rwx]

setfacl -m u:jackacmlove:rwx filename

2.针对用户组的方式[g::rwx]

setfacl -m g:groupname:rwx filename

3.针对有效权限设置[m:rwx]

setfacl -m m:rwx filename

4.针对默认权限的设置方式[d:[ug]:使用者列表:[rwx]]

setfacl -m d:u:user:rwx /home

setfacl -m d:g:user:rwx /home 

这样在/home下新建文件或者目录,权限就变成了rwx

getfacl filename  查看filename的acl参数

setfacl -b filename 删除filename的所有acl参数

用户身份切换

让一般身份变成root的两种方式:

su - 切换成root身份执行

sudo 命令 不需要切换root身份,以root权限执行

su 切换身份

su [-l]

su - 或者 su -l 即以login-shell的方式登录,会首先读取/etc/profile然后按顺序读取~/.bash_profile,~/.bash_login,~/.profile其中一个,最终其实都会读取~/.bashrc配置文件

su username 则表示以nonlogin-shell的方式登录,读取配置文件不同,只会读取~/.bashrc

切换身份务必使用su -的方式

exit 退出su的环境

sudo

防止root密码泄露,可以把需要使用到root权限的用户通过sudo来执行命令

sudo必须要规范到/etc/sudoers内的用户才能执行

系统默认只有root可以执行sudo命令

visudo 或者vim /etc/sudoers修改文件内容

1.单一用户可以使用root所有命令,与sudoers文件语法

jackacmlove ALL= (ALL)    ALL

2.利用wheel用户组以及免密密麻麻的功能处理visudo

visudo

%wheel ALL=(ALL)    ALL  %后面代表用户组

然后把用户加入到wheel用户组即可

3.有限制的命令操作

jackacmlove ALL=(root) /usr/bin/passwd 命令必须是绝对路径

jackacmlove ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root passwd和passwd root不能用

4.通过别名创建visudo

visudo

User_Alias ADMPW = user1,user2

Cmnd_Alias  ADMPWCOM =  !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root passwd和passwd root

ADMPW ALL=(root) ADMPWCOM

Linux主机上的用户信息传递

查询用户:w,who,last,lastlog

w,who,last,lastlog都可以用来查看用户的登录情况

用户对谈:write,mesg,wall

用户邮箱:mail

Centos7 环境下大量创建账号的方法

账号检查工具

pwck 这个命令hi检查 /etc/passwd这个账号配置文件内的信息,检查实际的家目录是否存在等信息

pwconv 将/etc/passwd内的账号与密码移动到/etc/shadow,早期unix没有/etc/shadow

pwunconv 将/etc/shadow内的密码栏数据写回/etc/passwd中

chpasswd 读取未加密前的密码,并且经过加密后,将加密后的密码写入/etc/shadow中

大量创建账号模板(适用passwd --stdin选项)

鸟哥的私房菜P461页

计划任务

Linux计划任务的种类:at,cron

1.例行性任务,每隔一定周期就会执行一次

2.突发性任务,只做一次

at: at是可以处理且仅执行一次的命令

crontab:周期性的执行命令

仅执行一次的任务

at命令执行,需要先保证atd服务开启

systemctl restart atd

systemctl enable atd 开机时自动开启

systemctl status atd 查看状态

使用at命令产生所需要运行的任务,并将这个任务以文本文件的方式写入/var/spool/at/目录下,该任务就能够等待atd服务执行了

为了安全性,需要利用/etc/at.allow与/etc/at.deny两个文件实现对at的使用限制。加上这两个文件后,at的工作情况如下:

1.先寻找/etc/at.allow文件,写入这个文件中的用户才能使用at,没有写入这个文件的用户则不能使用at

2.如果/etc/at.allow不存在,就查找/etc/at.deny这个文件,写在这个/etc/at.deny中的用户则不能使用at,而没有在这个at.deny文件中的用户就可以使用at

3.如果两个文件都不存在,那么只有root可以使用at这个命令

实际运行单一计划任务

at now + 5 minutes

编辑完任务ctrl +d 结束,编辑时所用的命令必须是绝对路径,避免出问题

atq 查看任务

atrm(jobnumber) 删除任务

batch:系统有空时才执行任务,利用at来完成,它在cpu的任务负载小于0.8的时候,才执行你的任务。

uptime 可以查看到1分钟,5分钟,15分钟的平均任务负载量

循环执行的计划任务

为了避免安全性,crontab同样使用了两个配置文件:/etc/cron.allow和/etc/cron.deny

当用户使用crontab来建立计划任务后,该项任务会被记录到/var/spool/cron中,而且是以账号来作为判断依据的,比如jackacmlove创建任务后,任务会被记录在

/var/spool/cron/jackacmlove,但是不要用vi直接编辑文件,因为可能由于语法错误,导致cron无法执行。

crontab [-u username] [-l -e -r]

-u username:只有root能够执行这个命令,即给指定的username来建立/删除crontab计划任务

-l 查看crontab任务内容

-e 编辑crontab任务内容

-r 删除crontab任务内容(所有的都删除)

命令有六个字段:

分钟 0~59,小时0~23,日期1~31,月份1~12,周0~7(0和7都表示星期天),命令

* 代表任何时刻

, 代表分隔时段的意思,比如3,6即3和6

- 代表一段时间范围的意思,比如3-6,即3-6的意思

/n 那个n代表数字,即每个n单位间隔执行一次

个人化的操作使用crontab -e

系统维护管理使用 vim /etc/crontab

自己开发软件使用vim /etc/cron.d/newfile

可唤醒停机期间的工作任务

anacron命令

进程管理与SELinux初探

程序:通常是二进制程序,放置在存储媒介中,比如磁盘,光盘等,以物理文件的形式存在

进程:程序运行后,执行者的权限与属性,程序的代码以及数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符PID,

进程即一个运行的程序

父进程内执行命令,则每个命令会以子进程的方式执行,即也会被触发成PID,那么父进程就会有PPID

fork and exec:

进程都会借由父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制的子进程再以exec的方式来执行所需要执行的进程,从而成为一个子进程。

任务管理(job control)

任务管理是用在bash环境下的:当我们登录系统获取bash shell后,在单一终端下同时执行多个任务的操作管理

job control的管理

直接将命令丢到后台中[执行]的&

tar -zcvf /emp/etc.tar.gz /etc &

将[目前]的任务丢到后台中[暂停]:ctrl-z

查看目前的后台任务状态:jobs

jobs [-lrs]

-l:列出job number与命令串之外,同时列出pid号码

-r:列出run的后台任务

-s:列出stopped的后台任务

将后台任务拿到前台来处理:fg

fg %jobnumber(默认取出+那个任务,即最近的)

让任务在后台下的状态变成运行中:bg

bg %jobnumber

find / -perm /7000 > /tmp/text.txt

jobs; bg %3; jobs

管理后台当中的任务:kill

kill %jobnumber 正常结束一项任务

kill -9 %jobnumber 强制删除一个不正常的任务

脱机管理问题

nohup可以在脱机或者注销系统后,还能够让任务继续执行

nohup [命令与参数]

nohup [命令与参数] &

进程管理

查看进程

静态ps命令或者动态的top命令,以及pstree来查看进程之间的关系

ps -l 查看自己bash进程

F:代表进程标识,说明进程的权限,4代表root,1为子进程仅执行复制fork没有实际执行exec

S:代表进程状态,R(Running),S(sleep),D(不可以被唤醒的睡眠状态,比如等待I/O操作),T(Stop),Z(zombie):僵尸状态

C:cpu的使用率

PRI/NI 代表了进程被cpu执行的优先级,数值越小,优先级越高

ADDR/SZ/WCHAN : ADDR该线程在内存的哪个部分,如果是running进程,则显示- / SZ表示进程用了多少内存 / WCHAN表示目前进程是否还在运行

TTY:登录着使用的终端

TIME:CPU使用的时间

CMD:commend命令

ps aux 查看系统所有进程

USER:该进程所属用户账号

PID:该进程的id

%CPU:进程使用的cpu资源百分比

%MEM:进程使用的内存百分比

VSZ:进程使用的虚拟内存容量(KB)

RSS:进程使用的固定内存容量(KB)

TTY:进程在哪个终端运行

STAT:进程状态跟S一样

START:进程被触发的时间

TIME:进程实际使用cpu的时间

COMMEND:进程的实际命令

僵尸进程无法管理,而直接交给systemd这个进程负责,它所有进程的父进程。如果产生僵尸进程,而系统过一阵子也没办法通过内核特殊化处理来将其删除时,只能reboot

top:动态查看进程的变化

top [-d 数字] | top [-p]

-d 多少秒更新一次,默认是5秒

-p 指定特定的进程,不然显示全部进程

top默认使用cpu使用率%CPU来排序,如果想要使用内存使用率来排序,则可以按下M,若想要恢复按P,如果退出top按q即可

top显示进程详情后,按r给指定pid的进程设置NI即nice值

linux查看系统负荷

Linux操作系统_第2张图片

load average代表1分钟,5分钟,15分钟内系统的平均负荷。

单核cpu:

单核cpu每分钟处理100个进程,系统负荷0.2,意味着cpu一分钟处理20个线程,系统负荷1.0代表正好处理完成,系统负荷1.7意味着cpu正在处理的100个进程外,还有70个进程正排队等待着。

多核cpu:

单核cpu系统负荷为1.0时,饱和;多核cpu系统为n * 1.0时饱和。

cat /proc/cpuinfo 命令查看cpu信息

最佳观察时长为15分钟的平均负荷,1分钟的平均负荷只是暂时现象不足以说明问题。

pstree [-A |U] [-up] 显示进程之间的关联关系

-A 各进程树之间以ASCII字符来连接

-U 各进程树之间以Unicode字符来连接

-u 列出进程所属的用户

-p 列出进程的pid

进程的管理

进程之间可以相互控制。通过给予进程一个信号(signal)去告知进程做什么

kill -l 或者 man 7 signal 来查看信号

1 SIGNUP 启动被终止的进程,可以让PID重新读取自己的配置文件,类似重新启动

2 SIGINT 相当于用键盘输入ctrl -c 来中断一个进程的运行

9 SIGKILL 强制中断一个进程的运行,如果进程执行到一半,那么尚未完成的部分可能会有半成品产生

15 SIGTERM 以正常的方式结束进程

19 SIGSTOP 相当于键盘输入ctrl-z 来暂停一个进程的运行

kill或者killall来发送一个信号给某个进程

kill -signal PID

kill 可以帮我们将这个信号传送给某个任务(%jobnumber)或是某个PID,kill后面直接加输入和加上%number的情况是不同的

killall -singal 命令名称(kill通常要配合ps或者pstree来找到对应的进程PID,而killall则可以通过命令名称来给予信号)

关于进程的顺序

 Priority与 Nice值决定了进程的优先级

PRI值越低表示越优先,不过PRI值由内核动态调整,用户无法直接调整。

PRI(新) = PRI(old) + nice

所以可以通过设置NI的值来调整

nice值可调范围为-20~19

root可以随意调整自己或者他人进程的nice值,且范围为-20~19

一般用户仅可以调整自己进程的nice值,且范围为0~19(避免一般用户抢占系统资源)

调整nice值的两种方式:

1.一开始执行进程就立刻给予一个特定的nice值:用nice命令

nice [-n 数字] commend

nice -n 5 vim &

ps -l

kill -9 %1

2. 调整某个已经存在的PID的nice值:用renice命令

renice [number] PID

3.top命令,按r来调整进程的nice值

查看系统资源信息

free[-b|-k|-m|-g|-h] [-t] [-s N - c N] 查看内存使用情况

-b:直接free显示的是KBytes,Bytes

对应的k,m,g代表KBytes,MBytes,GBytes

-h人性化的显示

-s 让系统不断刷新, N多少秒刷新一次

-c free列出N次

uname:查看系统与内核相关信息

uname [-ar]

-a:所有系统相关信息

-r:内核版本

uptime:查看系统启动时间与任务负载

uptime输入top命令的最上面一行

netstat:追踪网络或socket文件

netstat -[atunlp]

-a:将目前系统上所有的连接,监听,socket信息都列出来

-t:列出tcp网络封包的信息

-u:列出udp网络封包的信息

-n:不以进程的服务名称,以端口号(port number)显示

-p:列出该网络服务的pid

netstat可以列出两个部分:网络连接以及linux的socket进程

通常查看网络连接:netstat -tulnp

dmesg:分析内核产生的信息

系统启动时,内核回去检测系统的硬件,你的某些硬件到底有没有被识别,就跟这个检测有关

显示的信息比较多,通常可以配合 |more 管道命令使用

vmstat:检测系统资源变化

vmstat可以检测[cpu/内存/磁盘/io状态]等

vmstat [延迟(秒) 总计检测次数] vmstat 3 5 总共检测5次,每次延迟3秒

进程字段的项目分别为:

r:等待运行中的进程数量

b:不可被唤醒的进程数量

这两项越多,代表系统越忙碌

内存字段项目分别为:

swpd:虚拟内存被使用的容量

free:未被使用的内存容量

buff:用于缓冲存储器

cache:用于高速缓存

内存交换分区(swap)的项目分别为:

si:由磁盘中将进程取出的容量

so:由于内存不足而将没用到的进程写入到磁盘的swap的容量

如果si和so数值太大,表示内存中的数据常常在磁盘与内存之间传输,系统性能比较差

磁盘读写(io)的项目分别为:

bi:由磁盘读入的区块数量

bo:写入到磁盘中的区块数量

这部分数值越高,代表系统的I/O越忙碌

系统的项目分别为:

in:每秒被中断的进程次数

cs:每秒执行的事件切换次数

这两个数值越大,代表系统与外接设备的沟通越频繁。这些接口设备包括磁盘,网卡等

CPU的项目分别为:

us:非内核的cpu使用状态

sy:内核层所使用的cpu状态

id:闲置的状态

wa:等待I/O所耗费的CPU状态

st:被虚拟机所使用的CPU状态

系统上所有的磁盘的读写状态

vmstat -d

特殊文件与进程

具有SUID/SGID权限的命令执行状态

SUID权限仅针对二进制程序有效。

执行者对程序需要具有x的可执行权限。

SUID权限仅在程序执行过程中有效

执行者将具有该程序拥有者的权限

/proc/*代表的意义

进程都是在内存中,而内存中的数据又都是写到/proc/*这个目录下的,所以我们可以直接查看/proc这个目录中的文件,目前主机上的个进程的PID都是以目录的形式存在于/proc当中,

比如第一个程序systemd的PID是1,这个PID的所有相关信息都写入/proc/1/*中

/proc/cmdline 加载内核时执行的相关命令与参数

/proc/cpuinfo cpu的相关信息

/proc/devices 系统主要设备的设备号

/proc/ioports 各个设备配置的I/O地址

/proc/meminfo 内存信息,使用free也能看到

查询已使用文件或已执行进程使用的文件

fuser:借由文件(或文件系统)找出正在使用该文件的进程(文件找进程)

fuser [-umv]  file/dir

-u 除了进程PID外,还会列出该进程的拥有者

-m:后面接的文件名会主动提到该文件系统的最顶层

-v:可以列出每个文件与进程还有命令的完整相关性 

lsof:列出被进程所使用的文件名称

lsof [-auU] [+d]

-a:多项数据需要[同时成立]采显示出结果

-u:后面跟username,列出该使用者相关进程所使用的文件

-U:仅列出Unix-like系统的socket文件类型

lsof -u root | grep bash

查看某些进程是否在使用某些文件 (进程找文件)

pidof:找出某个正在执行的进程的PID

pidof systemd rsyslogd 找出systemd跟rsyslogd两个进程的PID

认识系统服务

服务(service):内存中的进程且可以提供一些系统或网络功能。

守护神(daemon):完成service的程序

早期System V的init管理操作中daemon的主要分类(Optional)

服务的启动,关闭与查看等方式

所有的服务启动脚本放置在/etc/init.d目录

启动:/etc/init.d/daemon start

关闭:/etc/init.d/daemon stop

重启:/etc/init.d/daemon restart

查看状态:/etc/init.d/daemon status

服务启动的分类:

1.独立启动模式:服务独立启动,常驻内存中,反应速度快

2.超级守护进程:由特殊的xinetd或inetd两个总管程序提供socket对应或端口对应的管理

运行级别:0~6 init n

1.单人维护模式。3.纯命令模式。5.图形界面模式

制定运行级别默认要启动的服务

默认要启动:chkconfig daemon on

默认不启动:chkconfig daemon off

查看默认为启动与否 chkconfig --list daemon

运行级别的切换操作

init 数字

通过systemctl管理服务(默认操作.service单元)

system v需要service,chkconfig,setup,init等命令来协同,systemd只有一个systemctl命令而已

service对系统的服务进程管理

service daemon start

service daemon stop

service daemon restart

service daemon status

chkconfig:提供了一个维护/etc/rc[0~6]d文件夹的命令行工具,减轻了系统直接管理这些文件夹的符号链接的负担

chkconfig [--add] [--del] [--list] 系统服务 或 chkconfig [ --level <登录代表>][系统服务][on/off]

--add添加服务

--del删除服务

--list列出所有服务

on开启服务

off 关闭服务

通过systemctl管理单一服务(service unit)的启动/开机启动与查看状态

systemctl [command] [unit]

command:

start:启动  stop:关闭  restart:重启  reload:重新加载配置文件  enable:开机自启 disable 关闭开机自启

status:查看状态

systemctl status atd 或者systemctl status atd.service

服务状态:dead,active(running):正有1个或者多个进程在系统中运行,active(exited)仅执行一次就正常结束服务,active(waiting):正在运行中,不过需要等待其他事件发生才能继续执行。

目前的状态:enable:开机自启,disable:开机不自启,static,不可以自启动,但是可以被其他服务唤醒,mask无论如何都不能被启动

通过systemctl查看系统上所有的服务

systemctl [command] [--type=TYPE] [--all]

command:

列出系统上有启动的unit:

list-units:依据unit显示目前所有启动的unit,加上--all才会显示没启动的

列出系统上已安装的unit:

list-unit-files:依据/usr/lib/systemd/system内的文件,将所有文件列表说明

--type=TYPE:就是之前提高的unit类型,主要有service,socket,target等。

通过systemctl管理不同的操作环境(target units)

systemctl list-units --type=target --all 查看跟操作界面有关的target

centos默认有26个target unit

graphical.target:图形界面

multi-user:纯命令行模式

emergency.target:紧急处理系统的错误

shutdown.target 关机模式

systemctl get-default 查看默认操作模式

systemctl set-default multi-user.target 默认模式转为命令行模式

在不重新启动的情况下,将操作环境改为纯命令模式,关闭图形界面:

systemctl isolate multi-user.target

取得图形界面:

systemctl isolate graphical.target 

正常的切换情况下,使用上述isolate的方式即可,不过也有几个简单的命令来切换模式:

systemctl poweroff 系统关机

systemctl reboot 重新开机

systemctl suspend 挂起模式:将系统的状态保存到内存中,唤醒速度快

systemctl hibernate 休眠模式:将系统的状态保存到磁盘上,唤醒速度慢

systemctl rescue 恢复模式

systemctl emergency 紧急恢复模式

通过systemctl 分析各服务于之间的依赖性

systemctl list-dependencies [unit] [--reverse]

--reverse 反向追踪谁使用了该unit

与systemd的daemon运行过程相关的目录简介

systemd启动脚本配置文件在/usr/lib/systemd/system

/run/systemd/system 系统执行过程中产生的服务脚本,比/usr/lib/systemd/system的优先级高

/etc/systemd/system管理员依据主机系统的需求所建立的执行脚本,执行优先级比/run/systemd/system

/etc/sysconfig/* 几乎所有的服务都会将初始化的一些选项设置写入到该目录

/var/lib/ 产生数据的服务都会将它的数据写入到该目录

/run/ 放置了好多daemon的缓存,包括lock文件以及PID文件等。

systemd里面有很多的本机会用到的socket服务,这些服务可能会产生很多socket文件,怎么知道socket文件放置在哪里?

systemctl list-sockets

让服务与端口对应在一起:/etc/services

cat /etc/services 查看

第一列为daemon的名称 第二行为daemon使用的端口号与网络数据封包协议,主要有可靠连接的tcp封包和无连接的upd封包

关闭网络服务

产生一个网络监听端口的进程,就可以成为网络服务。

netstat -tunlp 查看网络端口

systemctl list-units ---all | grep xxxdaemon

systemctl stop xxxxx.service

systemctl stop xxxxx.target

systemctl disable xxxx.service xxxxx.target

netstat -tunlp 查看网络端口

systemctl针对service类型的配置文件

建立系统服务,就得到/etc/init.d/下面建立相对应的bash脚本完成

systemd的环境下面设置相关的服务启动环境,如果设置

systemctl配置文件相关目录简介

cat /usr/lib/systemd/system/sshd.service 默认配置文件位置

cat /etc/systemd/system/sshd.service 管理员修改配置文件位置

配置文件可以分为三大部分:

unit:unit本身说明,以及启动此unit的条件

[Service],[Socket],[Timer],[Mount],[Path]:不同的unit类型就要使用对应的设置项目

[install]:这个项目就是将此unit安装到那个target里面去的意思

认识与分析日志文件

centos7 日志文件简易说明

linux常见的日志文件文件名

/var/log/boot.log:开机启动的时候系统内核会去检测与启动硬件,接下来启动内核支持的功能等。

/var/log/cron crontab任务执行情况

/var/log/dmesg 开机时内核检测过程所产生的各项信息

/var/log/lastlog 最后一次登录的有关信息

/var/log/mail* 记录邮件的往来信息

/var/log/messages 记录系统发生的错误信息

/var/log/secure 所有需要输入账号密码的软件,登录信息都会记录在此

/var/log/wtmp,/var/log/faillog 正确登录系统的账户信息,错误登录系统的账户信息

日志文件内容的一般格式

时间发生的日期与时间

发生此事件的主机名

启动此事件的服务名称(systemd,crond等)或命令与函数名称(如su,login...)

该信息的实际内容

rsyslog.service:记录日志文件的服务

ps aux | grep rsyslog

systemcl status rsyslog.service

rsyslog.service的配置文件:/etc/rsyslog.conf

软件安装:源代码与Tarball

开放源码的软件安装与升级简介

什么是开放源码、编译程序与可执行文件

开放源码:程序代码,写给人类看的程序语言

编译程序:将源码编译成机器能看得懂的语言

可执行文件:经过编译变成二进制程序后机器看得懂可以执行的文件

什么是函数库

类似子程序的角色,可以被调用来执行的一段功能函数

什么是make与configure

一套软件不仅仅有一个程序,而是一对程序代码文件,所以除了每个主程序和子程序均需要编译过程的命令外,还需要写上最终的链接程序。使用make命令,可以简化编译过程。

(1)执行make时,会在当前目录查找Makefile文件,该文件记录了如何编译源码

(2)Makefile由检测程序创建,软件开发商都会写一个检测程序检测用户的当前环境,并创建Makefile文件。这个检测程序一般为configure或config

什么是tarball

源码体积较大,一般使用gzip等压缩得到的压缩后的源码包就是tarball。tarball一般包括以下文件:(1)源代码文件。(2)检测程序文件。(3)本软件的安装说明。

如何安装与升级软件

(1)直接以源码通过编译来安装升级

(2)直接以编译好的二进制程序来安装和升级

使用传统程序语言进行编译的简单房里

单一程序:打印Hello World

编辑源码

#include
int main(void)
{
        printf("Hello World\n");
}

编译与执行

[root@localhost ~]# gcc hello.c
[root@localhost ~]# ll hello.c a.out
-rwxr-xr-x. 1 root root 8503 9月   7 14:11 a.out
-rw-r--r--. 1 root root   63 9月   7 14:10 hello.c
[root@localhost ~]# ./a.out
Hello World

主程序、子程序链接:子程序的编译

编写主程序、子程序

[root@localhost ~]# vim thanks.c
#include
int main(void)
{
        printf("hello world \n");
        thanks_2();
}

[root@localhost ~]# vim thanks_2.c
#include
void thanks_2(void)
{
        printf("Thank you \n");
}

程序编译与链接

[root@localhost ~]# gcc -c thanks.c thanks_2.c
[root@localhost ~]# ll thanks*
-rw-r--r--. 1 root root   67 9月   7 14:26 thanks_2.c
-rw-r--r--. 1 root root 1496 9月   7 14:27 thanks_2.o
-rw-r--r--. 1 root root   77 9月   7 14:25 thanks.c
-rw-r--r--. 1 root root 1560 9月   7 14:27 thanks.o
[root@localhost ~]# gcc -o thanks thanks.o thanks_2.o
[root@localhost ~]# ./thanks
hello world 
Thank you 

调用外部函数库:加入链接的函数库

以下调用sin函数

[root@localhost ~]# vim sin.c
#include
int main(void)
{
        float value;
        value = sin(3.14/2);
        printf("%f\n",value);
}

编译时加入额外函数库链接

[root@localhost ~]# gcc sin.c -lm -L/lib -L/usr/lib
-l:是加入某个函数库的意思

m:则是libm.so这个函数库,lib和后缀.so不需要写

如果需要手动制定头文件(如stdio.h)的位置,可以加入”-I/usr/include“这样的指令,/usr/inlcude便是所制定的头文件存放路径

注:在我的centos7计算机上,直接使用gcc -sin.c可以编译通过,只是会报出不兼容的警告。在程序内加入#include便不再出现警告。反而使用以上代码手动加入额外的函数库,也不能消去警告。如下:

[root@localhost ~]# gcc sin.c -lm -L/lib -L/usr/lib
sin.c: 在函数‘main’中:
sin.c:5:10: 警告:隐式声明与内建函数‘sin’不兼容 [默认启用]
  value = sin(3.14/2);

用make进行宏编译

为什么要用make

假设有以下四个文件:

main.c

#include 
#define pi 3.14159
char name[15];
float angle;

int main(void)
{
    printf ("\n\nPlease input your name: ");
    scanf  ("%s", &name );
    printf ("\nPlease enter the degree angle (ex> 90): " );
    scanf  ("%f", &angle );
    haha( name );
    sin_value( angle );
    cos_value( angle );
}
​

haha.c

#include 
int haha(char name[15])
{
    printf ("\n\nHi, Dear %s, nice to meet you.", name);
}

cos_value.c

#include 
#include 
#define pi 3.14159
float angle;

void cos_value(void)
{
    float value;
    value = cos ( angle / 180. * pi );
    printf ("The Cos is: %5.2f\n",value);
}

sin_value.c

#include 
#include 
#define pi 3.14159
float angle;

void sin_value(void)
{
    float value;
    value = sin ( angle / 180. * pi );
    printf ("\nThe Sin is: %5.2f\n",value);
}

那么整个编译执行过程如下:

[root@localhost c]# gcc -c main.c
[root@localhost c]# gcc -c haha.c
[root@localhost c]# gcc -c sin_value.c
[root@localhost c]# gcc -c cos_value.c
[root@localhost c]# gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[root@localhost c]# ./main


Please input your name: wuchao

Please enter the degree angle (ex> 90): 30


Hi, Dear wuchao, nice to meet you.
The Sin is:  0.50
The Cos is:  0.87
[root@localhost c]# 

  以上编译过程相当麻烦

以下使用make的方式编译

使用make指令编译前,需要创建一个Makefile文件

Makefile文件内容如下:
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
[root@localhost c]# vim Makefile
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
#注意,gcc前面是tab键
[root@localhost c]# rm -f main*.o
[root@localhost c]# make
cc    -c -o main.o main.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[root@localhost c]# ./main


Please input your name: wuchao

Please enter the degree angle (ex> 90): 45


Hi, Dear wuchao, nice to meet you.
The Sin is:  0.71
The Cos is:  0.71

当我们修改过源码以后,再执行make时,只会编译那些修改过的源码文件

[root@localhost c]# make
make: “main”是最新的。

makefile的基本语法与变量

makefile文件格式如下:

目标:目标文件1 目标文件2

gcc -o 欲新建的可执行文件  目标文件1 目标文件2

目标就是我们想要建立的信息,而目标文件就是具有相关性的object files,建立可执行的文件的语法就是按键开头的那一行。

如果想要在makefile内执行多个操作,比如执行一个命令后立即清除目标文件和可执行文件,则如下:

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
clean:
        rm -f main main.o haha.o sin_value.o cos_value.o

以上代码包含两个目标main和clean,如果想要清除目标文件,可以执行”make clean“。如果想先清除再编译可执行”make clean main“。

[root@localhost c]# make clean main
rm -f main main.o haha.o sin_value.o cos_value.o
cc    -c -o main.o main.c
cc    -c -o haha.o haha.c
cc    -c -o sin_value.o sin_value.c
cc    -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[root@localhost c]# 

使用变量来简化makefile

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main:${OBJS}
        gcc -o main ${OBJS} ${LIBS}
clean:
        rm -f main ${OBJS}

变量的基本语法:

1. 变量与变量内容以”:“隔开,两边可以有空格

2. 变量左边不可以有

3. 变量与变量内容两边不能有”:“

4. 变量名最好使用大写

5. 运用变量时用或或()

6. 在该shell的环境变量是可以被套用的

7. 在命令行模式也可以定义变量

 

gcc在编译时会主动去读取CFLAGS这个环境变量,因此可以在命令行定义这个变量

[root@localhost c]# CFLAGS="-Wall" make clean main

也可以如下:

CFLAGS = -Wall
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main:${OBJS}
        gcc -o main ${OBJS} ${LIBS}
clean:
        rm -f main ${OBJS}

由于环境变量既可以在命令行输入,也可以在Makefile文件内指定,所以需要确定使用规则:

1. make命令行后面加的环境变量第一优先

2. makefile里面指定的环境变量第二优先

3. shell原本具有的环境变量第三优先

$@:代表当前的目标

每个makefile里面都有一个或多个目标名(如上面的main,clean),在每个目标下的指令中使用$@表示获取当前的目标名

CFLAGS = -Wall
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main:${OBJS}
        gcc -o $@ ${OBJS} ${LIBS}
clean:
        rm -f main ${OBJS}

函数库管理

动态与静态函数库

静态函数库

  • 扩展名为.a,通常名为libxxx.a
  • 编译时会直接将这个函数整合到执行程序中去,所以利用静态函数库编译的文件会比较大
  • 独立执行,不需要再向外部读取函数库的数据
  • 升级难度大,函数库升级后,原执行程序也必须重新编译

动态函数库

  • 扩展名为.so,通常名为libxxx.so
  • 编译时,函数库不会整合到执行程序中去
  • 执行时,函数库文件必须存在,目录也必须正确
  • 容易升级函数库,函数库即使升级,原程序也不需要重新编译

ldconfig与/etc/ld.so.conf

通过文件配置可以将特定的动态函数库加载到内存中,以提高读取性能。

1. 首先,在/etc/ld.so.conf下写入需要的动态函数库所在的目录

2. 利用ldconfig将/etc/ld.so.conf的数据读入缓存

3. 同时也将数据记录一份在/etc/ld.so.cache中

 

编辑配置文件/etc/ld.so.conf

[root@localhost c]# vim /etc/ld.so.conf

include ld.so.conf.d/*.conf
/usr/lib/mysql    #新添加的

读入缓存

[root@localhost c]# ldconfig

程序的动态函数库解析

查看二进制文件使用了哪些动态函数库

[root@localhost c]# ldd /usr/bin/passwd
    linux-vdso.so.1 =>  (0x00007ffc3b1b8000)
    libuser.so.1 => /lib64/libuser.so.1 (0x00007f48e7a48000)
    libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f48e77f8000)
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f48e74c0000)
    libpopt.so.0 => /lib64/libpopt.so.0 (0x00007f48e72b0000)
    libpam.so.0 => /lib64/libpam.so.0 (0x00007f48e70a0000)
    libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f48e6e98000)
    libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f48e6c70000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f48e6a48000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f48e6828000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f48e6460000)
    libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f48e6258000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f48e6020000)
    libffi.so.6 => /lib64/libffi.so.6 (0x00007f48e5e18000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f48e5c10000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f48e59a8000)
    liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f48e5780000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f48e7e88000)
    libfreebl3.so => /lib64/libfreebl3.so (0x00007f48e5578000)

检查软件的正确性

使用md5sum或sha1sum可以查看软件的MD5或SHA1编码

[root@localhost c]# md5sum main
e6adaa0b35ee4daa1cd7e43916e2d693  main
[root@localhost c]# sha1sum main
7735cf8f7ed60ccbad3dcf94fb52be0abe26817b  main

软件安装RPM,SRPM与YUM

Linux最常见的两种安装方式:

dpkg:代表ubuntu

RPM:centos

dpkg,rpm安装软件都或多或少存在软件属性依赖问题,即安装软件A前需要先安装软件B和软件C,为了解决软件属性依赖问题,linux开发商提供了[在线升级]功能,只要有网络,就能够获取开发商提供的任何软件了。

发行版代表 软件管理机制 使用命令 在线升级功能(命令)
centos RPM rpm,rpmbuild YUM(yum)
ubuntu DPKG dpkg APT(apt-get)

RPM与SRPM

一. RPM
RPM 全名是『 RedHat Package Manager 』简称则为 RPM !
xxxxxxxxx.rpm  <==RPM 的格式,已经经过编译且包装完成的 rpm 文件; 
xxxxx.src.rpm  <==SRPM的格式,包含未编译的原始码信息。
那么我们怎么知道这个套件的版本、适用的平台、打包的次数呢?呵呵!只要透过档名就可以知道了!例如 rp-pppoe-3.1-5.i386.rpm 这的档案的意义为:

rp-pppoe -  3.1    -   5  .   i386    .rpm 
 套件名称   套件的版本信息   释出的次数   适合的硬件平台  附文件名 

 套件名称
当然就是每一个套件的名称了!上面的范例就是 rp-pppoe 。

版本信息
每一次更新版本就需要有一个版本的信息,否则如何知道这一版是新是旧?这里通常又分为主版本跟次版本,以上面为例,主版本为 3 ,在主版本的架构下更动部分原始码内容,而释出一个新的版本,就是次版本啦!以上面为例,就是 1 啰!

释出版本次数
也就是编译的次数啦!那么为何需要重复的编译呢?这是由于同一版的套件中,可能由于有某些 bug 或者是安全上的顾虑,所以必须要重新设定当初打包时候的设定参数,设定完成之后重新编译并打包成 RPM 档案!因此就有不同的打包数出现了!

操作硬件平台
由于 RPM 可以适用在不同的操作平台上,但是由于不同的平台设定的参数还是有所差异性!并且,我们可以针对比较高阶的 CPU 来进行最佳化参数的设定,所以就有所谓的 i386, i586, i686 与 noarch 等的文件名称出现了! 

1. RPM 安装( install )

[root@test root]# rpm -ivh rp-pppoe-3.1-5.i386.rpm 
Preparing...     ####################################### [100%] 
   1:rp-pppoe    ####################################### [100%] 
# -i :install 的意思 
# -v :察看更细部的安装信息画面 
# -h :以安装信息列显示安装进度,例如上面的 # 字符号! 

# 如果要安装两个以上的套件时,可以这样: 

[root@test root]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm 
# 后面可以接多个套件! 

2. RPM 升级与更新
使用 RPM 来升级真是太简单!就以 -Uvh 或 -Fvh 来升级即可( 注:vh 的功能仍是在于显示细部信息与安装进度而已 )!  

-Uvh 后面接的套件即使没有安装过,则系统将予以直接安装;
     若后面接的套件有安装过旧版,则系统自动更新至新版;

-Fvh 如果后面接的套件并未安装到您的 Linux 系统上,则该套件不会被安装;
     亦即只有安装至您 Linux 系统内的套件会被『升级』

3. RPM 查询
RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm 这个目录下的数据库文件啦!另外, RPM 也可以查询文件内的信息喔!那如何去查询呢?我们底下以简单的范例来说明:

-q  套件 单纯的查询该套件的版本与是否存在而已,例如: 
rpm -q logrotate

-ql 套件 列出该套件的所有相关目录与文件!例如: 
rpm -ql logrotate

-qi 套件 列出该套件的 information (信息),里面的信息可多,包括了套件名称、版本、等等!

-qf 文件 这个参数后面接的可是『文件』!这个功能在查询系统的某个文件属于哪一个套件所有的。
举例来说,如果想要知道 /etc/logrotate.conf 是那个套件所提供的,可以这样:
rpm -qf /etc/logrotate.conf

-qc 套件 查询该套件的设定文件放置的完整目录名称,例如: 
rpm -qc logrotate

-qd 套件 查询该套件的文件说明数据文件放置的完整路径名称,例如: 
rpm -qd logrotate

-qR 套件 列出该套件需要预先安装的文件,亦即有属性相依套件的文件!例如: 
rpm -qR logrotate

-qa 后面什么都不必加入,直接输入 rpm -qa 即可得知目前 Linux 系统上面共以 RPM 的方式安装了多少的套件!

-qp[licdR] 文件 上面提到的都与系统的 /var/lib/rpm 内的数据库有关,而这里提到的则是与 RPM 档案本身有关。
举例来说,如果我下载了一个档名为 pkgname.i386.rpm 的文件,我想要知道他里面主要的讯息,则:
rpm -qpi pkgname.i386.rpm 
想要知道与他有关的套件,则: 
rpm -qpR pkgname.i386.rpm

4. RPM 卸载与重建数据库
要注意的是,『卸载的过程一定要由最上层往下』,以 rp-pppoe 为例,这一个套件主要是依据 ppp 这个套件来安装的,所以当您要删除 ppp 的时候,就必须要先删除 rp-pppoe 才行!否则就会发生结构上的问题啦!

那么重建数据库呢?由于我们会一直在修改一些文件内容,例如 /etc/xinetd.d 里头的参数文件,加上可能自系统操作的过程中新增、移除等等的动作,导致系统的数据库有点乱,这个时候可以使用 --rebuilddb 来重建一下 rpm 的数据库!这两个方法的参数如下啰:

[root@test root]# rpm -e logrotate  <==解安装 logrotate 套件 
[root@test root]# rpm --rebuilddb   <==重建数据库

二. SRPM
是 Source RPM 的意思,也就是这个 RPM 文件里面含有原始码( Source Code )!
1. 利用系统默认值安装 SRPM 文件
假设我下载了一个 SRPM 的文件,又不想要修订这个文件内的原始码与相关的设定值,那么我可以直接编译并安装吗?当然可以!利用rpmbuild 配合参数即可。参数主要有底下两个:

--rebuild 这个参数会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的文件,
但是产生的 RPM 文件并没有安装到系统上。
当您使用 --rebuild 的时候,最后通常会发现一行字体:Wrote: /usr/src/RPM/RPMS/i386/pkgname.i386.rpm
这个就是编译完成的 RPM 文件!那么这个文件就可以用来安装啦!安装的时候请加绝对路径来安装即可!

--recompile 这个动作会直接的『编译』『打包』并且『安装』!
请注意,recompile 不但进行编译跟打包,还同时进行『安装』了! 

2. SRPM 使用的路径与需要的套件
SRPM 既然含有 source code ,那么其中必定有设置文件啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候,会使用到哪些目录呢?这样一来才能够来修改嘛!你可以到你的 /usr/src 这个目录里面去查看一下:

/usr/src/redhat/SPEC 
这个目录当中放置的是该套件的设置文件,例如这个套件的信息参数、设定项目等等都放置在这里;

/usr/src/redhat/SOURCE 
这个目录当中放置的是该套件的原始档(*.tar.gz的文件)以及 config 这个设定档;

/usr/src/redhat/BUILD 
在编译的过程中,有些暂存的数据都会放置在这个目录当中;

/usr/src/redhat/RPMS 
经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当中。


此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误文件,您可以根据该错误文件进行除错的工作呢!等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的文件,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的文件都会被杀掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的文件了!
3. SRPM 的编译指令
修改完成了,自然就是要将他编译成可以安装的RPM文件啦!这个时候我们就可以直接在/usr/src/redhat/SPECS底下下达:

[root@test SPECS]# rpmbuild -bb rp-pppoe.spec  <==编译成RPM  文件
[root@test SPECS]# rpmbuild -ba rp-pppoe.spec  <==打包成SRPM 文件 

YUM

yum命令是在Fedora和RedHat以及SUSE中基于RPM的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
语法

yum(选项)(参数)

选项

-h:显示帮助信息;
-y:对所有的提问都回答“yes”; 
-c:指定配置文件; 
-q:安静模式; 
-v:详细模式; 
-d:设置调试等级(0-10); 
-e:设置错误等级(0-10); 
-R:设置yum处理一个命令的最大等待时间; 
-C:完全从缓存中运行,而不去下载或者更新任何头文件。

参数

install:安装rpm软件包;
update:更新rpm软件包; 
check-update:检查是否有可用的更新rpm软件包; 
remove:删除指定的rpm软件包; 
list:显示软件包的信息; 
search:检查软件包的信息; 
info:显示指定的rpm软件包的描述信息和概要信息; 
clean:清理yum过期的缓存; 
shell:进入yum的shell提示符; 
resolvedep:显示rpm软件包的依赖关系; 
localinstall:安装本地的rpm软件包; 
localupdate:显示本地rpm软件包进行更新; 
deplist:显示rpm软件包的所有依赖关系。

实例

安装

yum install #全部安装 
yum install package1 #安装指定的安装包package1 
yum groupinsall group1 #安装程序组group1

更新和升级

yum update #全部更新 
yum update package1 #更新指定程序包package1 
yum check-update #检查可更新的程序 
yum upgrade package1 #升级指定程序包package1 
yum groupupdate group1 #升级程序组group1

查找和显示

yum info package1 #显示安装包信息package1 
yum list #显示所有已经安装和可以安装的程序包 
yum list package1 #显示指定程序包安装情况package1 
yum groupinfo group1 #显示程序组group1信息
yum search string 根据关键字string查找安装包

删除程序

yum remove | erase package1 #删除程序包package1 
yum groupremove group1 #删除程序组group1 
yum deplist package1 #查看程序package1依赖情况

清除缓存

yum clean packages #清除缓存目录下的软件包 
yum clean headers #清除缓存目录下的 headers 
yum clean oldheaders #清除缓存目录下旧的 headers

一、dpkg

1、简介

        dpkg - package manager for Debian  (debian系统的包管理工具)。

        dpkg is a tool to install, build, remove and manage Debian packages,dpkg是Debian的一个底层包管理工具,主要用于对已下载到本地和已安装的软件包进行管理。

        dpkg这个机制最早由Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时能提供安装后的软件信息,实在非常不错。只要派生于Debian的其它Linux distributions大多使用dpkg这个机制来管理,包括B2D,Ubuntu等。

2、deb软件包名规则

格式为:Package_Version-Build_Architecture.deb

如:nano_1.3.10-2_i386.deb

* 软件包名称(Package Name): nano

* 版本(Version Number):1.3.10

* 修订号(Build Number):2

* 平台(Architecture):i386

3、dpkg软件包相关文件介绍

 

/etc/dpkg/dpkg.cfg        dpkg包管理软件的配置文件【Configuration file with default options】
/var/log/dpkg.log         dpkg包管理软件的日志文件【Default log file (see /etc/dpkg/dpkg.cfg(5) and option --log)】
/var/lib/dpkg/available   存放系统所有安装过的软件包信息【List of available packages.】
/var/lib/dpkg/status      存放系统现在所有安装软件的状态信息
/var/lib/dpkg/info        记安装软件包控制目录的控制信息文件

4、dpkg数据库

        dpkg 使用文本文件作为数据库来维护系统中软件,包括文件清单, 依赖关系, 软件状态, 等等详细的内容,通常在 /var/lib/dpkg 目录下。 通常在 status 文件中存储软件状态和控制信息。 在 info/ 目录下备份控制文件, 并在其下的 .list 文件中记录安装文件清单, 其下的 .mdasums 保存文件的 MD5 编码。

例:查询dpkg数据库(显示所有已安装的Deb包)。

lzb@lzb:~$ dpkg -l
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称           版本         体系结构:   描述
+++-==============-============-============-=================================
ii  a11y-profile-m 0.1.10-0ubun amd64        Accessibility Profile Manager - U
ii  account-plugin 0.12+16.04.2 all          GNOME Control Center account plug
ii  account-plugin 0.12+16.04.2 all          GNOME Control Center account plug
ii  account-plugin 0.12+16.04.2 all          GNOME Control Center account plug
ii  accountsservic 0.6.40-2ubun amd64        query and manipulate user account
ii  acl            2.2.52-3     amd64        Access control list utilities
ii  acpi-support   0.142        amd64        scripts for handling many ACPI ev
ii  acpid          1:2.0.26-1ub amd64        Advanced Configuration and Power 
ii  activity-log-m 0.9.7-0ubunt amd64        blacklist configuration user inte
ii  adduser        3.113+nmu3ub all          add and remove users and groups
ii  adium-theme-ub 0.3.4-0ubunt all          Adium message style for Ubuntu
ii  gir1.2-pango-1 1.38.1-1     amd64        ..............................
..............................................................................

如上图,每条记录对应一个软件包,注意每条记录的第一、二、三个字符,这就是软件包的状态标识,后边依此是软件包名称、版本号和简单描述。

1)第一字符为期望值(Desired=Unknown/Install/Remove/Purge/Hold),它包括:

u  Unknown状态未知,这意味着软件包未安装,并且用户也未发出安装请求.
i  Install用户请求安装软件包.
r  Remove用户请求卸载软件包.
p  Purge用户请求清除软件包.
h  Hold用户请求保持软件包版本锁定.

2)第二列,是软件包的当前状态(Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend)

 

n  Not软件包未安装.
i  Inst软件包安装并完成配置.
c  Conf-files软件包以前安装过,现在删除了,但是它的配置文件还留在系统中.
u  Unpacked软件包被解包,但还未配置.
f  halF-conf试图配置软件包,但是失败了.
h  Half-inst软件包安装,但是但是没有成功.
w trig-aWait触发器等待
t Trig-pend触发器未决

3)第三列标识错误状态,第一种状态标识没有问题,为空. 其它符号则标识相应问题(Err?=(none)/Reinst-required (Status,Err: uppercase=bad))

h  软件包被强制保持,因为有其它软件包依赖需求,无法升级.
r  Reinst-required,软件包被破坏,可能需要重新安装才能正常使用(包括删除).
x  软包件被破坏,并且被强制保持.

案例说明:

ii —— 表示系统正常安装了该软件
pn —— 表示安装了该软件,后来又清除了
un —— 表示从未安装过该软件
iu —— 表示安装了该软件,但是未配置
rc —— 该软件已被删除,但配置文件仍在

5、dpkg子命令

为了方便用户使用,dpkg不仅提供了大量的参数选项, 同时也提供了许多子命令。

比如:

dpkg-deb、dpkg-divert、dpkg-query、dpkg-split、dpkg-statoverride、start-stop-daemon

这里将不会对dpkg的命令作详细说明,如需了解可自行查阅资料。

二、dpkg使用手册

1、安装

1)安装相关命令

dpkg -i package-name.deb             // --install, 安装软件包,必须是deb包的完整名称。(软件的安装可被拆分为两个对立的过程“解包”和“配置”)
dpkg --unpack package-name.deb       // “解包”:解开软件包到系统目录但不配置,如果和-R一起使用,参数可以是一个目录
dpkg --configure package-name.deb    //“配置”:配置软件包
dpkg -c package-name.deb             //列出 deb 包的内容

2)安装相关选项

-R, --recursive    Recursively handle all regular files matching pattern *.deb found at specified directories and all of its
 subdirectories. This can be  used  with -i, -A, --install, --unpack and --avail actions(递归地指向特定目录的所有安装包,可以结合-i,
 -A, --install, --unpack 与 --avail一起使用)

2、移除软件包

dpkg -r package-name  // --remove, 移除软件包,但保留其配置文件
dpkg -P package-name  // --purge, 清除软件包的所有文件(removes everything, including conffiles)

3、查询

dpkg -l package-name     // --list      查看系统中package-name软件包
dpkg -L package-name     //--listfiles 查看package-name对应的软件包安装的文件及目录
dpkg -s package-name     //--status    查看package-name对应的软件包信息
dpkg -S filename          // --search 查询系统中某个文件属于哪个软件包
dpkg --info package-name.deb       //--列出软件包解包后的包名称

例1:列出系统上安装的与dpkg相关的软件包

dpkg -l \*dpkg*

更多dpkg的使用方法可在命令行里使用man dpkg来查阅 或直接使用dpkg --help

三、apt

1、apt简介

        虽然我们在使用dpkg时,已经解决掉了 软件安装过程中的大量问题,但是当依赖关系不满足时,仍然需要手动解决,而apt这个工具解决了这样的问题,linux distribution 先将软件放置到对应的服务器中,然后分析软件的依赖关系,并且记录下来,然后当客户端有安装软件需求时,通过清单列表与本地的dpkg已存在的软件数据相比较,就能从网络端获取所有需要的具有依赖属性的软件了。

2、工作原理

  Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源。

       然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在Ubuntu系统中,使用软件源配置文件/etc/apt/sources.list列出最合适访问的镜像站点地址。

例1:apt-get的更新过程

1)执行apt-get update
2)程序分析/etc/apt/sources.list
3)自动连网寻找list中对应的Packages/Sources/Release列表文件,如果有更新则下载之,存入/var/lib/apt/lists/目录
4)然后 apt-get install 相应的包 ,下载并安装。

  即使这样,软件源配置文件只是告知Ubuntu系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。因而,就有必要为这些软件资源列个清单(建立索引文件),以便本地主机查询。

        用户可以使用“apt-get update”命令刷新软件源,建立更新软件包列表。在Ubuntu Linux中,“apt-get update”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。 使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。因此,在计算机设备空闲时,经常使用“apt-get update”命令刷新软件源,是一个好的习惯。

例2:apt-get install原理图

Linux操作系统_第3张图片

3、apt相关文件

var/lib/dpkg/available      文件的内容是软件包的描述信息, 该软件包括当前系统所使用的Debian 安装源中的所有软件包,其中包括当前系统中已安装的
和未安装的软件包.
/etc/apt/sources.list         记录软件源的地址(当你执行 sudo apt-get install xxx 时,Ubuntu 就去这些站点下载软件包到本地并执行安装)
/var/cache/apt/archives   已经下载到的软件包都放在这里(用 apt-get install 安装软件时,软件包的临时存放路径)
/var/lib/apt/lists                使用apt-get update命令会从/etc/apt/sources.list中下载软件列表,并保存到该目录。

4、源文件

  apt的源文件由配置文件/etc/apt/sources.list指定,想要具体了解请访问上一篇博客:

 https://www.cnblogs.com/liuzhenbo/p/11069285.html

四、apt使用手册

1、apt-get

        apt-get is the command-line tool for handling packages, and may be considered the user's "back-end" to other tools using the APT library. Several "front-end" interfaces exist, such as dselect(1), aptitude(8), synaptic(8) and wajig(1).

        apt-get 是一个下载安装软件包的简单命令行接口。最常用的命令是update(更新)和install(安装)。

用法: apt-get [选项] 命令

常用选项:

-h 本帮助文件。
-q 输出到日志 - 无进展指示
-qq 不输出信息,错误除外
-d 仅下载 - 不安装或解压归档文件
-s 不实际安装。模拟执行命令
-y 假定对所有的询问选是,不提示
-f 尝试修正系统依赖损坏处
-m 如果归档无法定位,尝试继续
-u 同时显示更新软件包的列表
-b 获取源码包后编译
-V 显示详细的版本号
-c=? 阅读此配置文件
-o=? 设置自定的配置选项,如 -o dir::cache=/tmp

常用命令:

//查询适合当前系统和CPU架构的相关软件包版本
http://manpages.ubuntu.com/manpages/xenial/man1/apt-show-versions.1p.html  //查找官方网站
apt-cache madison package_name  //将列出版本
apt-cache policy package_name   //详细列出信息
//下载,安装
1)apt-get update  更新源    
2)apt-get dist-upgrade  升级系统到相应的发行版(根据 source.list 的配置)  
3)apt-get upgrade  更新所有已经安装的软件包     
4)apt-get install package_name  安装软件包(加上 --reinstall重新安装)
   apt-get install package_name=version    安装指定版本的软件包    
5) apt-get -f install  //安裝依賴
例子:
    sudo dpkg -i bcloud-x.x.x.deb
    sudo apt-get -f install
//删除,卸载
1)apt-get remove  package_name    //删除已安装的软件包(保留配置文件),不会删除依赖软件包,且保留配置文件。
2)apt-get --purge remove package_name   //删除已安装包(不保留配置文件);如软件包a依赖软件包b,执行该命令会删除a,而且不保留配置文件。 
3)
apt-get autoremove
  //删除为了满足依赖而安装的,但现在不再需要的软件包(包括已安装包),保留配置文件。
//清理缓存
1)apt-get autoclean   //定期运行这个命令来清除那些已经卸载的软件包的.deb文件。APT的底层包是dpkg, 而dpkg 安装Package时, 会将 *.deb 放在 /var/cache/apt/archives/中,apt-get autoclean 只会删除 /var/cache/apt/archives/ 已经过期的deb。
2)apt-get clean      //使用 apt-get clean 会将 /var/cache/apt/archives/ 的所有 deb 删掉

2、apt-cache

apt-cache是linux下的一个apt软件包管理工具。APT包管理的大多数信息查询功能都可以由apt-cache命令实现,通过apt-cache命令配合不同的子命令和参数的使用,可以实现查找,显示软件包信息及包依赖关系等功能.

1)apt-cache depends packagename   了解使用依赖
2)apt-cache rdepends packagename  是查看该包被哪些包依赖
3)apt-cache search  packagename   搜索软件包,可以按关键字查找软件包,通常用于查询的关键字会使用软件包的名字或软件包的一部分  
4)apt-cache show packagename      查询指定包的详情,不管是否已经安装。获取包的相关信息,如说明、大小、版本等
5)apt-cache showpkg packagename   显示软件包的大致信息

Linux内核编译与管理

 

 

你可能感兴趣的:(linux,linux)