Linux
第一讲
Linux的起源、历史、特点、定义
- Linux是一个类Unix内核的可以自由发布的实现版本,是一个操作系统的底层核心(内核)
- Linux => 内核
- Linux系统 => 内核 + 工具 + 配套软件
- 特点:
- 开放性(遵循标准)
- 多用户
- 多任务
- 良好的用户界面
- 设备独立性(把外部设备当做文件处理)
- 丰富的网络功能
- 可靠的系统安全
- 良好的可移植性
GNU、GPL
- GNU = GNU‘s Not Unix
- GNU计划:1983年Richard Stallman创办GNU计划,旨在建立一套完全自由和可移植的类Unix操作系统
- GNU GPL:GNU General Public License(GNU通用公共许可证)
- GPL核心思想:
保证任何人有共享、修改、发布自由软件的自由
自由软件的衍生产品必须以GPL为重新发布的许可证
允许公司销售自由软件(硬件/服务),提供源代码
常见发行版本
redhat,centos,ubuntu,puppy。。。
商业、共享、自由和免费软件的区别和联系
商业软件
- Commercial Software
- 由开发者出售拷贝并提供技术服务
- 用户只有使用权
- 不提供源代码
共享(试用软件)
- Shareware
- 开发者提供软件试用程序拷贝授权、升级和技术服务
- 用户在试用该程序拷贝一段时间之后,必须向开发者交纳使用费用,否则不能继续使用
- 不提供源代码
自由软件
- Freeware或Free Software
- 提供源代码
- 任何人都可以自由传播、下载、使用、改写、重新发布
- 自由软件不一定免费
免费软件
- Freeware
- 不需付钱,但免费软件不一定提供源代码
- 只有当自由软件免费或者免费软件提供源代码的时候才是一样的
第二讲
Linux的安装方式(区别和联系,如何选择)、安装过程、远程连接方式
Linux内核版本号
内核版本号
- 由Linus等人制定和维护,全球统一
- 内核版本号格式:x. y. zz
- x为主版本号
- y为次版本号
- zz为次次版本号
稳定版
- 内核的特性已经固定,代码运行稳定可靠,不再增加新的特性,要改进也只是修改代码中的错误。
2.6及以下版本(x.y.zz)
- 次版本号=偶数 => 稳定版本
- 次版本号=奇数 => 测试版本
3.0开始
- 次版本号不再表示一个内核是稳定版本还是测试版本,所有发布出来的正式版本都是稳定版本
发行版本号
- 由各个发行公司或者组织自行制定
- 不同公司的发行版本之间无可比性
Linux目录结构、常见目录的作用和存放内容
- /bin:常见系统程序目录
- /boot:开机设定目录,也是摆放核心vmlinuz的地方
- /dev: 摆放系统设备装置文件的目录
- /etc:系统配置文件,尤其passwd,shadow
- /etc/rc.d/init.d:系统开机的时候载入服务的scripts的摆放地点
- /home:系统使用者的目录
- /lib:Linux执行或编译程序函数库目录
- /mnt:软驱与光驱接入挂载的地方
- /proc:系统核心与执行程序的一些信息
- /root:系统管理员的目录
- /usr/bin,/bin:一般执行文件摆放的地方
- /usr/sbin,/sbin:系统管理员常用指令集
- /var:摆放系统日志文件的地方
- /lost+fount:摆放系统不正常产生错误时遗失的片段
Linux系统结构图、主要组件构成
系统结构图
主要组件构成
关机、重启命令
不允许普通用户关机和重启
关机
- shutdown -h now
- init 0
- halt -p
- poweroff -p
重启
-
shutdown -r now
-
init 6
-
reboot
shutdown [选项] 时间 [消息]
选项 | 描述 |
---|---|
-t seconds | 设定在几秒钟之后进行关机程序 |
-k | 并不会真的关机,只是将警告讯息传送给所有使用者 |
-r | 关机后重新开机 |
-h | 关机后停机 |
-n | 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机 |
-c | 取消目前已经进行中的关机动作 |
time | 设定关机的时间 |
message | 传送给所有使用者的警告讯息 |
init 运行级别代码
代码 | 描述 |
---|---|
0 | 关机级别 |
1 | 单用户运行级别 |
2 | 多用户,字符模式,但系统不会启动NFS |
3 | 多用户,字符模式,系统启动具有网络功能,常用运行级别 |
4 | 用户自定义级别 |
5 | 图形界面模式,常用运行级别 |
6 | 重启级别 |
halt [选项]
选项 | 描述 |
---|---|
-d | 不要在wtmp中记录(记录开关机等信息的二进制文件) |
-f | 不论目前的runlevel为何,不调用shutdown即强制关闭系统 |
-i | 在halt之前,关闭全部的网络界面 |
-n | halt前,不用先执行sync |
-p | halt之后,执行poweroff关闭电源 |
-w | 取消目前已经进行中的关机动作 |
reboot [选项]
选项 | 描述 |
---|---|
-d | 不把记录写到 wtmp 档案里 |
-f | 强迫重开机,不呼叫 shutdown 这个指令 |
-i | 在重开机之前,关闭全部的网络界面 |
-n | 在重开机前不做将记忆体资料写回硬盘的动作 |
-w | 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里 |
说明文档查看
man | info
man xxx | info xxx
-
回车 下一行
-
空格 下一页
-
q 退出
有些命令提供了–help或者-h选项,可以查看命令的使用说明
第三讲
Linux交互方式
shell的作用、种类、默认shell
作用
-
Shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令,返回执行结果
-
在Linux中可存在多种Shell,一个用户同一时刻只能使用一个shell
-
实现自动化运维
-
查看当前系统支持的Shell列表
¨# cat /etc/shells
查看当前用户使用的Shell版本
¨# echo $SHELL
种类
-
ash
贝尔实验室开发的shell,bsh是对ash的符号链接 -
bash
GNU的Bourne Again Shell,是GNU Linux操作系统上默认的Shell。sh以及bash2都是对它的符号链接 -
tcsh
是Berkeley UNIX C Shell。csh是对它的符号链接。
-
ksh
Korn Shell的语法与Bourne Shell相同,同时具 备了C Shell的易用特点
-
zsh
Korn Shell 的一个增强版本,具备bash Shell 的许多特点。
默认shell
- GNU Linux工具中使用的是 bash shell
- 作为/bin/sh被默认安装
- 大多数Linux发行版中,shell程序/bin/sh实际上是对程序/bin/bash的一个链接
- 如何知道/bin/sh链接到/bin/bash?
ls -l /bin/sh
shell的功能(命令行提示符、自动补齐、历史记录查看、常用的快捷键、重定向、管道)
-
root(超级管理员)的命令提示符
-
$
非root用户的命令提示符历史记录查看
键盘↑↓键 上下翻看历史输入命令
ctrl + p前一条指令
ctrl + n后一条指令
ctrl + r 反向搜索命令历史记录
输入内容后,系统会找到最近一个包含这个内容的命令
找到命令后,按回车执行命令,按上下键查找该命令前后命令,按左右键移动光标并修改命令
光标移动
-
ctrl + a 移动光标到行首
-
ctrl + e 移动光标到行尾
-
ctrl + d 删除光标所在字符
-
ctrl + u 剪切到行首
-
ctrl + k 剪切到行尾
重定向
n< 文件
输入重定向
wc -l < list.txt
n> 文件
输出重定向 覆盖原有内容
ls > list.txt
n>> 文件
追加重定向 文件末尾添加
echo abc >> list.txt
clear、echo、ls、cd、pwd、mkdir、rmdir、rm、touch、cat、more、less、head、tail、cp、mv(自己看PPT)
文件类型、相对路径、绝对路径、用户主目录、特殊目录、当前目录、工作目录
文件类型
- 普通文件:[ - ]
纯文字文件(ascii)或 二进制文件 - 目录: [ d ]
- 链接文件: [ l ]
- 设备文件:
区块设备文件:[ b ];
字符设备文件:[ c ] - 管道文件: [ p ]
- Socket文件: [ s ]
绝对路径
指从“根”开始的路径,也称为完全路径
相对路径
指从用户工作目录开始的路径
特殊目录
- “.”代表该目录自己
- “…”代表该目录的父目录
- 对于根目录,“.”和“…”都代表其自己
工作目录/当前目录
用户登录系统后,某一时刻处在的目录,也称为当前目录
用户主目录
- 添加用户时为该用户建立起来的目录
- 每个用户都有自己的主目录 (普通用户一般在/home下,root用户在/root下)
- 用户主目录可以用符号 ~表示
- 快速回到当前用户的主目录 cd ~
第四讲
用户类型
- 超级用户
root,根用户,有最高的权限,可以对linux做任何操作 - 普通用户
受限的权限,没有对系统的完全控制权,用户之间私人的资源是相互隔离的 - 系统用户
与系统和程序服务相关的用户
默认情况下,这些特殊用户的无法登录的,如果给这些用户授权登录口令后,就可以使这些用户登录系统
/etc/passwd 作用和内容
用户信息文件
-
每一行存储一个用户的账号信息
-
用户名:加密密码:用户ID:用户组ID:用户信息:用户主目录:登录Shell
-
超级用户root的UID是0
系统用户的UID在1000以内
普通用户的UID从1000开始往上编号
/etc/shadow /etc/group作用
口令文件/etc/shadow
- 每一行存储一个用户的登录密码信息,加密
- 只有root用户才能读取这个文件
/etc/group
- 每一行记录系统中的用户组信息
- 组名:密码字段:用户组ID:用户名列表
useradd、passwd、usermod、userdel、groupadd、groupdel、chmod、chown、chgrp、ln、tar、gzip、unzip、awk、sed、cut、tr、find、grep(自己看PPT)
软连接和硬连接的区别和联系
硬连接(hard link)
给文件一个副本(别名),同时建立两者之间的连接关系,修改其中一个,与其连接的文件同时被修改,如果删除其中一个,其余的文件不受影响。磁盘上只有一份数据。硬链接是存在同一个文件系统中。
软连接(symbolic link)
软链接的方式则是产生一个特殊的文件,该文件的内容是指向另一个文件的位置。它只是一个快捷方式,删除了源文件,这个连接文件就没用了。软链接可以跨越不同的文件系统。
区别与联系
-
适用场景
-
inode节点
-
链接数
-
文件的属性
-
对链接进行操作(修改,删除)对原文件的影响
-
对原文件进行操作(修改,删除)对链接的影响
-
需要指定绝对路径,否则链接失效
-
联系:
-
对软链接或硬链接的内容进行修改,会对原文件有效
-
删除软链接或硬链接本身,不会对原文件有影响
-
常见正则表达式
- ^
锚定行的开始,如:‘^grep’ 匹配所有以grep开头的行 - $
锚定行的结束,如:‘grep$’ 匹配所有以grep结尾的行 - .
匹配一个非换行符的字符,如:‘gr.p’ 匹配gr后接一个任意字符,然后是p -
- []
匹配一个指定范围内的字符,如:‘[Gg]rep’ 匹配Grep和grep - [^]
匹配一个不在指定范围内的字符,如:‘[^A-F]rep’ 匹配不包含A-F的一个字母开头,紧跟rep的行 - \(…\)
标记匹配字符,如:‘\(love\)’ ,love被标记为1 - \<
锚定单词的开始,如:'\<grep’匹配包含以grep开头的单词的行 - \>
锚定单词的结束,如:'grep\>'匹配包含以grep结尾的单词的行 - x\{m\}
重复字符x,m次,如:‘o\{5\}’ 匹配包含5个o的行 - x\{m,\}
重复字符x,至少m次,如:‘o\{5,\}’ 匹配至少有5个o的行 - x\{m,n\}
重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5–10个o的行
第五讲
cal、date、wc、sort、which、whereis、su、yum、sudo(自己看PPT)
vi三种模式的功能、切换
命令模式
- 启动vi后默认模式
- 按下ESC键可进入命令模式
- 输入的字符被当成命令,字符不回显
插入模式
-
命令模式下通过i、a、o、c、r、s等命令进入
-
输入的字符被当成文本内容,显示在屏幕上
末行模式
-
命令模式下通过:、/、?等命令进入
-
显示在屏幕的最后一行
-
命令执行后,自动切换到命令模式
末行模式:保存、退出、显示/取消行号、搜索、替换
保存:
:q #正常退出。 如果文件有修改未保存需要强制退出
:q! #强制退出
:w #写入文件
:w filename #另存为
:wq #写入后退出
:wq! #写入后强制退出
:x #:wq一样
行号:
临时
:set nu | :set number #显示所有行号
:nu | :number #显示光标所在行号
:set nonu | :set nonumber #取消行号显示
长期
~/.vimrc #当前用户下的vim配置文件
搜索:
/xx
从光标所在位置往下搜索
?xx
从光标所在位置往上搜索
切换匹配项
n #向下搜索下一个匹配项
N #向上搜索上一个匹配项
替换:
😒/x/y
把光标所在行第一个匹配的x替换为y
:n,m s/x/y
把第n行到m行中每行中第一个匹配的x替换为y
:% s/x/y
把当前文件中所有行的第一个匹配的x替换为y
g : 全局 => 把每一行中所有的匹配项都替换
😒/x/y/g
:n,m s/x/y/g
:% s/x/y/g
命令模式:光标移动、删除恢复、复制粘贴、替换、切换到插入模式(含课外补充内容、课外作业)
光标移动:
h(左), j(下), k(上), l(右) <=> 键盘上下左右键
$ #移动到行未
0,^ #移动到行首
gg #定位第一行行首
G #定位末行行首
nG #定位到第n行行首
n+ #向下移动n行
n- #向上移动n行
删除&恢复:
x | nx #删除一/n个字符
dd | ndd #删除一/n行
d[w|e|b|$|^|G|gg …]
删除光标移动范围内的内容
u #撤销上一步操作
U #撤销对当前行的所有操作
复制&粘贴:
yy | nyy #复制一/n行
y[w|e|b|$|^|G|gg…] #复制光标移动范围内的内容
p #粘贴到光标所在位置下一个字符位置
替换:
r | nr
替换光标所在字符(相同字符)
自动退出
R
进入替换模式
替换光标所在字符,直到按下Esc
不会自动退出
进入插入模式:
i #在光标左侧插入
a #在光标右侧插入
o #在光标所在行的下一行插入
s #删除光标所在字符后插入
I #在光标所在行首插入
A #在光标所在行尾插入
O #在光标所在行的上一行插入
S #删除光标所在行
vi与shell交互
在末行模式下用“!”符号来访问Linux的shell
- 例如
- :!cat /etc/passwd | more
- :! /bin/bash
vi冲突处理
- 每次打开文件会创建一个名为 *.swp 的临时文件
- 当多界面编辑、vi异常退出时会导致异常
- 删除 *.swp 即可
文本格式转换
unix2dos(linux转window)、dos2unix(window转linux)
- 使用
- unix2dos | dos2unix filename #格式转换后覆盖源文件
- unix2dos | dos2unix -n filename newFilename #格式转换后存为新文件
第六讲
ifconfig、ifup、ifdown、ping、netstat、service、chkconfig(自己看PPT)
网络配置文件的各自作用、设置静态IP方法
/etc/sysconfig/network | 最基本的网络信息,系统启动时读取该文件 |
---|---|
/etc/sysconfig/network-scripts/ | 此目录下的文件是系统启动时用来初始化网络的一些信息,例如:第一块以太网卡对应的文件为ifcfg-eth0 |
/etc/host.conf | 域名解析的配置文件 |
/etc/hosts | 域名或主机名与IP地址的映射文件 |
/etc/resolv.conf | 域名服务器配置文件 |
/etc/protocols | 定义使用的网络互联协议及协议号 |
/etc/services | 设定主机的不同端口的网络服务 |
设置静态IP方法
第七讲
两个网络模式的区别与联系(含图),如何选择
- 独立的守护进程工作模式
- 基于xinetd的工作模式
独立的守护进程模式(stand-alone)
- 是Unix传统的C/S模式的访问模式
- 在Client/Server模式下,服务器监听(Listen)在一个特定的端口上等待客户连接,连接成功后服务器和客户端通过端口进行数据通信
- 守护进程的工作就是打开一个端口,并且等待(Listen)进入连接
- 如果客户端发起一个连接请求,守护进程就创建(Fork)一个子进程响应这个连接,而主进程继续监听其他的服务请求
- 运行独立的守护进程工作方式称作:stand-alone
基于xinetd的工作模式
- 支持对TCP、UDP、RPC服务的管理
- 可以实施基于时间段的访问控制
- 功能完备的log功能,可以记录连接成功、连接失败的行为
- 能够有效地防止拒绝服务(DoS)的攻击
- 能够限制同时运行的同一类型的服务器的数目
- 能够限制log文件大小
- 能够将某个服务绑定在特定的系统接口上,从而实现只能允许私有网络访问某项服务
- 能够实现作为其它系统的代理
stand-alone与xinetd区别与联系
standalone一次性启动,运行期间一直驻留在内存中,优点是对接入信号反应快,缺点是损耗了一定的系统资源,
因此经常应用于对实时反应要求较高的 专业FTP服务器.
xinetd只在外部连接发送请求时才调用FTP进程,不适合应用在同时连接数量较多的系统。不占用系统资源。
反应速度:standalone > xinetd
占用资源:standalone > xinetd
telnet服务的配置过程、telnet命令使用
yum install -y telnet telnet-server
chkconfig --list #查看启用情况
编辑(新建)/etc/xinetd.d/telnet
重新启动服务 systemctl restart xinetd
netstat -ntlp | grep 23
ftp两种工作模式的区别与联系(含图)
- 主动模式PORT(服务器 主动连接 客户端)
- 被动模式PASV (服务器 被动等待 客户端连接)
主动模式PORT
指的是FTP服务器“主动”去连接客户端的数据端口来传输数据
被动模式PASV
指的是FTP服务器“被动”等待客户端来连接自己的数据端口
ftp的配置过程、ftp命令的使用
FTP配置
yum install -y vsftpd ftp
默认会创建一个名为ftp用户,home目录为: /var/ftp
默认是同时监听IPv6、IPv4,端口 21
配置文件目录:/etc/vsftpd
FTP命令
ftp xx.xx.xx.xx | open xx.xx.xx.xx
get | mget filename
put | mput filename
binary | acsii 设置文件传输方式
cd 在远程主机切换目录
lcd 在本地主机切换目录
ls 在远程主机上执行ls
mkdir 在远程主机上创建目录
close 关闭
quit 退出
第八讲
shell程序的特点与用途
特点
- shell程序可以认为是将shell命令按照控制结构组织到一个文本文件中,批量的交给shell去执行
- 不同的shell解释器使用不同的shell命令语法
- shell程序解释执行,不生成可以执行的二进制文件
- shell使用解释型语言,不需重新编译
- 它适合于编写执行相对简单的任务的工具,因为它更强调易于配置、维护和可移植性
- 它不适合用来完成时间紧迫型和处理器忙碌型的任务
用途
- 可以帮助用户完成特定的任务,提高使用、维护系统的效率
- 可以更好的配置和使用Linux,实现自动化运维
shell程序的编写、执行和调试
程序编译和执行过程
一般步骤
- 编辑文件
- 保存文件
- 将文件赋予可执行的权限
- 运行及排错
常用到的命令
- vi 编辑、保存文件
- ls -l 查看文件权限
- chmod 改变程序执行权限
- 直接键入文件名运行文件
一般结构
- shell类型
- 函数
- 主过程
变量声明与使用、read、位置变量、 H O M E 、 HOME、 HOME、PATH、$?
变量的声明和使用
变量是弱类型
-
声明变量不用声明类型
-
可以存储不同类型的内容
-
大小写区分
格式
变量=值 (注意:等号两侧不能有空格)
变量的引用
格式:
-
$变量名 变量名为一个字符时使用
-
${变量名} 变量名多于一个字符时使用
read
使用read将用户的输入赋值给变量
位置变量
bash在解释用户命令时,会把所输入的命令后面的参数使用位置变量传递给bash脚本程序
$0则代表脚本的名字
$$1, 2 … 2… 2…n分别代表参数1、参数2…参数n
$*:这个变量包括参数的列表(字符串)
$@:这个变量包括参数的列表(数组)
$#:这个变量包括参数的个数
有点类似形参与实参
$* 所有参数看做一个整体
$@ 所有参数不看做一个整体,而是区分对待
环境变量
环境变量 | 说明 |
---|---|
$HOME | 用户的主目录 |
$IFS | 内部的域分隔符,一般为空格符、制表符或换行符 |
$PATH | 寻找命令或可执行文件的搜索路径列表,路径以冒号分隔 |
$$ | Shell脚本的进程号 |
$? | 紧邻的前驱命令的返回值 0=成功 1=失败 |
$TERM | 使用的终端类型 |
$SHELL | 查看当前用户所使用的的shell |
双引号、单引号和倒引号的区别和联系
双引号
- 字符串通常被放在双引号中
- 如果在参数中包含一个或多个空白字符,必须给参数加双引号
- 如果把一个带有$字符的变量放在双引号中,程序执行到该行时会把变量替换为它的值
- 可用\字符取消$的特殊含义
单引号
由单引号括起来的字符都作为普通字符出现
倒引号
倒引号括起来的字符串都被shell解释为命令行,在执行时shell会执行该命令行,并以它的标准输出结果取代整个倒引号部分
简单数学运算、条件判断(字符串、数学)、逻辑运算
简单数学运算
expr命令计算一个表达式的值
格式 :expr arg
说明:
运算符和参数之间要有空格分开
通配符号(*)作为乘法运算符时要用\、“”、‘’符号修饰(注意是\)
let命令
条件判断
[ condition ] #[]右边和左边需要有空格
注意:
判断结果的一般定义:(与大多数语言不一样)
真:0
假:1
常用的文件属性条件判断 | |
---|---|
-f filename | 如果fn存在且fn为普通文件则返回真,否则返回假。 file |
-b filename | 如果fn存在且fn为块设备则返回真,否则返回假。 block |
-e filename | 如果fn存在则返回真,否则返回假。 exist |
-d filename | 如果fn 存在且fn为目录则返回真,否则返回假。 directory |
-r filename | 如果fn存在且fn可读则返回真,否则返回假。 read |
-w filename | 如果fn存在且fn可写则返回真,否则返回假。 write |
-x filename | 如果fn存在且fn可执行则返回真,否则返回假。 execute |
-O filename | 如果fn存在且被当前用户拥有则返回真,否则返回假。 |
-L filename | 如果fn存在且fn为符号链接则返回真,否则返回假。 |
常用字符串属性条件判断 | |
---|---|
string_1 = string_2 | 如果string_1和string_2两个字符串相等则返回真,否则返回假; |
string_1 != string_2 | 如果string_1和string_2两个字符串不相等则返回真,否则返回假; |
-z string | 如果字符串string的长度为0则返回真,否则返回假; zero |
-n string | 如果字符串string长度不为0则返回真,否则返回假; |
string | 同-n string,如果字符串string长度不为0返回真,否则返回假。 |
常用的整数关系条件判断 | |
---|---|
mum_1 –eq num_2 | 如果num_1和num_2相等则返回真,否则返回假; |
mum_1 –ne num_2 | 如果num_1不等于num_2则返回真,否则返回假; |
mum_1 –gt num_2 | 如果num_1大于num_2则返回真,否则返回假; |
mum_1 –lt num_2 | 如果num_1小于num_2则返回真,否则返回假; |
mum_1 –le num_2 | 如果num_1小于等于num_2则返回真,否则返回假; |
mum_1 –ge num_2 | 如果num_1大于等于num_2则返回真,否则返回假; |
逻辑运算
逻辑与-a:condition1 -a condition2,如果两个条件都为真,则结果为真
逻辑或-o:condition1 -o condition2,如果两个条件有一个为真,则结果为真
逻辑非!:! condition,结果与condition相反
if、casse、for、while、until(自己看PPT)
控制结构
- 分支结构
- 循环结构
常见分支结构
- if
- case
常见循环结构
-
for
-
while
-
until
第九讲
gcc命令使用(一次编译、分开编译、不同目录、指定头文件)
gcc:
- GNU project C and C++ compiler
- GNU Compiler Collection
一步编译、分步编译
- 采用一步编译 :
# gcc hello.c say_hello.c -o hello
- 分步编译的方案 :
思路:
编译每一个.c文件,得到.o的目标文件
将每一个.o的目标文件链接成一个可执行的文件
# gcc -c say_hello.c -o say_hello.o
# gcc -c hello.c -o hello.o
# gcc hello.o say_hello.o -o hello
不同目录、指定头文件
-I 选项指定搜索头文件的特殊目录
# gcc hello.c functions/say_hello.c -o hello – I functions
注意:不在当前目录的文件,需要指定路径
make工具
作用:
根据makefile文件中预定的规则完成对特定文件的编译,最后生成对应的可执行文件
原理:
判断依赖项是否为最新,否则生成新的目标
make层次图、makefile文件
文件名 | 代 码 |
---|---|
say_hello.h | #ifndef _SAY_HELLO_H #define _SAY_HELLO_H void say_hello(char *str); #endif |
say_hello.c | #include <stido.h> #include “say_hello.h” void say_hello(char *str) { printf(“%s”,str); } |
hello.c | #include <stdio.h> #include “say_hello.h” int main() { say_hello(“hello world!\n”); } |
make层次图
makefile
gdb调试工具的基本使用
gdb 进入调试模式
file | 指定需要进行调试的程序 |
---|---|
step | 单步(行)执行,如果遇到函数会进入函数内部 |
next | 单步(行)执行,如果遇到函数不会进入函数内部 |
run | 启动被执行的程序 |
quit | 退出gdb调试环境 |
查看变量或者表达式的值 | |
break | 设置断点,程序执行到断点就会暂停起来 |
shell | 执行其后的shell命令 |
list | 查看指定文件或者函数的源代码,并标出行号 |
静态函数库、动态函数库的创建与使用
静动态函数库一般都放在/usr/lib目录下
静态函数库
名字一般是libxxx.a
动态函数库
名字一般是libxxx.so
相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小
静态函数库的创建与使用
链接静态库 man ar
# ar -rsv libpr.a pr1.o pr2.o //固定格式lib*
-rv:将文件插入库文件中,显示结果
#ar: creating libpr.a
>>a - pr1.o
>>a - pr2.o
#ls -l libpr.a
>>-rw-r–r-- 1 root root 1942 07-04 05:40 libpr.a
加载库文件编译main.c
# gcc -o main main.c -L. -lpr
# ls -l main
>>-rwxr-xr-x 1 root root 4998 07-04 05:48 main
# ./main
>>this is the first lib src!
>>this is the second lib src!
动态函数库的创建与使用
生成动态库
■**#** gcc -fpic -shared -o libpr.so pr1.c pr2.c
■**#** ls -l libpr.so
>>-rwxr-xr-x 1 root root 4326 07-04 05:53 libpr.so
隐式调用动态库
■**#** gcc -o main_so main.c ./libpr.so
■**#** ls -l main_so
>>-rwxr-xr-x 1 root root 4994 07-04 05:54 main_so
■**#** ./main_so
>>this is the first lib src!
>>this is the second lib src!
第十讲
磁盘设备的命名方式
Linux系统磁盘设备命名方式遵循一定的规则
- 前两个字母表示分区所在设备的类型
hd:IDE硬盘
sd:SCSI硬盘(U盘,移动硬盘等) - 第三个字母表示分区在哪个设备上
hda:第一块IDE硬盘
sda:第一块SCSI硬盘
sdb:第二块SCSI硬盘 - 数字表示分区的次序
hda1:第一块IDE硬盘第一个分区
sdb2:第二块SCSI硬盘第二个分区 - 查看硬盘及分区情况
fdisk -l
Linux的文件系统、VFS的功能和作用(含图)
常见的文件系统
FAT、NTFS、ExtFAT、ext2、ext3、xfs、APFS
Linux支持哪些文件系统
输入命令 cat /proc/filesystems 查看
虚拟文件系统VFS
功能
- 记录可用文件系统的类型
- 将设备与对应的文件系统联系起来
- 处理面向文件的通用操作
- 涉及到针对文件系统的操作时,把他们映射到相关的物理文件系统
作用
- 更好的支持多种不同的文件系统,把文件系统从操作系统和系统服务中分离处理来,在它们之间使用了一个接口层,也就是虚拟文件系统VFS(Virtual File System)
- VFS是Linux内核中的软件层,它在内核中提供了一组标准的、抽象的文件操作,允许不同的文件系统实现共存,并向用户空间程序提供统一的文件系统接口
- 通过VFS将不同的文件系统的实现细节隐藏起来,从外部看上去,所有的文件系统都是一样的
设备挂载过程
- 查看设备:使用命令 “fdisk -l” 可以查看系统的存储设备
- 挂载设备:首先使用mkdir命令建立挂载点目录,然后再使用mount命令挂载相关设备
- 访问设备
- 卸载设备:用户在使用完挂载设备后,不能直接将挂载设备从系统拔出,否则会出现问题,严重的会导致系统崩溃。系统必须先执行卸载命令然后再把该设备拔出,要使用umount命令
mkfs、fdisk、mount、umount、df、du、whoami、who、w、jobs、bg、fg、&(后台进程启动)(自己看PPT)
进程的概念、进程和程序的区别与联系
进程的概念
- Linux系统上所有运行的东西都可以称之为一个进程,如每个用户任务、每个系统管理任务
- 进程是一个程序的运行
Linux操作系统包括三种不同类型的进程
- 交互进程:由shell启动的进程
- 批处理进程:这种进程和终端没有联系,是一个进程序列
- 守护进程:在后台持续运行的进程
进程和程序的区别与联系
- 程序只是一个静态的指令集合,不占系统的运行资源,只占用磁盘空间
- 进程是一个随时都可能发生变化的、动态的、使用系统运行资源(cpu,内存等)的程序
- 一个程序可以启动多个进程
at和crontab的区别与联系、各自的创建、删除、查看
at和crontab的区别与联系
- at命令产生的进程调度不具有周期性,只能在时间条件满足时执行一次(不具有周期性)
- crontab让使用者在固定时间或固定时间间隔执行程序(重复周期性)
at
作用:指定在将来的某个时间点执行某些命令
用法: at [选项] [时间]
at now +1min -f xx在未来的1min时执行指定文件xx
crontab
对用户来说,只需要关注自己的crontab文件的撰写,不需干涉crond进程的执行
因为一个用户只有一个crontab文件,所以,crontab文件不能直接创建或者直接修改(root可以),必须通过crontab命令得到
crontab命令用于安装、删除或者列出用于驱动cron后台进程的crontab文件
用法:f1 f2 f3 f4 f5 program
-
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
-
注意:f5:星期几 (0 - 6) (星期天 为0)
-
program中的执行不需要"."
例子:30 8-23/1 * * * /con3.sh
在早上8点30分到晚上23点30分之间,每隔1小时执行con3.sh文件
ps、kill、free(自己看PPT)
日志文件
- 日志文件(log files)是包含关于系统消息的文件,包括内核、服务、在系统上运行的应用程序等
- 多数的日志文件位于/var/log目录下,不同的日志文件记载不同的信息
- 某些程序(如apache)在/var/log中有单独的日志文件目录
- 多数日志文件都是用纯文本格式,可以使用任何文本编辑器如vi查看它们
- 大多数日志文件都需要拥有特权才允许查看
第十一讲
Docker与虚拟机的区别
特性 | 普通虚拟机 | Docker |
---|---|---|
跨平台 | 通常只能在桌面级系统运行,例如 Windows/Mac,无法在不带图形界面的服务器上运行 | 支持的系统非常多,各类 Windows 和 Linux 都支持 |
性能 | 性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来了 | 性能好,只虚拟软件所需运行环境,最大化减少没用的配置 |
自动化 | 需要手动安装所有东西 | 一个命令就可以自动部署好所需环境 |
一致性 | 环境一致性不高,不同系统差异大 | 一致性好,不同系统都一样部署方式 |
Docker的优势
常规应用开发部署方式:
Windows 上开发、测试 --> 到 Linux 服务器配置运行环境部署
经典问题:这段代码在我机器上没问题啊!!!
Docker 开发部署流程:
Windows 上开发、测试 --> 打包为 Docker 镜像(可以理解为软件安装包) --> 各种服务器上只需要一个命令部署好
优点:确保了不同机器上跑都是一致的运行环境,不会出现我机器上跑正常,你机器跑就有问题的情况。
docker search, pull, images, run, start, stop, restart, ps, rm, attach, exec, commit, build, tag, push(自己看PPT)
Dockerfile
用来构建镜像的文本文件,包含所需的指令和说明。
Dockerfile结构:
基础镜像信息(centos ubuntu …… nginx ……)
维护者信息(docker search可查看)
镜像操作指令(tar yum make)
容器启动时执行指令(系统启动时,第一个加载的程序/脚本/命令)
Dockerfile操作指令 | |
---|---|
FROM [镜像] | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令,例如centos:7。from有两层含义:①开启一个新的镜像②必须写的一行指令 |
MAINTAINER [名字] | 说明新镜像的维护人信息(可写可不写) |
RUN命令 | 每一条RUN后面跟一条命令,在所基于的镜像上执行命令,并提交到新的镜像中,RUN必须大写 |
CMD [“要运行的程序”,“参数1”、“参数2”] | 指定启动容器时需要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条,“bin/bash”也是一条CMD,并且会覆盖image镜像里面的cmd。 |
EXPOSE [端口号] | 指定新镜像加载到Docker时要开启的端口暴露端口,就是这个容器暴露出去的端口号。 |
ENV [环境变量] [变量值] | 设置一个环境变量的值,会被后面的RUN使用。容器可以根据自己的需求创建时传入环境变量,镜像不可以。 |
ADD [源文件/目录] [目标文件/目录] | ①将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,②或者是一个URL,③若源文件是压缩包则会将其解压缩。 |
COPY [源文件/目录] [目标文件/目录] | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中,copy只能用于复制,add复制的同时,如果复制的对象是压缩包,ADD还可以解压,copy比add节省资源。 |
VOLUME [“目录”] | 在容器中创建一个挂载点,简单来说就是-v,指定镜像的目录挂载到宿主机上(由容器创建和管理)。 |
USER [用户名/UID] | 指定运行容器时的用户 |
WORKDIR [路径] | 为后续的RUN、CMD、ENTRYPOINT指定工作目录,相当于是一个临时的“cd",否则需要使用绝对路径,例如workdir /opt。移动到opt目录,并在这下面的指令都是在opt下执行。 |
第十二讲
X Window的作用和组成(含图)、每个组成部分的作用
X Window的作用
-
良好的网络支持
-
个性化的窗口界面
-
不内嵌于操作系统
X Window系统由三个基本元素组成
- X Server服务端
- X Client客户端
- Xlib通信通道
【1】X 服务端
由系统供应商提供,通常无法被用户修改
只是一个普通的用户程序
每一套显示设备只对应唯一的X Server
是控制输入及输出设备并维护相关资源的程序,它接收输入设备的信息,并将其传给X Client,而将X Client传来的信息输出到屏幕上(在屏幕上构造方块(窗口),然后画出里面的元素)
【2】X 客户端
是应用程序的核心部分,它与硬件无关,每个应用程序就是一个X Client
X Client无法直接影响视窗行为或显示效果,它们只能发送一个请求给X Server,由X Server来完成这些的请求
【3】X 通信通道
X通信通道的主体是xlib(X函数库)
X Client调用xlib,利用相应的通信功能向X Server发出请求
X Server完成任务之后,同样调用xlib把结果显示指定的设备上去
修改系统运行级别(含运行级别0 3 5 6)
- 临时更改(n为级别号)
- init n
- Telinit n
- Startx(启动图形化环境,需要安装图形化界面)
- 长期更改
- systemctl set-default *.target
易错
-
当参数值里带有空格时 需要用双引号把参数包起来 例如 number=“hello world”,“$number”
建议传参时每个参数都加上双引号 -
$要不要跟{}
大括号 {} 的作用是限定大括号里面的字符串是一个整体,不会跟相邻的字符组合成其他含义。推荐使用${}可以避免一些不必要的错误。
-
date 年月日时分秒可写成
date +‘%Y-%m%d %H:%M:%S’date +“%Y-%m%d %H:%M:%S”
date ‘+%Y-%m%d %H:%M:%S’(推荐后两种)
date “+%Y-%m%d %H:%M:%S” -
对于case里的剩下的其他模式 可写成
*)
…
;;