目录
2. cp 如果cp的目的是一个文件,相当于要把源文件内容覆盖目的文件。
6. more 适合查看文件内容多的文件,可以分页显示。但他的效率还不是最高的。
7.less less可以像vim一样输入命令查找编辑,比more功能强大
普知识:Linux系统的大类
Linux系统,主要分为Redhat系和Debian系,这两个类别几乎涵盖了绝大部分常用Linux系统。
Redhat系,主要有Redhat、Centos、Fedora等,其中Centos系统是很多服务器用户选择的系统。
Debian系,主要有Debian、Ubuntu、Mint等,这个系还有其他一些衍生版本的系统。
此外,还有一些其他系统,例如Gentoo,Arch Linux,LFS等。
1.用于开发的,大多使用Redhat系,其中Centos系统是很多企业服务器使用的系统。
2.相对简单的开发,则可以选择Debian系,优选Ubuntu和mint这两种版本。
3.还有一部分技术相对比较成熟的用户,会选择其他系别中的Gentoo、LFS,Slackware等。
一、基础篇
1. 桌面与终端基础操作
super键就是键盘上的Windows徽标。
办公字典可以查单词。
应用程序附件下有一个文本编辑器。
直接删除一个文件不需要放入回收站------选中,shift+delete。
终端实际上是命令解释层
桌面下的shell是一个仿真环境。并不是真正的shell。打开真的shell,Ctrl+Alt+f2--6
返回桌面环境是ctrl+alt+f1
ctrl+alt释放鼠标
不同的OS有不同操作。乌班图ctrl+alt+f7图形化界面 f1-f6终端界面
编辑---首选项进行字体光标的设置即可
#代表root用户
$代表是普通用户
exit退出终端页面
2. Linux文件系统,目录介绍
位置--计算机。可以看到更多的目录
rm -rf /* 他的含义删除根目录下的所有。递归强制。
Linux里面用的是 / 正斜杠。但Windows是反斜杠。反斜杠编码是转义字符。处理麻烦。所以经常在Windows看到 \\。
挂载点。让硬盘分区挂载到一个文件目录下,首先这块硬盘分区要设置文件格式,然后这个文件系统就可以挂载,被挂载的目录里所以文件都放在这块分区内。根分区下的目录不一定是在根分区所在的硬盘里,可以在其它的硬盘。
Linux就一棵树,根树。而不像windows一样有C,D,E多个树。
如上图,除/boot放在引导分区下,中间最大的一块放在/根分区下。从硬盘上看,boot与/是平行的,但从目录结构(逻辑)上看,boot是在/下面的。 所以称Linux是虚拟目录,它是逻辑上的结构关系。
/下的文件夹有的带有箭头,他们是软链接,实际上他指向了其他文件下下,他指向的和他本身文件夹内容完全一样。
/boot目录很重要,被挂载到了一个单独的分区
opt全称optional是用于第三方软件的目录
mnt全称mount目录。他的作用类似于media目录。是可移动设备的挂载
proc目录是进程process目录,,对系统很重要 var目录,一般存放日志文件,他是变量的简称。
3.初识vim编辑器(重要)
vim是Unix的文本编辑。vim是vi的升级版,更强大。vim是系统自带的。还有一款更庞大的的体系编辑emacs。它几乎可以做任何事情。vim主做文本编辑,是编辑器之神。
设置---语言中添加汉语。默认第一个汉语设置。
Windows徽标键加空格切换中英文。
进入vim:vim in按下tab键自动补齐
vim三种模式。保存 :w 意思就是将缓存区写入。起到了保存的效果。:q即是退出的意思。i表示insert插入的意思
3.1 vim普通模式,复制粘贴删除
yy复制一行,P粘贴。按3,然后按P,粘贴3行
8,然后按yy,复制8行
dd删除一行,3dd删除3行
u撤销键。
选择性复制,y,按下$,从光标之后的都会复制。
y,然后按^号,表示光标之前的一行复制。
按w键跳单词,y,加w可以复制一个单词。
d,w删除一个单词
删除行也是同样的用法,d$,d^。
x剪切单个字符。大写x光标之前的会一个一个剪切。
r表示修改当前光标字符,之后按任意字符就完成修改为指定字符。
大写R,之后会从光标不断的复写之后的字符。
shift加^移到行前。shift加$移到行尾。
w移到下一个单词行头,e,end移到下个单词词尾。
b,begin,跳到上一个单词的词头。
gg跳到最开头。大写的G跳到最后。
5,然后按大写的G跳到指定的第五行。
进入命令模式,:set nu(number)这样可以显示行数。
:set nonu取消行号。
3.2 vim编辑模式
delete键删除。
大段内容修改在普通模式,编辑模式适合小修小改。
esc键退出编辑。
3.3 vim命令模式
:q! 不保存强制退出
/查找内容 n 下一个 N上一个
替换substitute
:s/被匹配字符/新字符 只是光标所在的一行 而且只是第一个被匹配的。
:s/old/new/g 加上g代表全局的意思。
:%s/old/new 加上%全部行第一个都被替换。
:%s/old/new/g 加上%全部行都替换,g代表全部替换。
4.网络配置(重要)
4.1 配置网络ip
ifconfig if 代表了interface。接口
虚拟机三种网络模式图
nat 为什么要虚拟出一个网卡呢?
因为外网无法访问一个虚拟内网的主机,从而保证内网安全性,这是自己的电脑主机也无法与虚拟机进行通信,但为了让本机与虚拟机通信,就虚拟出一个网卡连接本机,保证主机能与处于内网的虚拟机进行通信。 vmnet8就是虚拟出的网卡。
nat虚拟网卡与虚拟机实际上是平等的,真正的网关是nat路由器。vmnet8与虚拟机共同连接到nat路由器上。虚拟机通过nat转换为真正的主机地址。主机地址再经过他的路由器nat转换成外网ip,实现上网。
仅主机相当于主机与虚拟机在同一个局域网。虚拟机无法与外网连接。因为主机的ip与虚拟机的ip根本不在一个网段,所以无法通信。但由于有虚拟网卡,主机与虚拟机在同一个网段,所以可以通信。因为虚拟网卡ip与虚拟机是同一个网。本机相当于一个双网卡设备。
仅主机模式也一样虚拟出一个网卡,他的网卡名为vmnet1。
配置桥接很简单,只需要在编辑中将将桥接模式桥接到真正的网络。
同一个网络用交换机,不同网络用路由器。
4.2.修改为静态IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33 修改网络配置文件。
service network restart 服务网络重启。可以刷新自己已修改的IP。sevice本身是一个Linux命令
4.3.配置主机名
hostname //返回当前主机名
vim /etc/hostname //可以修改查看主机名
hostnamectl set-hostname linux(主机名) //实时修改主机名为Linux。
hosts文件将主机与ip对应关系保存起来,以便本机可以寻找到其他主机。
这样的话,主机就可以ping Linux 代替 ping ip地址了。
当然,主机名也可以是域名。
域名劫持就是非法修改hosts文件,让本机故意访问到钓鱼网站,窃取信息。
5.远程登录
ssh root@ip .如果配置了hosts文件也可以ssh root@主机名 。推荐使用Xshell。
ssh端口号22.
xshell为了让它复制粘贴更方便,在工具选项中勾选如下内容。
为了上传与下载文件,还要配套使用Xftp。
如果Xftp远程系统文件夹显示乱码,还需要修改一下字符集。如下图,
6. 系统管理(重要)
6.1 Linux服务管理
从系统开始到关闭都存在执行的服务叫做守护服务,执行这些服务的进程就叫做守护进程。守护进程守护的就是系统服务。daemon希腊语, 半人半兽的守护神。所以Linux服务中很多以字母d结尾的。
centos6(了解) 语法:service 服务名 start|stop|restart|status
centos7(重点) 语法: systemctl start|stop|restart|status|disable 服务名 (ctl是control)
更多的服务需要在新版本系统查看。
之所以老版本服务文件夹还有个别服务是因为在新版本服务文件夹中已有替代类似功能的服务。
network 和NetworkManager一样功能,它们是Linux的网络服务。
6.2 系统运行级别
Linux配置服务开机自启动设置,shell下输入setup就进入了桌面化的服务配置工具。
有星号代表了开机自启动,选中按下空格键就取消了星号。 tab换选选项框。
最上面的俩个服务是老版本的。systemd是新版本的系统服务,为什么新版本基于systemd的?
早期的Linux的版本,是基于Unix进行的设计和优化,在Unix里,它对于系统服务的管理也影响了Linux的做法。Unix有一个非常重要的稳定的版本就叫System5,即SystemV,在这个版本,系统第一个启动的用户进程就叫init,后面的所有进程都是基于init进行调用的。接下来init进程会通过调用init.d目录下所有的脚本来启动相应服务的守护进程。这里的init进程,它其实是整个系统在Linux内核自身初始化之后主动启动的第一个用户进程,所以之后,init进程就会根据用户自己定义的系统运行级别,来去启动不同的服务进程。这里的服务进程到底去选取哪些去进行开机的自启动,是与根据当前系统运行的级别有关系的。
运行级别runlevel,这是centos6的。常用的就是3 ,4与5 。随着运行级别的提高,相应的服务也会增多。
centos7为了简化,就做出如下的修改。默认只保留了俩包服务。这俩包服务就对应了老版本centos6运行级别3和运行级别5所对应包含的一组服务。
补充:如何在之前centos6查看系统默认运行级别
vim /etc/inittab
之前我们知道Ctrl+alt+f2可以切换到大黑屏。如果在命令行可以输入 init 3命令进入。
6.3 服务开机启动和关闭防火墙
chkconfig --list 查看老版本(cent7之前)的系统服务。这是老版本命令。
老版本系统初始时启动一个init进程,新版本系统替换成了systemd进程。新版本的systemd是一个大家族,它还可以并行启动,所以启动效率比老版本高。
上图输出结果,根据不同的运行级别,服务呈现出启动的不同。network服务会在2345级别开机启动。
输入setup结果
当我们把network的*取消后,再次查看服务,发现0-6全部运行级别都处于关闭状态。
我们演示了图形化配置服务自启动,那么命令行如何配置呢?
chkconfig network off/on
chkconfig --level 对应级别 network off/on //指定某个级别的服务开启与关闭。
services开启 chkconfig配置,发现老版本很麻烦。那么新版本就用systemctl统一了。
查看networkmanager的状态
禁止开机自启动
得到所有服务开机自启动的信息
systemctl list-unit-files
Linux把systemd下服务和tar包都当做单元来看。
实战:开启关闭Linux防火墙服务,配置防火墙开机自启动。
老版本防火墙是iptable,新版本变成了firewalld。加了字母d表示是守护进程。
关闭,禁止
开启,打开
注:active,enabled开启,vendor preset默认开启自启。
6.4 关机重启
shutdown 默认一分钟关机
shutdown -c 取消关机
shutdown now 立即关机
shutdown 3 3分钟后关机
为什么关机要等一分钟,有延迟?因为Linux系统的系统特性,预读与延迟。数据读写的时候,在内存中的效率比硬盘快的多的多,所以在内存中单独拿出来一个缓存区域,等这个缓冲区域满的时候在送入磁盘,而不是像Windows那样保存缓冲直接写入磁盘。这样做的目的是为了提高系统读写效率。
注:buffer缓冲
这种方式有好处也有坏处。他的坏处就是在当写入缓冲区域,这是如果手动执行立即关机操作,会导致缓冲没有写入硬盘造成丢失。或者意外断电导致无法及时写入硬盘。
为此,Linux有一个sync命令。它的作用就是立即将缓冲区域内容写入磁盘。
其实在执行shutdown now时首先就执行sync,然后再关机。
注:halt停止 --halt 等价于 -H
二、实操篇(常用基本命令)(重要)
7.shell含义解释
bin目录下的sh命令就是shell入口,所以Linux执行文的拓展名也用.sh标注。
Unix最终解释执行的终端sh(全称 Bourne Shell): 是UNIX最初使用的 shell,而且在每种 UNIX 上都可以使用,它的优点是可以进行功能强大的shell编程,但它处理起与用户的交互就差一点。bash(全称 Bourne Again Shell): LinuxOS 默认的终端,它是 Bourne Shell 的扩展。因为Bourne shell在与用户交互方面比较差,所以Linux对齐做出了改进。
bash的由来即使如此。
但是bash又显得复杂,这样其他的Linux版本对此做出一些简化,Debian,Ubuntu它们的shell解释端口是dash。
除了bash,dash还有一种shell是csh。
ls -l /bin/ l代表了行,表示以一行显示详细信息。
8. 帮助命令
1. man(manual手册)
man命令实现中文化
yum install manpages-zh
如果发现查命令不存在这个包。那就在yum库查找
yum list |grep man.*zh
这时会查到一个包,进行安装
sudo yum install 包名
如果找不到包名,进行yum更新
yum -y update
man cd 发现显示的并不是cd的手册信息。因为cd区别于ls命令,cd是一个内置命令。内置命令还有exit等等。
如何查看命令是否为内部命令还是外部命令? 使用type命令。例如type cd。
history命令把我们之前打出的命令全部显示出来。
既然cd是内置命令,那我们怎么才能查看到cd呢? man -f cd
结果显示了cd有好几个文档标准的解释,如图
接着输入 man 1p cd 就查看到1p关于cd的详细解释了
最后在查看一个man命令。 man man 查看man手册的信息
2. help命令
我们发现man命令现实的内容很多,过于复杂,那么有一种更简洁的帮助信息手册。
格式:help 命令
例如help cd 。
但是help命令只能查看内置命令。如果外部命令查不到。例如 help ls
那如何用help命令查看外部命令? 外部命令给我们提供了一些简化帮助信息。我们可以输入ls(要查询的命令) --help获取外部命令的帮助手册
最后,建议都用命令 --help,内置命令也可以采用这种help查询方法。
补充:shell使用技巧
reset重新启动shell。clear清屏。
9. 文件目录类
9.1 目录操作命令
1. pwd 打印工作目录 显示当前工作目录的绝对路径。
如上图,我们知道在用户1文件夹下,yonghu1是当前目录,但是当我们忘记用户1文件在哪时pwd就发挥它的作用了 。pwd也是一个内嵌命令。
2. cd - 返回上一次的工作目录
3. ls 常用选项-a, -l
Linux用不同颜色区分了目录和文件。配置文件.bashrc非常重要是用户的重要信息配置。ll命令其实是ls -l的别名,它俩效果相同。
4. mkdir b c
创建俩个文件夹 mkdir d/e/f 这种创建方法错误 纠正: mkdir d d/e d/e/f
上面创建嵌套目录的方法很麻烦,还有一种简洁方法 mkdir -p d/e/f
-p 是parent父的缩写。
5. rmdir 只能删除空目录
rmdir -p d/e/f 如果删除f后e文件夹为空,则继续删除e,依次类推。
9.2 文件操作命令
1. touch
文件名可以不带后缀名,默认是文本文件。
2. cp 如果cp的目的是一个文件,相当于要把源文件内容覆盖目的文件。
cp前加一个\cp 表示直接覆盖不提示。不加\是有覆盖提示的。
为什么cp默认提示覆盖?
因为cp是cp -i的别名。-i是interactive交互的缩写。用help cd发现-i的描述如下
加\的意思是使用linux里的原生命令。
注意cp也可以复制目录,如果要复制文件夹的子文件夹和文件需要加 -r选项。递归的 recursive,递归recursion
拓展:为什么ls命令输出结果为带颜色的?因为ls是一个别名,实际上ls已经做出了颜色处理。--color的作用。
如何查看Linux中带别名的命令? 使用命令alias(别名)即可。
3. rm 默认移除有提示。
rm默认是删除文件的,不能删除目录。要删除目录,需要加-r选项
rm -rf a/ 意思是删除a目录和a目录以下的所有文件。注意包括a目录。
4. mv命令
5. cat (catch捕捉) 适合查看内容少的内容文件
-n选项显示所有的行号。
6. more 适合查看文件内容多的文件,可以分页显示。但他的效率还不是最高的。
7.less less可以像vim一样输入命令查找编辑,比more功能强大
因为less是动态加载,所以打开大文件的速度很快。
less查看文件是按下 = 会显示详细的文件信息。
9.3 其他命令
1. echo 输出内容到控制台 重定向
echo 【选项】【输出内容】
没有加-e之前的输出 \n换行没有起作用
有-e选项时
那么如何将控制台输出写入文件呢?echo加重定向 echo可以将自己要写的内容加入文件
echo写入相比于vim,不易产生误操作。
echo $接着按下tab, 查看系统环境变量。
为什么ls,cp,mv这些命令不在当前目录下,为什么可以执行?
因为这些命令的路径都在系统的path环境变量下
2. 监控文件变化_head_tail
注意 tail -f 文件 监控日志文件
这条命令相当于启动一个进程用来监视,它并不会直接退出。
Ctrl+s暂停 Ctrl+q继续 Ctrl+c直接退出此进程。
如果监控文件,但是用vim进行编辑,发现监控不到变化,这是因为监控室按照文件索引号进行监控的,vim编辑导致文件索引号发生变化,所以不能进行追踪监控(ls -i 文件 查看文件索引号),涉及到系统底层知识。索引号变化因为vim貌似是先写临时文件里,保存是直接覆盖的。
3. 软连接(link) -s的s代表soft简写
软链接后面/解释:其实可以理解为加个/就进入了真实目录中了,这时的路径代表真实目录下的所有内容
最前面是 l 表示是一个链接。
当然上面的软链接名也可以是指定路径。如下图myflider指向了一个目录,myinfo指向文件
在一个链接文件下,如果要查看真正的路径,可以直接使用目录pwd -P,作用:直接查看物理路径,如下图
同样-P也可以适用于其它命令。例如cd -P 链接文件 ,这会直接跳转到实际的物理路径。
/bin 的实际路径为 /usr/bin
硬链接语法:ln 文件 链接名
硬链接相当于直接连接元数据,与原本的文件名平等;软链接相当于保存对应文件的地址,没有直接连接文件的元数据。当硬链接数为0时,文件就删除了。原始的文件名指向文件的iNode信息,软链接不直接指向文件的iNode,而是指向原始文件名的地址;硬链接是直接指向文件的iNode。
4. history 查看已执行的历史命令
history 10 显示过去最近的十条命令。
使用历史命令直接 !历史命令编号
history -c 清除历史命令
10. 时间日期类
10.1 date
(1) 提取具体信息
小写s 表示一个时间戳。时间戳是从1970.1.1开始到现在的总和。
(2)date显示非当前时间 也可以是其他的时间例如hours,
(3)date设置系统当前时间
10.2 cal 查看日历信息
cal -数字 查看相邻月份日历
查看系统当前本年度的日历 cal -y 查看
cal -m 以星期一为第一天显示(Monday)
11. 用户权限类
11.1 用户命令
11.1.1 useradd
Linux是多用户的操作系统。
超级管理员在/root下, 普通用户要求在/home目录下。
更改用户主文件夹名使用-d选项。默认用户名与主文件夹名称相同。
11.1.2 passwd
passwd 用户名 密码默认要8位以上,当然123456也是有效的密码。
11.1.3 id
id 用户名
11.1.4 查看所有用户
发现大量的系统用户,它们去单独执行系统服务。
密码只能在/etc/shadow文件查看,而且还加密过的;/etc/passwd 中x本来显示的是用户的明文密码的,为了安全考虑,就为密码单独创建一个文件,来专门存放用户的密码信息。 俩个数字一个是UID一个是gid。
各字段的含义:
第一字段:用户名;第二字段:密码占位符,第三字段:用户UID;第四字段:用户GID,第五字段:用户的全名;第六字段:用户家目录;第七段:用户的登录shell
自定义的uid从1000开始
我们发现上图的一些系统用户是nologin,无须登录的。
11.1. 5 su 用户名
11.1. 6 who am i 查看当前的用户
查看最初的以哪个用户登进来的。相当于一个进程监控。
因为是root登入进去的。whoami显示当前的用户。
11.1.7 sudo命令
如果普通用户不在sudoers文件里,是不能使用sudo命令的。(kali每次都会提醒你。权力越大,责任越大。 )
11.1.8 userdel
userdel 用户 删除了用户,但该用户的文件夹还存在。在日常工作中大部分是删除用户不删除该用户的文件夹。提示:已转岗或离职的员工曾经的工作文件以后可能还有用。
userdel -r 用户 同时删除文件夹和用户
11.1.9 usermod 修改用户
11.2 用户组管理
11.2.1 groupadd 组名
为什么有的用户不在sudoers文件中,但也能使用sudo命令?因为组赋予了它的权限。
用户在wheel组中即可使用sudo命令。
11.2.2 groupmod 修改组
11.2.3 groupdel 删除组
11.3 文件属性与权限
不同的用户与组对系统的文件权限有所不同。
文件的属性:
c, b类型表示设备文件。c表示字符类型的设备(鼠标,输入操作涉及到字符,b表示块设备类型文件,比如硬盘)。此外还有- ,l ,d类型。
像一些文本文件,配置文件,属主用户也没有可执行权限。
文件的第二块内容才是硬链接意思,而目录不是硬链接。公共目录的第二块内容就是它目录下的子文件夹数量。
11.4 更改文件权限(change mode)
语法:
=是赋予权限,+-是在原有权限的基础上做权限的改动。文件权限更改需要root。之前加wheel组,加sudoers未免给用户赋予的权限过大,所以这种chemod更细粒度。
11.5 chown 改变文件所有者
11.6 chgrp 改变文件所属组
12. 搜索查找类
12.1 查找定位文件
12.1.1 find
寻找/root下的文件大小大于10M的文件
12.1.2 locate查找
find是在本机硬盘进行查找,而locate命令是实现建立本机文件与路径对应的数据库,默认每天更新一次,所以会产生延迟不同步,如果修改某些文件路径后需要查找需要先更新一下数据库。locate命令查找很快。
updatedb
locate 文件
locate是一个模糊查找,只要包含想要搜索的名字都能列出。
12.1.3 which /whereis 查找路径
12.2 内容过滤查找与管道操作
直接查找文件的内容
结合wc命令(word count)显示行数,单词数(空格分开),文件大小。
13 压缩解压类
可参考:python_Linux基础_黑马_莵莵的博客-CSDN博客
13.1 gzip
如果没有对多个文件进行打包,压缩多个文件就会产生多个压缩包。
13.2 zip
gzip知识简单的压缩和解压。而Zip可以打包归档解压缩,功能强大,还可以保留源文件。
13.3 tar(实际中用的最多)
14. 磁盘管理类
14.1 查看目录占用空间大小
ls不会嵌套的统计所有目录下的其他文件大小。du帮助我们有效查看文件目录的磁盘占用情况。
执行du -ah后。最后一行 . 就代表了本文件的总共大小为99M。
只显示目录下的一级。
14.2 查看磁盘与内存使用情况 df/free
dev设备区,第一块硬盘分区给了boot引导分区,文件名是sda1(发现引导分区只需分配300-500M最合适)。第二块硬盘分区给了swap分区。第三块硬盘分区给了根分区,故名sda3。
tmpfs(temporary file)是一种特殊的文件系统类型,它是基于内存的文件系统,它不管是真正的内存还是swap(虚拟内存)分区,它们的文件系统是一致的。shm(share memory),是系统所有进程都能访问到的内存区域,默认大小是系统内存的一半。run是运行时的内存,内存和swap分区与运行时(run)和系统sys相关,所以它们挂载到了run/sys目录。
devtmpfs是Linux内核启动创建的特殊文件系统,创建一个dev目录,用来管理当前所有的设备。
free查看物理内存和虚拟内存。使用情况。
14.3 查看设备挂载情况(list block)
mountpoint 挂载点 sr0 是光盘存储设备。
注意如果使用的是其他的硬盘文件名称不一定是sda,除了sda还有hda,vda。硬盘类型有IDE,SATA(容量大,廉价),SCSI(速度快).。
IDE第一块硬盘hda,第二块是hdb。
SATA,SCSI这俩者第一块硬盘是sda,第二块是sdb.。sda后面的数字代表的就是分区信息。
如果是虚拟化的模拟设备的话就是vda.。
查看分区的文件系统-f 选项
xfs,ext4.
永久挂载可以用uuid或者硬盘名.。UUID就是系统为一个分区创建的唯一标识符。
14.4 挂载与卸载(mount、umount)
一个设备要想被直接访问必须被挂载到某个指定目录下,没有挂载目录无法直接访问其信息。
没有挂载的分区就无法查看,所以先挂载再查看里边的内容。
光盘挂载到mnt目录下。mnt就是mount的缩写。
(1)添加光盘
(2)挂载点设置
最初插入光盘时Linux系统自动给我们进行了挂载。
它被挂载到了run目录下。
右键弹出,发现光盘挂载点没有了。
使用手动挂载光盘
device设备名就是sr0,或者cdrom。光盘挂载到指定目录/mnt/cdrom。
图形化界面会自动帮光盘挂载到目录。但我们想自己配置,因为之前弹出光盘,所以出现找不到设备的问题。这是需要注销root账户,然后重新设置cd/dvd状态为已连接。在登录root账户即可。
卸载后,尽管目录存在,但是里面的光盘内容就没有了。
设置开机自动挂载只需要加入一行内容即可。fstab(file system table)里面保存了所有的设备挂载信息。UID使用设备名也可以。
后面的俩个0.。第一个0 是dump选项,如果是1自动备份,0表示不自动备份,kdump就是定期进行备份,以防系统出现故障时进行回滚修复。后一个0代表文件系统检查的优先级,fsck(file system check)是 文件系统的检查和修复 ,开机的时候每次都执行此命令,检查时就会根据分区文件系统的优先级进行先后顺序的检查。0表示不检查,1优先级最高,2优先级比1 低。
14.5 磁盘分区
上节学习了如何添加一个光盘以及如何挂载与卸载,那么新添加一块硬盘该如何配置呢?
添加新硬盘需要重启识别,不像光盘一样可以使用热插拔,reboot重启识别出新硬盘。
输入命令进入配置硬盘模式
对MBR分区而言只能分4个主分区,现在都是GPT分区了,主分区无限了。
扩展分区序号5-16,最多12个扩展分区。(sdb1,sdb2……sdb16)
划分出一个分区
虽然划分出了一个分区,但是还没有指定文件格式,系统仍然无法识别这块空间。没有文件系统就没有UUID,也没有相对应的挂载点。
指定文件系统并进行格式化操作mkfs(make file system)
-t (type)指定文件类型。 设备名/dev/sdb1 。这样指定文件系统后就有了UUID,但是,还没有进行挂载操作,这也是最后一步操作。
一般我们添加的新硬盘空间都是分区后挂载到home目录下的不同用户下,这样让不同的用户使用他们自己的硬盘分区,更便于管理。
如下图,将新硬盘挂载到了home目录下的用户文件夹下。这样我们只要在这个用户文件夹下的存储的文件数据都会存放在这块新硬盘中。
如何在挂载期间存储了文件,之后把这块硬盘卸载了,那在这期间存储的文件也会消失,无法访问,那原来的家目录文件夹又重新划归到了sda3这块分区,属于了根树。
15. 进程管理类
15.1 查看进程类
15.1.1 基本语法
执行系统服务的进程叫守护进程(文件名最后有个d)
注意到选项有加-的也有没有的,这是因为加-表示的是Unix风格,不加-表示的是bsd风格。
不带终端表示后台进程。PS默认只显示当前用户进程。ax搭配将会显示所有的进程。
ps aux | less
ppid表示父进程ID。pid进程号
15.1.2 进程信息详解
ps aux 信息说明
vsz虚拟内存并不是等待内存空间满了才放入虚拟内存,而是系统根据内存页面置换算法,把不常用的页面放入虚拟内存(磁盘swap分区),而真正一直需要的才放入到真实的物理内存中。
tty(teletypewriter)电子打印机。tty1 桌面环境 其余tty 就是之前使用的大黑屏。pts,每多一个进程就会多一个pts虚拟终端。
<表示当前进程是优先级很高的进程,N表示当前进程是一个优先级比较低的进程。
1号进程是当前系统执行的第一个初始用户进程systemd。早期版本是centos6的init进程。
2号进程也是非常重要的一个进程,他代表了内核线程的调度工作,始终运行在内核空间。许多系统级别的服务都是以系统线程进行运行的,都由2号进程管理
0号进程是idle进程,属于系统级别的进程,是第一个用户进程systemd的父进程。
用户的系统级别进程发现大部分父进程都是2号进程。用户进程大部分都是1号进程。1,2号进程都由系统0号进程启动。
ps aux
ps -ef
15.1.3 查看远程登录进程
第一条ssh就是系统ssh守护进程
第二条是我们使用ssh远程登录产生的ssh守护进程的子进程。
第三条使我们在终端输入筛选查询sshd命令是产生的,他的运行终端发现是虚拟窗口pts0,它没有在后台。
当普通用户登录系统时生成俩个ssh进程。进行普通执行时用最后一个。当普通用户执行root权限时,就会root用的的进程,即第三个。这样做的好处就是可以实现权限分离。
15.2 进程管理类
15.2.1 终止进程
基本语法
如果kill用户ssh进程,用户退出,如果直接kill了sshd守护进程,相当于把后台服务关闭,其他用户再次使用ssh登录也就无法成功连接。
如果关闭了守护进程,我们只需重新开启服务,这样,所有的用户又可以重新使用ssh登录远程主机了。
注意下图的父进程与子进程关系
之前killsshd守护进程时,还在以root用户登录,所以在关闭服务后,root用户的ssh父进程变为1号进程,当再次打开sshd守护进程后,重新以另一个用户登录,发现他的父进程就是sshd守护进程。
3746号进程是什么?
查看3746号发现它是root用户登录后启动的bash进程,这样我们就清楚了进程之间的关系1号进程→sshd守护进程→用户远程登录进程→bash进程。这也就是为什么在bash中敲出来的命令都是以bash进程为父进程延伸出来了子进程。
如果是正在运行的进程简单的kill是不能关闭进程的,需要-9强制关闭选项。kill -l 列出各个数字代表的含义。
如果要kill多个进程,需要查询相关的名称,用killall命令就全部关闭了。
注意一旦杀死守护进程,而且当前没有用户登录远程主机,这个时候只能通过物理机重新启动sshd服务,只有重新启动后,所有用户才能远程登录到这台主机。
15.2.2 查看进程树
pstree命令查看进程树
查看ssh信息(第一个是systemd)pstree | less
pstree -u | less
上图中是以root用户登录的,某些进程是系统用户启动,所以会加()进行说明。例如colord用户。如果系统用户创建的进程的子进程又变成其他用户时,也要用()予以标识。
15.2.3 实时监控进程
监测信息说明
up距离系统开机运行了多长时间。在物理机上登录的桌面环境下的也属于一个用户。load average 平均负载(过去1分钟,5分钟,15分钟)三个指标小于0.7都是正常的,如果大于1表示超负荷了。CPU信息,us表示用户进程占用(不包括改变程序的优先级进程),sy是系统内核进程,ni是nice友善的,进程友善,优先级低,进程友善程序低,优先级越高。id(idle空闲进程),wa(wait)等待I/O进程。hi硬件中断进程,si软件中断进程。st(stolen)被偷掉的进程,本机还能在开一个虚拟机,被虚拟化设备占用的时间占比。
PR任务调度的优先级priority。NI用户指定的友善级。VIRT虚拟内存占用大小virtual memory size。RES实际物理内存占用大小
SHR共享内存占用大小shared memory size。S表示进程状态status。command表示生成当前进程的命令。
shift+m改变为以内存占用排序。最占用内存的就是图形化界面gnome。 shift+p按照CPU排序。shift+n,按排序号,由大到小
top -i 只要刷新时段内用过CPU的进程,都会显示,但这些进程可能在刷新时点又睡了。也就是说这个选项,不一定只显示r状态的进程,s状态也会显示。
进入top命令后,按下小写的u,会提示输入哪个要查看的用户,空格表示还显示当前所有的用户。
执行top时 按小写k 可执行终止进程操作
发现还会让我们输入一个信号,这个信号就是之前kill -l看到的所有的数值。9代表强制关闭运行的进程。
15.2.4 网络状态与端口监控
netstat命令
套接字本质就是个数字,这个数字标识两台主机两个进程之间的连接,向套接字文件中写数据就相当于给对端主机发送数据,从套接字文件中读取就相当于从对端主机接收主机 。ip地址+进程端口号 = 套接字(socket)。socket 是一个接口 为了让应用层使用传输层的服务。sockect 是应用层和传输层之间的层间接口。
监听就是说它的状态处于listening。-n选项就是不用主机名,全部显示成对应的ip。
netstat -anp显示信息介绍
tcp6表示ipv6方面。recv-q表示连接到socket的用户程序还没有拷贝的字节数,就是已经接受到了但是还没有拷贝出来的字节数量。send-q表示已经发出去了但是远程主机还没有确认收到的字节数量。意思就是接受队列和发送队列 。0.0.0.0表示本地的所有地址。
从物理机2个用户远程连接到服务器的信息。因为xshell在物理机,所以显示的远程主机ip为端口号比较大的这俩个 。而固定端口号22的俩个ip才是服务器的ip。
16. crontab 系统定时任务
crond是一个服务,首先应该确认一下服务状态
-e 选项的设置
执行的任务就是在命令行中的命令。* 的顺序是按照使用频率的多少进行合理安排的。
具体的用法说明
n最小就是一分钟
具体案例
案例:每隔60秒往/root/hello文件中写入一句hello world。
crontab -e
tail -f 实时监视文件
三、扩展篇
17 软件包管理
17.1 rpm
1. rpm简介
Ubuntu使用的apt-get
红帽系列使用rpm。
64位是x86_64。
2. rpm查询命令(rpm -qa)
q查询 a所有
-i 表示information的意思
3. rpm卸载
-e eraser清除
4. rpm 安装命令 (多看帮助文档)
注意:安装不同于卸载,安装必须使用包全名,卸载只需要软件名即可。
包全名在我们挂载的光盘上有,输入lsblk查看光盘挂载目录。
发现sr0即是光盘ISO镜像。
发现ISO镜像光盘包含许多以 .rpm 为拓展名的软件包。从这里就可以找到我们所需要的包全名。
17.2 YUM
1. 为什么要使用yum呢?
rpm包管理缺点:1. 首先必须下载rpm软件包。 2. 还必须安装输入包全名。3. 不能解除依赖关系,如果安装的包有依赖另一个包,则rpm会安装失败,还需要先安装这个被依赖的包,结果被依赖的包又依赖一个包,所以很麻烦。
那么YUM就提供了一个“一键下载”的功能。
yum下载原理图
2. YUM的常用命令
案例:
最后rpm查询验证是否有包。
@号表示自己已安装的版本
3. 修改网络YUM源提高下载速度
wget可以从指定网址下载文件
查询YUM源文件 , 第一张图是官方默认,第二张是阿里云
YUM会自动从官方镜像更新为距离自己最近的YUM源,所以不用配置也是完全可以的 。
18. 克隆虚拟机
VMware 复制虚拟机、克隆虚拟机_虚拟机克隆_蚩尤后裔的博客-CSDN博客
如果克隆出来的虚拟机和母机ip一样,需修改为不同的
主机名如果与母机一样,则使用命令修改为不同的主机名
上图的命令直接修改了主机名。
虚拟机可以迁移到其他电脑,只要将虚拟机对应的文件全部拷贝下来,直接在另一个主机用VMware打开虚拟机即可。
xshell登录时主机项如果没有配置hosts文件,就填服务器ip地址。
19. shell编程
19.1 shell概述
shell是一个翻译官,负责解释。把外部应用程序的命令解释成内核可以执行的指令。
除了一行行的指令解释执行,还可以编写成一个文件执行一整块命令,这样的可执行文件就叫做脚本。
dash(Debian系)。bash(红帽)【大部分Linux发行版本都默认】。最初的shell脚本来源于Unix的shell-- Bourne,他可以进行灵活的shell编程,但是用户的交互能力差,进而发展为bash 。
19.2 shell脚本入门
脚本的文件后缀默认都是 .sh 。当然脚本也并非必须的带文件后缀,只要是个可执行文件即可。
在实际中我们常常用第二种方法,即直接敲出脚本就能执行 (常用相对路径方法),不再依赖于bash 脚本。这个脚本本身就像一个命令一样直接执行。
第一种方法执行不需要赋予文件x权限,那是因为bash调用,bash本身就是一个进程,所以相当于bash进程直接执行调用,脚本被当做bash的参数进行传入的; 第二种需要赋予x权限是因为 要在当前的bash环境中进行执行,需要赋予执行权限才可以正常启动。
第三种执行方法
source和 . 与之前俩种方法执行有所区别。前俩种方法执行脚本会在当前的shell环境下开启一个子shell进程执行脚本,相当于在shell中嵌套一个shell;而source和 . 是直接在当前的shell环境中进行脚本执行。source执行还能起到一个实时更改配置文件的行为。这也是为什么Java配置环境变量,需要source一次。
子shell ,敲入bash即可创建一个shell进程
此时由于在子shell中,所以exit退出也不会直接退出shell终端,而是退出了子shell。
19.3 shell-变量
1. 系统预定义变量
子shell与父shell之间的环境区别 。这就是上一节中shell执行hello.sh未找到命令的原因。
比如父shell定义了全局变量,子shell进行了变量修改,返回父shell仍然不变。
这就涉及到了变量的知识,这节主学变量。
系统变量
变量就是内存中的一块数据。用变量存储我们当前shell会话 和工作环境相关的一些信息,所以这就是环境变量名字的由来。
shell环境变量的分类:系统变量,用户自定义变量。;或者分为全局变量,局部变量。
查看当前所有的系统创建的全局环境变量,不包括用户变量,env命令。
注意有的命令不加$。
全局变量在子shell也是可以输出的。局部变量只能在当前shell中执行。
2. 用户自定义变量
发现子shell并没有之前创建的var变量。
将var变量变为全局变量 export
在shell中修改全局后只会影响子shell和他自己 ,对于他的父shell没办法影响。
用户自定义的变量是一个局部变量,除非指定为静态。
3. 全局变量_只读变量_撤销变量
变量的默认类型全按照字符串进行,没有办法进行数值计算。
a=2
echo $a 返回2
a=1+5
echo $a 返回1+5
进行数值运算需要特定的语法格式
定义只读变量 readonly(只读)
撤销变量 unset(卸载)unset a 卸载变量a
只读变量(常量)不能卸载,变量才可unset。
4. 特殊变量
如何让脚本可以像系统命令ls那样直接敲出运行。就需要配置环境变量
echo $PATH 可以把脚本直接放入path所包含的路径下。但是本身存在的path下的路径都是与系统命令相关的。显然把我们自定义的脚本放入其中不合适。
可以把自己脚本目录添加在path变量下,使用:分隔。
(1)$n
双引号会被解释器以为$n是一个变量,但此时变量未定义,会显示为空。单引号会把括起来的内容直接输出 ,不会对变量进行解释。
bashname获取一个文件本身的名称。
(2)$#
在文件中写入测试$#
(3)$*与$@俩者类似又有些许不同
$@可以被作为可迭代对象。总之就是一个字符串,一个数组。
(4)$?
echo $? 返回0表示上一次脚本被成功执行了
19.4 运算符
1 + 4 相当于作为expr的三个参数传进去了(+左右有空格) 。*有特殊含义,需要转义。
上图中的加减运算显得有点麻烦,所以Linux就针对shell运算出现一种更简洁的运算方法。
a=$[6+8]
echo $a a为14
a=$(expr 5 \* 2)
echo $a a为10
案例脚本实现
19.5 条件判断
shell将表达式是否正确执行作为返回值,正确执行返回0,错误执行返回1.。所以这里0代表着真,1代表了假。
test比较麻烦,简洁的是直接用【】。
表达式做比较时也要空开,否则shell将其解释成一个式子。
多条件实现了类似于Java中的三元运算符操作。
19.6 流程控制(重点)
19.6.1 if单分支
vim写一个脚本,并且赋予x执行权限。
如果表达式直接 $1 = ayguigu ,会执行不成功,会解释为空,所以为了不解释为空,进行字符串处理,还要俩边都加上x(不带字符串的),保证左右一致。
执行结果如上。
if后边表达式的写法优化,将多个条件表达式放入一个中括号里。需要-a选项,(and的意思)
19.6.2 if多分支
语法:
vim编写脚本
19.6.3 case多分支
如果说if多分支是二叉树,那么case语句更像一个多叉树。
esac是case的反写。
vim编辑脚本
19.6.4 for循环
语法1:
案例:1-100累加
这里(())是可以替换为[ ] 。Linuxshell的+不能直接进行加法,+不加括号会被当成字符串加起来,所以还需要$【】括起来。
vim编写一个脚本
根据自己传过去的$1变量值进行计算累加和。
注意:<,>号这些符号不能用来进行直接使用,上一节说比较大于小于关系时用 -lt,-gt。这里能用大于小于号是因为在双括号里,可以支持一些数学运算。
在运算符章节语法中说到(())等价于【】,这里面的是可以直接使用一些数学表达式的。
所以for循环语法可以直接使用小于大于号了。
语法2(常用):
in 后面相当于一个序列遍历,{ }是Linux的一个内部符号,所以不能随便使用{},它具有特殊含义。{1..100}表示从1到100.。
for循环区分比较$*和$@的区别
vim编辑脚本
1. $@ $*都没有加“双引号”
2. 当$@ $*都加上双引号时
“$*”代表了一个元素,将其作为一个整体进行了输出;而$@代表了遍历,总共有5个元素。
只是为了打印出来这里用的是 $* 所以用单引号,如果是双引号的话 $* 会被当做命令执行了。双引号如果在特定符号前面加上转义字符\那么也可以只单纯的表示这个符号。
19.6.5 while循环
le是小于等于的意思。因为Linuxshell没有a++,这样的语法,所以要变成a=a+1,又因为a+1是一个加法运算,必须加上$[],因为需要引用变量所以还需要$变量。
中括号与里面的判断式之间需要空格,这是中括号语法格式要求的。中括号与外面的赋值表达式之间不可以空格,可能是因为linux会误认为是一种命令。
由于shell的设计初衷并不是高效写代码,它负责与底层操作系统打交道,所以命令编程显得过于繁琐。所以有一个更简单的命令可以让shell编程也像其他编程语言一样进行输入。
这就是let命令
如上图加入let ,后面的命令就可以像其他语言的语法一样进行了,但是注意,仍然是不能有空格,以防shell误解释。
现在大部分的shell还都是老式的语法,所以还有必要掌握之前的语法才行。
19.7 读取控制台输入
19.8 函数
19.8.1 系统函数
函数可以基本理解为一个脚本,实现某种功能的代码集合。系统函数就是系统提供我们的功能需要。函数可以说是一个轻量级的脚本。
PS:shell有内置命令,还有外部命令,放在user/bin目录下,通常,称这些复杂的外部命令也叫工具。
date系统函数传入一个实参时间戳,得到返回结果,加$调用。最后字符串拼接赋值给filename。
之前返回$0脚本名称时,会把路径都显示,现在借助basename可以直接输出文件名,它起到了一个字符串剪切的功能。
对之前的脚本完善就变成了下图
系统函数调用就是$(系统命令),这也叫命令替换,它的本质都是一个意思。
这个脚本完善了打印绝对路径的功能
19.8.2 自定义函数
这里我们直接在函数内进行了echo输出。
有没有$?就可以捕获到函数的结果呢,实现获得函数返回值后可以利用返回值进一步计算。如果是上图输入$?会显示为0。
19.9 综合应用案例,归档文件
脚本实现
将文件归档设置为定时任务
分时日月周
在每天的2点执行归档脚本,需要归档的目录为/root/scripts。
PS:archive归档
这里的-d作用是判断文件是否存在并且是一个目录
${var},即是加一个大括号来限定变量名称的范围
最后就实现了重要数据的定时归档。
19.10 正则表达式(入门)pattern
19.10.1 简单用法
定义匹配模式规则 ,就是正则表达式。
特殊字符还可以进行模糊匹配
^$它会匹配为所有的空行。
PS: .*表示匹配任意字符的任意多次,也就是可以匹配任意多个不知道的字符。*在正则中并不是表示任意一个字符,它必须与前面的字符相搭配才有效果。
19.10.2 扩展用法
PS:除了使用反斜杠,还得使用单引号引起来才行。
为什么要转义呢?因为使用过程中我们有匹配特殊字符的需求。
案例:精确匹配手机号
PS:为什么不能【1-9】*,不是说匹配任意长度的数字字符串吗?
因为手机号必须十一位。
19.11 文本处理工具
19.11.1 cut
也可以指定多列
19.11.2 awk
(1)基本功能
PS:awk工具的三位创始人名字! 目前最为强大的文本分析工具。awk和gawk是同一个软件。gawk是GNU协议的实现
单引号里面是正则加操作。{}相当于一个代码块。
案例操作
(2)扩展功能
案例实现
虽然上诉方法可以实现最终结果,但假如需求发生变化,变成加2加3,就需要修改代码,显然还不够最优。基本思想是让变量成为用户输入的值,直接传进去实现变量的替换。
内置变量案例
虽然grep也能输出行号,但是还顺便输出了一个:。不够彻底,因此awk可以实现只输出行号。
awk还有一个好处就是默认以空格分隔,并且前面所有的空格都可忽略不计,所以直接$2找到第二列。
19.12 综合应用案例_发送消息
案例需求如上:
PS:who查看所有的在线用户。mesg查看自己是否打开消息功能。who -T查看所有用户是否打开消息功能。write指定用户名,和用户控制台。Ctrl+C中断。EOF表示文件结束。
如何用一个脚本实现输入变量用户名,直接发消息就可以了。
脚本实现:
$1是第一个参数,对应用户名。$2是第二个参数,表示消息。
$*:将所有参数当做一个整体输出 $@:将所有参数当做个体输出
发现成功发送了消息,并且接受用户成功接受到了消息。
20 Linux入门正式完结
注重实践,勤奋好学!