WSL-ubuntu常用操作
1,基础
1-1,安装与卸载
- wsl2.0
- 应用商店-ubuntu /mnt 为windows文件系统(挂载)
- docker desktop
- docker desktop settings/resource/WSL INTEGRATION/UBUNTU 可以在子系统中共享docker
- How to Fix Docker Permission Denied Error on Ubuntu
- 应用商店-windows terminal
1-2,常用命令
du -h --max-depth=1 查看当前路径下各文件夹的大小
lsof -i:端口号 查看端口占用
help
man
ping
whereis 查询文件的位置
which 在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果
file 查看文件的类型
who 查看当前在线的用户
whoami 当前用户
pwd 当前工作目录
uname -a 查看内核信息
echo 打印语句(>>输出到文件)
clear 清屏
history 历史
wget 从网络链接下载文件
curl 进行http请求
dd 制作镜像
mount /dev/*** /mnt 挂载设备
df -h 查看磁盘使用情况
time 统计命令运行耗时
tar -zvcf *** *** 压缩 (-c打包,-f指定文件名,-z".tar.gz"格式压缩,-j".tar.bz2"格式压缩,-v显示过程)
tar -zvxf *** -C *** 解压缩 (-x解包,-C指定解包目录)
zip -r myfile.zip ./*
unzip -d 指定目录 ***.zip
unzip 解压缩zip文件
hostname 主机名
hostname *** 临时修改主机名
hostnamectl set-hostname *** 永久更改主机名
ulimit -a 查看系统参数限制(最大进程数等)
free -m 看内存
df -h 看磁盘
top 看cpu和内存
lsof -i:3306 看端口占用
1-3,特殊字符
- .
- 如果在文件的开始,说明是个隐藏文件(ls -a)
- .指向当前目录
- ..指向上一层目录
- $
- 说明后面跟着的是一个变量,变量是一个指针,$是取指针的值
- $PATH 系统的环境变量
- 说明后面跟着的是一个变量,变量是一个指针,$是取指针的值
-
- 通配符
- ~
- 当前用户的家目录
- 每个用户的家目录是不同的
- root用户家目录在系统根目录下
- 其他用户的家目录以/home/用户名为家目录
- 当前用户的家目录
- 空格
- linux命令与参数用空格隔开
- /
- 这个linux的文件根目录
- 命令的参数
- 如果是单词一般加--
- 如果是字母或缩写一般加-
2,系统操作
2-1,文件系统命令
=========================================目录操作=========================================
cd 切换目录
ll ls 显示当前指定目录下的所有文件(开头-普通文件,d文件夹,l软连接|快捷方式)
mkdir 创建目录
mkdir -p 自动创建父目录(后面可以跟上{}一次创建多个目录,中间用,隔开)
rmdir 删除空目录(比较安全,比rm -rf强。。。)
=========================================文件操作=========================================
cp 源文件 目标路径 拷贝一个文件
cp -r 源文件夹 目标路径 拷贝一个文件夹
cp -r 源文件夹* 目标路径 拷贝一个文件夹下的所有文件
mv 源文件 目标路径 移动(剪切)一个文件
mv 源文件夹 目标路径 移动(剪切)一个文件夹
mv 源文件夹* 目标路径 移动(剪切)一个文件夹下的所有文件
mv 原文件名字 目标文件名字 修改文件名字
rm 文件 删除文件
rm -f 文件 强制删除文件
rm -r 文件夹 删除文件夹
rm -rf /* 终极命令
touch 文件 创建文件(如果有了文件,修改元数据信息中的Access(何时有人访问)、Modify(何时改变了内容)、Change(何时改变了元数据/属性信息)三个时间)
stat 文件 查看文件的元数据信息
ln 目标文件 链接名 创建硬链接指向目标文件(ll类型开头为-)
ln [options] existingfile newfile(sexistingfile 待建立链接文件的文件,newfile是新创建的链接文件)
ln [options] existingfile-list directory
-f 建立时,将同档案名删除.无论”newfile”存在与否,都创建链接
-i 删除前进行询问
-n 如果”newfile”已存在,就不创建链接。
ln -s 目标文件 链接名 创建链接(软链接)指向目标文件(相当于快捷方式)(ll的时候,类型开头为l,并且后有表示指向谁)
软链接指向的文件被删除,slink就废了,hlink还在;并且修改hlink的值,目标文件以及slink的值也会做相应的修改。(硬链接可以用来保护文件不被删除)
cat 文件 查看文件的内容(正序完全加载)
tac 文件 倒序完全加载文件内容
more 文件 正序加载整屏的文件内容,回车一行行向下加载,b一行行向前,空格一页页向下加载,h会给出提示信息,q退出
less 文件 与more类似,但h会发现多了一些命令
head -number 文件 取文件的前number行
tail -number 文件 取文件的后number行
head -number 文件 | tail -1 通过管道取文件的第number行
tail -f/-F 文件 监控正在改变的文件(如果是-f,监听指定inode的文件,但如果文件被删除,即使重新创建,inode也会发生变化从而监听失败;如果是-F,则监听指定名字的文件,如果文件被删除并重新创建,则会继续监听新创建的重名文件)
find 搜索范围(如/) -name 目标文件 范围搜索文件的位置
find . -maxdepth 1 -name *** 在当前目录层级搜寻目标***
2-2,vi编辑器
=========================================vi编辑器=========================================
* vi 文件名 vi打开文件
* vi +8 文件名 vi打开文件并定位到第8行
* vi + 文件名 vi打开文件并定位到最后一行
* vi +/指定搜索单词 文件名 vi打开文件并定位到指定搜索单词
=========================================vi编辑器三模式=========================================
* 编辑模式 按ESC进入 可使用各种快捷键(编辑模式中每一个按键都是快捷键)
* 输入模式 按i进入 向文本中输入内容
* 末行/命令行模式 按:进入 不属于文件内容,可以保存退出等,执行一些特定的命令
=========================================三模式的切换=========================================
* vi打开文件进入编辑模式
* 编辑模式下按i进入输入模式(i插入,a追加,I行首,A行尾,o下一行,O上一行)
* 输入模式按ESC进入编辑模式
* 编辑模式按:进入命令行模式
* 命令行模式按ESC进入编辑模式
=========================================编辑模式=========================================
* G 最后一行
* gg 第一行(数字gg 跳转到数字行)
* w 下个单词(数字w)
* dw 删除一个单词(数字dw)
* dd 删除一行(数字dd)
* u 回退到前面的操作(. 撤销u的操作)
* yw 复制一个单词(数字yw)
* yy 复制一行(数字yy)
* x 剪切(数字x)
* p 粘贴(数字p)
* r 替换目标,然后输入一个字符替换(数字r)
* hjkl 方向键
* shift 6 行首
* shift 4 行尾
* pageup pagedown 一页的最上和最下
* shift zz 保存并退出(ZZ)
* ctrl s 锁屏 strl q 解锁
=========================================输入模式=========================================
* 输入啥是啥
=========================================命令行模式=========================================
* wq 保存并退出
* w 保存
* q 退出
* q! 强制退出
* set nu 显示行号
* set nonu 隐藏行号
* /查找的目标 查找
* s/p1/p2 用p2替换p1,一次替换一个
* s/p1/p2/g 将当前行所有的p1替换为p2
* g/p1/s//p2/g 所有p1替换为p2
2-3,用户、用户组、权限
2-3-1,用户
新增用户
useradd ***
会创建同名的组和家目录
设置密码
passwd ***
切换用户
su ***
删除用户
userdel -r ***
级联删除家目录和组
修改用户信息
usermod -l *** *** (修改用户名,家目录和组信息不会被修改)
usermod -L *** (锁定用户名)
usermod -U *** (解锁用户名)
常用文件
cat /etc/shadow (用户名和密码)
cat /etc/passwd (用户名、用户编号、组编号、家目录、所用bash)
2-3-2,用户组
创建组
groupadd ***
删除组
groupdel ***
修改组信息
groupmod -n *** ***
查看用户对应的组
groups (当前用户所在的组)
groups *** (当创建用户的时候,默认创建一个与同名的主组)
修改用户的组
usermod -g(主组) ***(用户名) ***(组名)
usermod -G(附属组) ***(组名) ***(用户名)
2-3-3,权限
三组权限(UGO模型:文件所有者,文件所属组,其他用户),每组三个字母
r/4:读权限
w/2:写权限
x/1:执行权限
-:没有权限
修改文件权限方法1:修改文件所属
chown ***(用户) ***(目标文件) 修改文件所有者
修改文件权限方法2:修改文件的rwx
chmod u/g/o +/- r/w/x ***(目标文件) 增添或删减ugo对应的权限
chmod o=rw ***(目标文件) 修改ugo对应的权限
facl:文件访问控制列表,权限控制更加灵活
getfacl ***
查看***文件的权限信息
setfacl -m u:用户名/g:用户组名:权限 文件名
赋予权限
例如:setfacl -m u:user1:r afile setfacl -m u:user2:rw afile
setfacl -x
收回权限
3,系统管理
3-1,网络管理
3-1-1,网络状态查看(net-tools,iptoute2,网络接口命名修改)
1, net-tools(centos7前的工具包)
* ifconfig
* route [-n]
* netstat
2, iproute2(centos7及之后主推的工具包)
* ip
* ss
3,网络接口命名修改
* 网卡命名受biosedvname和net.ifnames两个参数影响
biosedvname=0, net.ifnames=0, 网卡名=eth0
biosedvname=0, net.ifnames=1, 网卡名=ens33
biosedvname=1, net.ifnames=0, 网卡名=em1
* 编辑 /etc/default/grub 文件,增加 biosedvname=0, net.ifnames=0
* 更新grub
grub2-mkconfig -o /boot/grub2/grub.cfg
* 重启
reboot
3-1-2,网络配置
1,接口/网卡配置
* ifconfig <接口/网卡> <ip地址> [netmask 子网掩码]
* ifup <接口/网卡> (启用接口/网卡)
* ifdown<接口/网卡> (关闭接口/网卡)
2,网关配置
* 添加网关
* route add default gw <网关ip>
* route add <指定ip> gw <网关ip>
* route add -host <指定ip> gw <网关ip> (明细路由)
* route add -net <指定网段> netmask <子网掩码> gw <网关ip> (明细路由)
* 删除网关
* route del <destination/指定ip> gw <网关ip>
3,以上命令与ip的对应
3-1-3,网络故障排除(ping, traceroute, mtr, nslookup, telnet, tcpdump, netstat, ss)
ping
* 检测和目标主机是否畅通
* ping 域名/ip
traceroute
* 追踪到目标主机的每一跳
* traceroute 域名/ip
mtr
* 检查和目标主机之间是否有数据包丢失
* mtr 域名/ip
nslookup
* 查看目标主机域名对应的ip
* nslookup 域名
telnet
* 检查端口的连接状态
* telnet 域名/ip 端口号
tcpdump
* 更细致的分析数据包,网络抓包
* tcpdump -i any -n host ip号 and port 端口号 -w 要保存的文件名称
netstat
* 查看服务的监听地址
* netstat -ntpl(不解析域名,tcp,显示进程号,监听)
ss
* 查看服务的监听地址
* ss -ntpl
3-1-4,网络配置文件
网络服务管理程序分为两种,分别为SysV和systemd
* service network status|start|stop|restart
* chkconfig --list network
* chkconfig --level ???(2345) network on|off
* systemctl list-unit-files NetworkManager.service
* systemctl start|stop|restart NetworkManager
* systemctl enable|disable NetworkManager
网络配置文件
* ifcfg-eth0
* /etc/hosts
System has not been booted with systemd as init system (PID 1). Can't operate.
3-2,系统进程管理
3-2-1,进程信息(ps, pstree, top)
ps -ef
* UID PID PPID C STIME TTY TIME CMD
* UID:所属用户
* PID:进程编号
* PPID:当前进程编号的父进程编号
ps -ef | grep ***
查看特定进程的信息
ps -eLf
显示线程信息
ps -aux
包含CPU和内存使用率
ps -aux --sort -p***(pid cpu ...)
按***排序显示
pstree
查看进程的树形结构
top
实时显示内存使用率
* PR 系统优先级
* NI 进程的nice值,进程的优先级
top -p PID
查看某一特定进程
ll /proc
进程在linux中都对应一个文件,就是这里的文件
kill -9 PID
杀死某进程,对应的/proc中的文件也被删除
ps -ef |grep ***| awk'{print $2}'| xargs kill -9
awk'{print $2}'指第二列的内容,是运行的程序ID;可以通过xargs将ID传递给kill -9,让其关闭
3-2-2,进程控制(nice,renice,&, jobs,fg, bg, ctrl+z)
1,调整优先级
* nice 范围从-20到19,值越小优先级越高,抢占资源越多,对未启动的程序设置优先级再启动运行
nice -n 优先级-20到19 程序名
* renice 重新设置优先级,修改正在运行的进程的优先级
renice -n 优先级-20到19 PID
2,进程的作业控制
* &符号
在命令后面添加 &,进程会以后台进程的方式启动
* nohup 命令 &
nohup可以防止后台进程被挂起(关闭终端,程序依然运行;nohup忽略输入并把输出追加到"nohup.out")
* jobs -l
可以获取当前的后台信息,但只有当前用户界面可以获取到
* fg jobs中的编号
将后台进程调度为前台进程
* ctrl z
将前台进程以stopped形式调度到后台,常用于临时停止进行磁盘备份
* bg jobs中的编号
将停止的进程以后台方式运行
3-2-3,程序运行的第三种方式:服务
- 三种方式:前台、后台、服务
- Linux中的服务一般都是常见的,一直在运行的命令,其独立于控制终端,不受前台和终端的控制,在后台周期性地执行某种任务或等待处理某些发生的事件。运行服务的进程通常被成为后台进程(守护进程)。服务由service启动,并配置。使用上通常由systemctl命令进行控制。
- 服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql , sshd 防火墙iptables等),因此我们又称为守护进程,是 Linux 中非常重要的知识点。
- 之所以可以成为服务并且能够开机启动,是因为
- 在ubuntu中,/lib/systemd/system 目录下会创建一个XXX.service配置文件,里面定义了如何启动、如何关闭
- 在CentOS中,/usr/lib/systemd/system 目录下目录下会创建一个XXX.service配置文件,从而成为一个服务
- 服务(提供常见功能的守护进程)集中管理工具:
- service
- systemctl
systemctl status|start|stop|restart|reload|enable|disable 服务名称(***.service)
systemctl start ***
启动服务
systemctl enable ***
设置开机启动
3-2-4,进程间通信
- 信号是进程间通信方式之一,典型用法是:终端用户输入中断指令,通过信号机制停止一个程序的运行。
kill -l 查看所有可支持的信号(1-64)
ctrl+c 使用kill的2号信号,SIGINT
kill -9 PID 使用9号信号,SIGKILL
3-3,软件安装
3-3-1,环境变量
当执行一个命令的时候,默认从当前路径开始查找;
如果当前命令找不到对应的命令文件,从环境变量$PATH查找
$PATH配置文件在 /etc/profile(不能cd,只能vi,这是一个文件)(安装软件后配置环境变量也是修改该文件)
windows路径与路径之间用;(分号)连接,linux路径与路径之间用:(冒号)连接
linux每次修改完成之后,需要重新加载文件 source/etc/profile
3-3-2,安装的方式(软件包安装、解压包安装、源码编译、包管理平台)
- 软件包安装(Ubuntu的软件包格式是deb,centos的软件包格式是rpm,可以用用alien把rpm转换成deb)(dpkg(ubuntu)、rpm(centos))
- 查看安装了哪些软件:rpm -qa dpkg -l
- 删除软件:rpm -e dpkg -r
- 解压包安装(比如tomcat)
- 源码编译安装
- 下载压缩包,解压缩,进入解压后目录
- ./configure --prefix = /usr/local/*** 指定安装位置(生成makefile)
- make -j2 用2个逻辑cpu进行编译(生成build)(查看cpu个数:lscpu)
- make install 将编译好的软件安装到指定目录
- 借助包管理平台安装(pip(python)、apt(ubuntu)、yum(centos)、360、腾讯管家)
- centos的源配置文件:/etc/yum.repos.d/CentOS-Base.repo
- ubuntu的源配置文件:/etc/apt/sources.list
3-3-3,使用dpkg进行软件包安装
- deb是debian linux的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb
3-3-4,使用apt-get/apt进行包管理平台安装
操作 | Centos | Ubuntu |
---|---|---|
软件源配置文件 | /etc/yum.conf | /etc/apt/sources.list |
安装软件包 | yum install package | apt-get install package |
删除软件包 | yum uninstall package | apt-get remove package |
删除有依赖关系软件包和配置文件 | yum uninstall package | apt-get autoremove package --purge |
查看安装包 | yum info package | apt-cache show package |
查看已安装的软件 | yum info package | apt-get install package 或 dpkg -s package |
更新软件包列表 | yum update | apt-get update |
清除缓存 | yum clean | apt-get clean |
- Ubuntu中apt与apt-get命令的区别
- 最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令当中。
- apt 命令的引入就是为了解决命令过于分散的问题,它包括了 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。
- 虽然 apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令。
- 作为一个常规 Linux 用户,系统极客建议大家尽快适应并开始首先使用 apt。不仅因为广大 Linux 发行商都在推荐 apt,更主要的还是它提供了 Linux 包管理的必要选项。 最重要的是,apt 命令选项更少更易记,因此也更易用,所以没理由继续坚持 apt-get。
- 目前还没有任何 Linux 发行版官方放出 apt-get 将被停用的消息,至少它还有比 apt 更多、更细化的操作功能。对于低级操作,仍然需要 apt-get。
apt 命令 | 取代的命令 | 命令的功能 |
---|---|---|
apt install | apt-get install | 安装软件包 |
apt remove | apt-get remove | 移除软件包 |
apt purge | apt-get purge | 移除软件包及配置文件 |
apt update | apt-get update | 刷新存储库索引 |
apt upgrade | apt-get upgrade | 升级所有可升级的软件包 |
apt autoremove | apt-get autoremove | 自动删除不需要的包 |
apt full-upgrade | apt-get dist-upgrade | 在升级软件包时自动处理依赖关系 |
apt search | apt-cache search | 搜索应用程序 |
apt show | apt-cache show | 显示安装细节 |
- 当然,apt 还有一些自己的命令:
新的apt命令 | 命令的功能 |
---|---|
apt list | 列出包含条件的包(已安装,可升级等) |
apt edit-sources | 编辑源列表 |
3-3-5,内核升级
* apt格式安装
* uname -r 查看内核版本
* apt install kernel-***** 升级内核版本
* apt update 升级已安装的其他软件包和补丁
* 源码编译安装
* 内核源码地址:www.kernel.org
* 解压缩,进入解压缩后的目录
* 配置内核编译参数
* make menuconfig | allyesconfig | allnoconfig
* 使用当前系统内核配置 cp /boot/config-kernelversion.platform 解压缩后的目录/.config
* 查看cpu
* lscpu
* 编译
* make -j2 all
* 安装
* make modules_install (安装支持内核模块)
* make install (安装内核)
3-4,内存与磁盘管理
3-4-1,使用率查看命令
- 内存
- free [-m -g]
- top
- 磁盘
- fdisk 可查看,可分区
- fdisk -l
- df [-h]
- du
- du与ls的区别:du -h显示文件实际大小;ls -lh显示文件虚拟化的大小(空洞文件);du实际统计数据块数目(1个数据块固定为4k);ls读取i节点信息 ls-li
- 空洞文件
- fdisk 可查看,可分区
3-4-2,文件系统管理
- linux支持多种文件系统,常见的有:
- ext4
- xfs
- NTFS(Windows文件系统,linux支持需要安装额外软件)
- ext4文件系统基本结构
- 超级块
- 超级块副本
- i节点(inode):记录数据元信息
- 数据块(datablock):存储数据
- Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系
3-4-3,磁盘分区与挂载(fdisk创建分区,mkfs格式化分区,挂载)
- 挂载的作用
- linux操作系统将所有的设备都看作文件,它将整个计算机的资源都整合成一个大的文件目录。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。挂载就是把设备放在一个目录下,让系统知道怎么管理这个设备里的文件,了解这个存储设备的可读写特性之类的过程,访问这个目录就是访问该存储设备。
- 插入了新硬盘会会获得/dev/sdb1 吗,直接对它操作不就行了?这不是它的目录吗?这不是它的目录。虽然/dev是个目录,但/dev/sdb1不是目录。可以发现ls/dev/sdb1无法执行。/dev/sdb1,是一个类似指针的东西,指向这个分区的原始数据块。mount前,系统并不知道这个数据块哪部分数据代表文件,如何对它们操作。
- 插入CD,系统其实自动执行了 mount /dev/cdrom /media/cdrom。所以可以直接在/media/cdrom中对CD中的内容进行管理。
- 常用命令
- fdisk
- 创建分区
- fdisk -l 查看都有哪些硬盘
- fdisk 硬盘(/dev/sda) 硬盘操作交互界面 m查看帮助 n创建新分区 p主分区 e扩展分区。。。 根据交互提示进行操作 q退出 w写入 d删除分区
- mkfs
- 分区映射(格式化),操作时确保硬盘中无数据。
- mkfs[.ext4等文件系统] 分区名称
- mount
- 将设备挂载到目录,这样对目录的操作就相当于对设备操作
- mount 分区 目录(一般在/mnt创建目录)
- parted
- 如果硬盘大于2T,无法用fdisk分区,需要用parted分区
- fdisk
- 常见配置文件
- /etc/fstab
3-4-4,用户磁盘配额
- xfs文件系统的用户磁盘配额 quota
fdisk创建分区
mkfs.xfs /dev/sdb1
mkdir /mnt/disk1
mount -o uquota, gquota /dev/sdb1 /mnt/disk1 #支持用户磁盘配额和组磁盘配额进行挂载
chmod 1777 /mnt/disk1
xfs_quota -x -c 'report -ugibh' /mnt/disk1 #查看用户、组的节点、数据块的配额信息,h表示详细显示
xfs_quota -x -c 'limit -u isoft=5 ihard=10 user1' /mnt/disk1 #限制用户磁盘配额,soft限制可以短期超限(report中会有宽限时间),hard限制一定不可以超过,i为链接,b为数据块
- 进一步可以学习使用虚拟化技术限制cpu使用、内存使用、硬盘使用等
3-4-5,交换分区swap的查看和创建
- swap:虚拟内存
- free -m
- 使用硬盘分区增加swap的大小
对磁盘分区
mkswap 分区名 对分区进行swap格式化(类似于mkfs)
swapon 分区名 swap挂载使用(类似于mount)
swapoff 分区名 关闭swap挂载
- 使用文件制作交换分区
dd if=/dev/zero bs=4M count=1024 of=/swapfile 创建4M*1024大小的文件
mkswap /swapfile (有时会报错要求修改600权限,chmod 600 /swapfile)
swapon /swapfile
- 为了使swap分区修改永久生效,需要修改/etc/fstab文件
/etc/fstab文件中写入
/swapfile swap swap defaults 0 0
(要挂载的分区 挂载到哪 文件系统类型 权限 备份时要不要备份这块分区 磁盘自检的顺序)
3-4-6,磁盘阵列RAID与软件RAID技术
- RAID的常见级别及含义
- RAID 0 stiping 条带方式,提高单盘吞吐率(最少两块)
- RAID 1 mirroring 镜像方式,提高可靠性(最少两块)
- RAID 5 有奇偶校验(最少三块)
- RAID 10 是RAID1与RAID0的结合(最少四块)
- 硬件RAID:RAID卡
- 软件RAID(大量读写时比较耗CPU):mdadm
创建并使用RAID
fdisk创建多块分区(比如/dev/sdb1, /dev/sdc1, /dev/sdd1)
mdadm -C /dev/md0(磁盘阵列分区) -a yes -l1(RAID1级别) -n2(两块分区组成阵列) /dev/sd[b,c]1 创建RAID分区,md0是基于/dev/sdb1和/dev/sdc1创建的
mdadm -D /dev/md0 查看RAID分区
echo DEVICE /dev/sd[b,c]1 >> /etc/mdadm.conf 写入RAID配置1
mdadm -Evs >> /etc/mdadm.conf 写入RAID配置2
mkfs.xfs /dev/md0 格式化RAID
mount 挂载
停止并破坏RAID
mdadm --stop /dev/md0 停止RAID
dd if=/dev/zero of=/dev/sdb1 bs=1M count=1 破坏超级块
dd if=/dev/zero of=/dev/sdc1 bs=1M count=1 破坏超级块
3-4-7,逻辑卷LVM管理,文件系统层次结构
- 逻辑卷和文件系统的关系
- LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。
- LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。
- LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。
- https://www.cnblogs.com/cloudos/p/9348315.html
- 为linux创建逻辑卷
fdisk创建多个分区(比如/dev/sdb1, /dev/sdc1, /dev/sdd1)
pvcreate /dev/sdb1, /dev/sdc1, /dev/sdd1 创建物理卷(也可以基于RAID创建物理卷)
pvs 查看创建的物理卷
vgcreate vg1 /dev/sdb1, /dev/sdc1, /dev/sdd1 基于物理卷创建卷组
vgs 查看卷组
lvcreate -L 100M -n lv1 vg1 从卷组中划分逻辑卷
lvs 查看逻辑卷
mksf.xfs /dev/lv1/vg1 格式化逻辑卷
mount 挂载
- 动态扩容逻辑卷
vgextend 卷组(centos) 分区(/dev/sdd1) 使用分区先扩充逻辑卷所在的卷组(卷组可以通过pvs,vgs,lvs进行查看)
lvextend -L +100M/G 逻辑卷(/dev/centos/root) 从卷组中划分区域扩充逻辑卷
xfs_growfs 逻辑卷(/dev/centos/root) 通知文件系统逻辑卷扩充
- 文件系统分层:物理磁盘(fdisk)->分区(fdisk)->磁盘阵列RAID->物理卷pv->卷组vg->逻辑卷lv->挂载->文件系统
3-5,其他
3-5-1,grub配置文件
- grub是多系统引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成。
- grub配置文件
- /etc/default/grub
- /etc/grub.d
- /boot/grub2/grub.cfg
- grub2-mkconfig -o /boot/grub2/grub.cfg
3-5-2,screen命令
- screen 是一个非常有用的命令,提供从单个 SSH 会话中使用多个 shell 窗口(会话)的能力。当会话被分离或网络中断时,screen 会话中启动的进程仍将运行,可以随时重新连接到 screen 会话。
screen 进入screen环境
ctrl+a d 退出(detached)screen环境
screen -ls 查看screen会话
screen -r sessionid(ls结果中.前的数字) 恢复会话
https://handerfly.github.io/linux/2019/03/31/Screan命令的使用/
https://www.runoob.com/linux/linux-comm-screen.html
https://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html
3-5-3,安全组件:SELinux
- DAC(自主访问控制):用户自己配置权限进行访问控制
- MAC(强制访问控制):进程、用户、文件都打标签,都对的上才允许访问
- SElinux的配置文件
/etc/selinux/config - 查看SELinux的命令
getenforce
3-5-4,系统综合状态查询:sar,iftop
- sar命令查看系统综合状态
- 第三方命令查看网络流量
- apt install epel-release
- apt install iftop
- iftop -P
4,shell脚本
4-1,认识shell脚本
- UNIX的哲学:一条命令只做一件事,为了组合多个命令或将命令多次执行,使用脚本文件保存寻要执行的命令
- 脚本文件赋予执行权限(chmod u+rx filename)
- sha-bang 声明解释器
#!/bin/bash
#!/usr/bin/python
- shell脚本的运行方式
- bash filename 此方法不用赋予执行权限,创建新子进程执行,不影响当前运行环境(脚本中cd不会改变命令行当前目录)
- ./filename 此方法需要赋予执行权限,创建新子进程执行,不影响当前运行环境
- source filename 不会创建新子进程,影响当前运行环境
- . ./filename 不会创建新子进程,影响当前运行环境
- 内建命令不需要创建子进程,对当前shell有影响;外部命令需要创建子进程,不对当前shell产生影响。
4-2,管道
- 管道和信号一样,也是进程通讯的方式之一
- 匿名管道(管道符)是shell编程进场用到的通讯工具
- 管道符 | , 作用是将前一个命令的执行结果传递给后一个命令
cat *** | grep a 使用grep进行文本搜索
head -8 *** | tail -1 显示文件特定行
- ;的作用是隔开两个命令,第一条命令执行完再执行第二条,两条命令之间没有任何关系
4-3,重定向
- 一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符
- 输入重定向,使用文件代替键盘进行输入
- 符号 <
wc -l < file 统计file有多少行
cat file | wc -l
read var < *** 输入数据***并保存到变量var
echo $var
- 输出重定向,使用文件代替终端进行输出
- 符号 > >> 2> &>
>(覆盖)
>>(追加)
2> 2>> (前面的2为标准错误,1为标准输出可省略)
&> (无论输出是标准输出还是错误输出,都输出到指定的文件)
>> *** 2>&1 (无论对错都追加)
>> /dev/null (数据黑洞)
nohup *** >out.file 2>&1 & (1表示标准输出,2表示标准错误,2>&1表示标准输出和标准错误合并,都合并到out.flie中)
4-4,shell变量
- 变量的定义:变量名只能由字母、数字、下划线组成,不能以数字开头
- 变量赋值(又称变量替换)
a=123 直接赋值,赋值时=左右不能出现空格
let a=123 使用let关键字
l=ls 将命令赋值给变量
let c=$(ls -l /etc) 将命令结果赋值给变量,使用$()或者``(数字1右边的反引号)
变量值中有空格等特殊字符可以包含在""或''中,并且''中的变量不会进行解释,""中的变量会进行解释
var1=123
echo '$var1'
echo "$var1"
- 变量引用
${变量名} 对变量的引用,$可以理解为取值
echo ${变量名} 查看变量的值
${变量名}在部分情况下可以省略为 $变量名
- 变量默认作用范围:默认只在当前终端的shell进程范围内生效(四种运行脚本方式的区别后两种才能读取当前shell的变量)
- 定义变量时使用export 关键字,可以使得子进程得到父进程的变量取值
export var1=123
- 取消变量的赋值
unset 变量名
- 系统环境变量:每个shell打开都可以读取到的变量
- env 命令可以查看已存在的环境变量
- PATH变量保存了系统默认的搜索路径,可以使用 PATH=$PATH:*** 进行临时添加
- 预定义变量
- $? 上一条命令是否执行成功,0成功,非0不成功
- $$ 当前进程的PID
- $0 当前进程的名称
- 位置变量:
- env 命令可以查看已存在的环境变量
$1, $2, ..., $9, ${10}, ...
- 环境变量的配置文件
- /etc/profile
- /etc/profile.d
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
4-5,shell数组
- 定义数组
IPTS=( 10.0.0.1 10.0.0.2 10.0.0.3 )
- 显示数组所有元素
echo ${IPTS[@]}
- 显示数组元素个数
echo ${#IPTS[@]}
- 显示数组的第一个元素
echo ${IPTS[0]}
4-6,shell运算符
- 赋值运算符
= 用于算术赋值和字符串赋值
使用unset取消为变量的赋值
= 除了作为赋值运算符还可以作为测试运算符
- 算术运算符
+ - * / ** % 基本算术运算符
使用expr进行运算
expr 1 + 1
var1=`expr 1 + 1`
- 数字常量
let "变量名=变量值"
变量值使用0开头为八进制
变量值使用0x开头为十六进制
- 双圆括号是let命令的简化
((a=10))
((a=4+5))
((a++))
echo $((10+20))
4-7,shell脚本的测试与判断
- 退出与退出状态
利用exit
exit 10 返回10给shell
$? 判断当前shell前一个进程是否正常退出,返回值非0为不正常退出
- 测试命令test
* test命令用于检查文件或者比较值
* -lt, -le, -gt, -ge, -eq 小于,小于等于,大于,大于等于,等于
* test 可以做以下测试
* 文件测试
* 整数比较测试
* 字符串测试
* test测试语句可以简化为 [] 符号
* [] 符号还有扩展写法 [[]] 支持 && || ! < >
* 测试结果还是 echo $?
4-8,shell流程控制
4-8-1,分支结构: if-then-elif-then-else-fi, case, select
- 使用if-then-fi语句
if [ 测试条件成立 ] 或 命令返回值是否为0; then
执行相应命令(缩进可要可不要)
fi 结束
if pwd; then echo "pwd runing"; fi
if abc; then echo "pwd runing"; fi
- 使用if-then-else-fi语句
if [ 测试条件 ]
then
测试条件成立,执行相应的命令
else
测试条件不成立,执行相应的命令
fi 结束
- 使用if-then-elif-then-else-fi语句
if [ 测试条件1 ]
then
测试条件1成立,执行相应的命令
elif [ 测试条件2 ]
then
测试条件2成立,执行相应的命令
else
测试条件1,2都不成立,执行相应的命令
fi 结束
- 嵌套if的使用
if [ 测试条件1 ]
then
测试条件1成立,执行以下命令
if [ 测试条件2 ]
then
测试条件2成立,执行命令
fi
fi
#!/bin/bash
# if demo
if [ $UID = 0 ]; then
echo "root user"
if [ -x ~/test.sh ]; then
~/test.sh
fi
else
echo "swith to root user"
fi
- 使用case语句
case "$变量" in
"情况1" )
命令1;;
"情况2" )
命令2;;
...
esac
#!/bin/bash
# case demo
case "$1" in
"start"|"START")
echo $0 start...... ;;
"stop"|"STOP")
echo $0 stop...... ;;
"restart"|"reload")
echo $0 restart...... ;;
*)
echo "Usage: $0 {start|stop|restart|reload}";;
esac
4-8-2,循环结构: for, while, until, break, continue
- 使用for语句-用法1
for 参数 in 列表
#使用反引号或$()方式执行命令,命令的结果当作列表处理
do 执行的命令
done 封闭一个循环
for i in {1..9}; do echo $i; done
for i in {a..c}; do touch $i.mp3; done
echo `ls *.mp3`
for filename in `ls *.mp3`; do mv $filename $(basename $filename .mp3).mp4; done
- 使用for语句-用法2
for((变量初始化;循环判断条件;变量变化))
do
循环执行的命令
done
for ((i=1;i<=10;i++)); do echo $i; done
- 使用while语句
while test测试条件
do
命令
done
a=1; while [[ $a -lt 10 ]]; do ((a++)); echo $a; done
a=1; while [[ $a -le 10 ]]; do ((a++)); echo $a; done
a=20; while [[ $a -gt 10 ]]; do ((a--)); echo $a; done
a=20; while [[ $a -ge 10 ]]; do ((a--)); echo $a; done
#死循环
while : ; do echo always; done
- 使用until语句:与while循环相反,循环测试为假时执行循环,为真时循环停止。
#死循环
until [ 5 -lt 4 ]; do echo always; done
- 循环可以使用break和continue语句在循环中退出
for num in {1..9}; do if [ $num -eq 5 ]; then continue; fi; echo $num; done
for num in {1..9}; do if [ $num -eq 5 ]; then break; fi; echo $num; done
- 循环和判断嵌套使用
for sc_name in /etc/profile.d/*.sh; do if [ -x $sc_name ]; then . $sc_name; fi; done
- 使用循环处理命令行参数
- 命令行参数可以使用
$1 $2 ... ${10} ... $n
进行读取 $0
代表脚本名称$* $@
代表所有位置参数$#
代表位置参数的数量
- 命令行参数可以使用
#!/bin/bash
# help display help help
for pos in $*
do
if [ "$pos" = "help" ]; then
echo $pos $pos
fi
done
#!/bin/bash
#help display help help
while [ $# -ge 1 ]
do
echo $#
echo "do something"
if [ "$1" = "help" ]; then
echo $1 $1
fi
shift #去除第一个位置参数
done
4-9,shell函数
4-9-1,自定义函数
- 可在终端直接创建和调用函数,也可保存在shell脚本中构建函数库
#函数定义,function可省略
function fname(){
命令
}
#取消函数
unset fname
#执行
在终端定义: fname
在shell脚本定义: source 脚本名称
fname
#函数作用范围的变量(局部变量),超出函数范围则变量失效
local 变量名
#函数的参数
$1 $2 $3 ... $n
#终端
#定义
cdls() {
> cd $1
> ls
> }
#调用
cdls /home
#shell脚本
#定义
#!/bin/bash
# functions
checkpid() {
for i in $*
do
if [ -d "/proc/$i" ]; then
return 0
fi
done
return 1
}
#调用
source test5.sh
checkpid 1 2
echo $?
checkpid 65533
echo $?
4-9-2,系统函数库
- 系统自建了函数库,可以在脚本中引用,函数库目录
/etc/init.d/functions
- 使用
source
由函数脚本文件“导入”函数
4-10,shell脚本控制
4-10-1,脚本优先级控制
- 对脚本占用资源的分配,可以使用
nice
和renice
调整脚本优先级 - 避免出现“不可控的”死循环,fork炸弹(死循环导致CPU占用过高,并导致死机)
#fork炸弹的例子-V1
func() { func | func& }
func
#V2
.(){.|.&};.
4-10-2,捕获信号
- 捕获信号脚本的编写
- kill会默认发送15号信号给应用程序
- ctrl+c发送2号信号给应用程序
- 9号信号不可阻塞(trap无效)
#脚本test1.sh
#!/bin/bash
#signal demo
trap "echo sig 15" 15 #捕获并屏蔽15号信号
trap "echo sig 2" 2 #捕获并屏蔽2号信号,也就是ctrl+c信号
echo $$
while :
do
:
done
chmod u+x test1.sh
./test1.sh
kill -15 ***pid
kill ***pid
kill -9 ***pid
4-10-3,一次性计划任务 at
- 计划任务:让计算机在指定的时间运行程序
at 时间
at> 任务命令 #使用source引入脚本中的函数或者引入命令的绝对路径,执行没有终端输出echo需要重定向
at> ctrl+d 提交
4-10-4,周期性计划任务 crontab
- 配置方式
crontab -e
- 查看现有的计划任务
crontab -l
- 配置格式
- 分钟 小时 日期 月份 星期几 执行的命令
- 注意命令的路径问题
crontab -e
* * * * * /bin/date >> /tmp/date.txt #每过一分钟记录一次日期
* * * * 1,5 /bin/date >> /tmp/date.txt #周一和周五每过一分钟记录一次日期
* * * * 1-5 /bin/date >> /tmp/date.txt #周一到周五每过一分钟记录一次日期
4-10-5,延时计划任务 anacontab 计划任务加锁 flock
- 如果计算机不能按照预期时间运行(计算机关机)
- anacontab设置延时计划任务
- flock锁文件,脚本只运行执行一次(类似单例模式)
flock -xn ''/tmp/f.lock'' -c ''***脚本''
4-N,其他
4-N-1,shell关键字
- 引号
- '' 完全引用
- "" 不完全引用
- `` 执行
- 括号
- () (()) $() 圆括号
- 单独使用圆括号会产生一个子shell (a=1)
- 单独使用圆括号可用于数组初始化 IPS=(IP1 IP2 IP3)
- 双圆括号是let命令的简化 ((a=1))
- var1=$(ope) 将ope的运算结果赋值给var1
- [] [[]] 方括号
- 单独使用方括号是测试(test) 或数组元素功能
- 两个方括号表示测试表达式,可以直接用 > < 进行数值判断,结果通过$?查看,0为真,非0为假
- <> 尖括号,大小比较,重定向符号
- {} 花括号
- 输出范围 echo {0..9} echo
- 配合取数组元素
- 文件复制 cp /etc/passed{,.bak} 相当于 cp /etc/passwd /etc/passwd.bak
- () (()) $() 圆括号
- 算术运算符
-
+ - * / %
-
- 比较运算符
-
> < =
-
-lt, -le, -gt, -ge, -eq 小于,小于等于,大于,大于等于,等于
-
- 逻辑运算符
-
&& || !
-
- 转义字符 \
- 普通字符转义后有特殊功能
- 特殊字符转义后当作普通字符使用
- 其他
# 注释符
; 命令分隔符
case 语句的分隔符要转义 ;;
: 空指令
.和source命令相同,用于执行shell脚本
~ 家目录
, 分隔目录
* 通配符
? 条件测试或通配符
$ 取值符号
| 管道符
& 后台运行
_ 空格
5,文本操作
5-1,元字符
. 匹配除换行符外的任意单个字符
* 匹配任意一个跟在它前面的字符
[] 匹配方括号中的字符类中的任意一个
^ 匹配开头
$ 匹配结尾
\ 转义后面的特殊字符
5-2,扩展元字符
+ 匹配前面的正则表达式至少出现一次
? 匹配前面的正则表达式出现零次或一次
| 匹配它前面或后面的正则表达式(多个正则表达式并列的情况)
5-3,文件的查找命令 find
find 路径 查找条件 [补充条件]
find /etc -name pass*
find /etc -regex .*wd$
find /etc -regex .etc.*wd$
find /etc -type f -regex .*wd$
5-4,文件内容的过滤(查找)命令 grep
5-5,sed和AWK
- vim和sed、AWK的区别
- 交互式与非交互式
- 文件操作模式(文本编辑器)与行操作模式(行编辑器)
5-5-1,sed
- sed一般用于对文本内容做替换
sed '/user1/s/user1/u1/' /etc/passwd
- sed的基本工作方式:
- 将文件以行为单位读取到内存(模式空间)
- 使用sed的每个脚本对该行进行操作(在内存中)
- 处理完成后输出该行
- sed的替换命令: s
基础用法: sed 's/old/new/' filename 连续的多个命令: sed -e 's/old/new/' -e 's/old/new/' ... filename sed 's/old1/new1/;s/old2/new2/;...' filename1 filename2 ... 改写/重定向原始文件: sed -i 's/old/new/' 's/old/new/' filename sed -e 's/old/new/' -e 's/old/new/' ... filename > newfilename 正则表达式: sed 's/正则表达式/new/' filename sed -r 's/扩展正则表达式/new/' filename /如何和正则匹配的内容冲突,可以将分隔符改为其他符号: sed 's!/!abc!' filename s@old@new@
- sed的替换命令加强版
- 全局替换
's/old/new/'g
;g为全局替换,用于替换所有出现的次数 - 限定替换第n处
's/old/new/'n
- 标志位
's/old/new/'标志位
,标志位不同则含义不同- 数字,第几次出现才进行替换
- g,每次出现都进行替换
- p,打印模式空间的内容
sed -n 's/root/!!!!/'p
只输出替换成功的行 - w,将模式空间的内容写入到文件
- 寻址
- 默认对每行进行操作,增加寻址后对匹配的行进行操作;
/正则表达式/s/old/new/g
行号s/old/new/g
;行号可以是具体的行,也可以是最后一行$符号;- 可以使用两个寻址符号,也可以混合使用行号和正则地址;
head -6 /etc/passwd | sed '2,$s/usr/!/'
- 分组
- 寻址可以匹配多条命令
/regular/{s/old/new/;s/old/new/}
- 寻址可以匹配多条命令
- sed脚本文件
- 可以将选项保存为文件,使用-f加载脚本文件
sed -f sedscript filename
- 可以将选项保存为文件,使用-f加载脚本文件
- 全局替换
- sed的其他命令
- 删除命令:删除模式空间内容,改变脚本的控制流,读取新的输入行
[寻址]d
sed '/ab/d' bfile
sed '/ab/d;s/a/!/' bfile
- 追加、插入、更改
- 追加命令
a
:匹配的后一行插入sed '/ab/a hello' bfile
- 插入命令
i
:匹配的前一行插入sed '/ab/i hello' bfile
- 更改命令
c
:匹配的本行改写sed '/ab/c hello' bfile
- 追加命令
- 打印
- 打印行号
=
sed '/ab/d;=' bfile
- 打印命令:输出匹配的行
p
sed '/ab/p' bfile
sed -n '/ab/p' bfile
- 打印行号
- 下一行
- 下一行命令
n
:流程控制,遇见匹配行不做处理,直接处理下一行
- 下一行命令
- 读文件和写文件
- 读文件
r
- 写文件
w
- 读文件
- 退出命令
q
,匹配到行就直接退出了sed 10q filename
sed -n 1,10p filename
前者速度更快,因为前者到第10行就直接退出了,后者相当于还是对文件遍历了一遍。
- 删除命令:删除模式空间内容,改变脚本的控制流,读取新的输入行
- sed多行模式空间
- 为什么要有多行模式:配置文件一般为单行出现,但也有使用XML或JSON格式的多行配置文件出现。(比如有换行符等)
- 多行模式处理命令:
N, D, P
N
:将下一行加入到模式空间D
:删除模式空间中的第一个字符到第一个换行符(改变控制流程,构建循环)P
:打印模式空间中的第一个字符到第一个换行符
- sed保持空间
- sed保持空间也是多行的一种操作方式;将内容暂存在保持空间,便于做多行处理:文本文件->模式空间->保持空间
h或H
将模式空间内容存放到保持空间,h
为覆盖模式,H
为追加模式;g或G
将保持空间内容取出到模式空间,g
为覆盖模式,G
为追加模式;x
交换模式空间和保持空间内容
- sed的基本工作方式:
5-5-2,AWK
- AWK一般用于对文本内容进行统计、按需要的格式进行输出
- AWK和sed的区别
- AWK更像是脚本语言
- AWK用于比较规范的文本处理,用于统计数量并输出指定字段
- 使用sed将不规范的文本,处理成“较规范”的文本
- AWK脚本的流程控制
输入数据前例程 BEGIN{} 主输入循环 {} 所有文件读取完成例程 END{}
- AWK的字段引用与分离
- 每行称作AWK的记录
- 使用空格、制表符分隔开的单词称作字段
- 可以自己指定分隔的字段
- awk可以使用-F选项改变字段分隔符
awk -F ',' '{print $1, $2, $3}' filename
- 分隔符可以使用正则表达式
- awk可以使用-F选项改变字段分隔符
- 字段的引用
- awk中使用 $1 $2 ... $n 表示每一个字段
awk '{print $1, $2, $3}' filename
- awk中使用 $1 $2 ... $n 表示每一个字段
- 例子
head -5 /etc/passwd | awk -F ":" '{print $1}'
- AWK的表达式
- 赋值操作符
= 是最常用的赋值操作符 var1 = "name" var2 = "hello" "world" var3 = $1 其他赋值操作符 ++ -- += -= *= /= %= ^=
- 算数操作符
+ - * / % ^
- 系统变量
FS和OFS字段分隔符,OFS表示输出的字段分隔符 RS记录分隔符 NR和FNR行号 NF字段数量,最后一个字段内容可以用 $NF 取出 head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1}' head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1, $2}' head -5 /etc/passwd | awk 'BEGIN{FS=":"; OFS="-"}{print $1, $2}' head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}' head -5 /etc/passwd | awk '{print NR, $0}' head -5 /etc/passwd | awk '{print FNR, $0}' awk '{print NR, $0}' /etc/hosts /etc/hosts awk '{print FNR, $0}' /etc/hosts /etc/hosts head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}' head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}'
- 关系操作符
< > <= >= == != ~ !~
- 布尔操作符
&& || !
- 赋值操作符
- AWK判断和循环
- 条件语句:如果有多个语句需要执行,可以使用
{}
将多个语句括起来if (表达式) awk 语句1 [ else awk 语句2 ]
- 循环语句
1-while 循环: while(表达式) awk语句1 2-do循环: do{ awk 语句1 }while(表达式) 3-for循环 for(初始值; 循环判断条件; 累加) awk语句1 4-影响控制的其他语句 break continue
- 条件语句:如果有多个语句需要执行,可以使用
- AWK数组
- 数组的定义
数组名[下标]=值
下标可以使用数字也可以使用字符串 - 数组的遍历
for (变量 in 数组名)
使用数组名[变量]
的方式依次对每个数组的元素进行操作 - 删除数组
delete 数组[下标]
- 命令行参数数组
ARGC ARGV
- 数组的定义
- AWK函数
- 算数函数
sin() cos() int() rand() srand()
- 字符串函数
gsub(r,s,t) index(s,t) length(s) match(s,r) split(s,a,sep) sub(r,s,t) substr(s,p,n)
- 自定义函数
function 函数名 (参数) { awk语句 return awk变量 }
- 算数函数
- AWK和sed的区别
6,服务管理篇
- 在linux上部署服务,提供给其他的用户使用。
6-1,防火墙
- 防火墙分类
- 软件防火墙:数据包过滤防火墙和应用层防火墙(centos6默认的防火墙是iptables-数据包过滤防火墙,centos7默认的防火墙是firewallD-底层使用netfilter)
- 硬件防火墙
6-1-1,iptables
- iptables的表和链
- 规则表-iptables能够支持的功能:
filter-允许哪些ip和端口通过 nat-网络地址转换-如内网ip转外网ip mangle raw
- 规则链-规则控制的范围/方向:
INPUT OUTPUT FORWARD
PREROUTING POSTROUTING
- 规则表-iptables能够支持的功能:
- iptables的filter表
iptables -t filter 命令 规则链 规则 命令有: -L(显示已经具备的过滤规则) iptables -t filter -L iptables -t filter -nL iptables -t filter -vnL iptables -vnL -A -I(添加规则,-A在已有的规则后面添加,-I在第一条规则添加,规则是从上向下进行匹配的不会覆盖) iptables -t filter -A INPUT -s 10.0.0.1 -j ACCEPT iptables -t filter -A INPUT -s 10.0.0.1 -j DROP -D -F -P(-D清楚指定的规则,-F清除自己添加的所有规则,-P修改默认规则) iptables -D INPUT 规则的序号/名称 iptables -F INPUT iptables -P INPUT DROP -N -X -E(-N自定义规则链,-X删除自定义规则链,-E重命名自定义规则链)
- iptables的nat表
iptables -t nat 命令 规则链 规则 PREROUTING 目的地址转换 POSTROUTING 源地址转换 iptables -t nat -A PREROUTING -i eth0 -d 114.115.116.117 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j SNAT --to-source 111.112.113.114
- iptables配置文件
/etc/sysconfig/iptables CentOS6 service iptables save | start | stop | restart CentOS7 apt install iptables-services
6-1-2,firewallD
- firewallD服务
- 支持区域"zone"概念(iptables中的自建规则链)
- firewall-cmd
systemctl status | start | restart | stop | enable | disable firewalld.service
firewall-cmd --stats | --list-all | --zone=public --list-interfaces | --list-ports | --list-services | --add | --remove | --permanent | --reload
- iptables和firewallD都是管理Linux防火墙的工具,真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
6-2,SSH服务-远程登陆
- SSH服务介绍:telnet明文传输,ssh密文传输
- SSH服务配置文件:sshd_config
Port 22 默认端口 PermitRootLogin yes 是否允许root登录 AuthorizedKeysFile .ssh/authorized_keys
- SSH命令
systemctl status | start | stop | restart | enable | disable sshd.service 客户端登录: ssh [-p端口] 用户@远程ip
- SSH公钥认证
ssh-keygen -t rsa 要在客户端产生密钥 ssh-copy-id -i 公钥文件 用户@远程ip 拷贝公钥到服务端
- scp和sftp远程拷贝文件
本地文件拷贝到远程: scp 本地目录/本地文件 用户@远程ip:远程目录/远程文件 远程文件拷贝到本地: scp 用户@远程ip:远程目录/远程文件 本地目录/本地文件
6-3,FTP服务-文件共享
- FTP协议(文件传输协议,包含主动模式和被动模式)
- vsftpd服务器安装
sudo apt install vsftpd ftp
systemctl start vsftpd.service
ftp localhost
- vsftpd服务配置文件
配置文件有:
/etc/vsftpd/vsftpd.conf 主配置文件
/etc/vsftpd/ftpusers 用户黑名单,不允许登录ftp服务器
/etc/vsftpd/user_list 用户黑白名单,可以在主配置文件中将其设置为黑名单或者白名单
使用firewallD开放ftp服务:
firewall-cmd --list-all
firewall-cmd --add-service ftp
- FTP命令
用户ftp登录所在目录就是ftp服务器上的用户家目录:
ls 查看ftp服务器上有哪些文件
!ls 查看本地有哪些文件
put 文件 将本地文件上传到ftp服务器
get 文件 将ftp服务器上的文件下载到本地
- 使用虚拟用户进行验证
主配置文件,配置项设置:
guest_enable = YES 使vsftpd支持虚拟用户
guest_username = vuser 权限映射(这里默认是vuser的用户权限)
user_config_dir = /etc/vsftpd/vuserconfig 对虚拟用户的权限控制
allow_writeable_chroot = YES 允许虚拟用户可写(可以上传)
pam_service_name = vsftpd.vuser 可插拔式验证模块
useradd vuser -d /data/ftp -s /sbin/nologin 创建一个用户,数据存放目录为/data/ftp,不能通过终端登录-指定shell为/sbin/nologin (只用于用户身份的映射)
cd /etc/vsftpd
vim vuser.temp 设置用户名和密码
db_load -T -t hash -f /etc/vsftpd/vuser.temp /etc/vsftpd/vuser.db 使配置文件生效
ll /etc/vsftpd/vuser.db
chmod 600 /etc/vsftpd/vuser.db 修改配置文件权限
vim /etc/pam.d/vsftpd.vuser 可插拔验证
vim /etc/vsftpd/vsftpd.conf 依照“主配置文件,配置项设置”进行设置
6-4,samba服务-文件共享
- 常见共享服务的区别
- 协议不同
- 对操作系统的支持程度不同:FTP可支持所有的操作系统,samba默认只支持windows和windows之间的共享,NFS默认只支持linux和linux之间共享。
- 交互的便利性不同(samba和NFS都是基于挂载使用,挂载后就可以像操作本地文件一样操作远程共享文件)
- samba服务的安装
apt install samba
- samba服务的配置文件
/etc/samba/smb.conf
[share]
comment = my share
path = /data/share
read only = No
- samba用户的设置
smbpasswd命令
-a 添加用户(需要基于已有的用户 useradd)
-x 删除用户
pdbedit
-L 查看用户
- samba服务的启动和停止
systemctl start | stop smb.service
linux客户端使用挂载方式访问
mount -t cifs -o username=user1 //127.0.0.1/user1/mnt
windows客户端
资源管理器访问共享
映射网络驱动器
6-5,NFS服务-文件共享
- NFS服务的配置-不用安装,linux默认自带
/etc/exports 配置文件
/data/share*(ro,rw,sync,all_squash) 共享路径(data和share必须存在并且都是目录,*表示所有ip都可以访问也可以写单独的ip地址,ro只读,rw读写,sync读写同步,all_squash确保映射后的用户权限为普通用户权限)
showmount -e localhost
客户端使用挂载方式访问
mount -t nfs localhost:/data/share /mnt
- NFS服务的启动和停止
systemctl start | stop nfs.service
6-6,Nginx服务/OpenResty-web服务器
- Nginx和web服务介绍
- Nginx(engine x)是一个高性能的web和反向代理服务器
- Nginx支持HTTP、HTTPS和电子邮件代理协议
- OpenResty是基于Nginx和Lua实现的web应用网关(Nginx的发行版本),集成了大量的第三方模块(扩展功能)
- OpenResty软件的下载和安装
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty
- OpenResty的配置文件
配置文件位置:
/usr/local/openresty/nginx/conf/nginx.conf
service openresty start | stop | restart | reload
日志位置:
/usr/local/openresty/nginx/logs/
html文件位置:
/usr/local/openresty/nginx/html/
- 使用OpenResty配置域名虚拟机
Nginx web server配置
配置文件:
server {
listen 80; 控制访问端口
server_name 准备好的域名; 使用准备好的域名访问server的范围
location / {
root html; 使用准备好的域名:80 会访问到的目录(此时访问的是/usr/local/openresty/nginx/html/)
index index.html index.htm;
}
}
启动nginx:
cd /usr/local/openresty/nginx/sbin/
./nginx -t 检查配置文件的语法有没有错误
./nginx 启动(方法一)
service openresty start | stop | restart | reload 启动(方法二)
netstat -ntpl | grep nginx 查看端口监听情况
nginx的常用命令:
./nginx -s stop 关闭nginx(关闭进程,连接断开)
./nginx -s reload 重新加载配置文件(不关闭进程,连接不断开)
测试:
curl 127.0.0.1:80
如果部署到公网后,使用公网ip无法访问,需要修改服务器的防火墙设置
(需要nginx监听,防火墙设置,腾讯云安全组一致才能访问)
最简单的直接关闭防火墙:systemctl stop firewalld.service
或者使用命令: firewall-cmd --zone=public --add-port=80/tcp --permanent 进行添加
6-7,LNMP
- 什么是LNMP?
- LAMP(Linux+Apache+PHP+MySQL)
- LNMP(Linux+Nginx+PHP+MySQL)
- 环境搭建
MySQL安装
* 可以使用mariadb替代
* yum install mariadb mariadb-server
* 修改默认编码,配置文件地址 /etc/my.cnf
character_set_server=utf8
init_connect='SET NAMES utf8'
* systemctl start mariadb.service
* mysql 数据库交互界面
show variables like '%character_set%';
PHP安装
* yum install php-fpm php-mysql
php-mysql使得php可以支持mysql php-fpm使得php可以作为独立的进程运行
* 启动 php-fpm
systemctl start php-fpm.service
Nginx配置(修改位置就在openresty安装后nginx.conf的配置文件server{]块中,取消对应的注释即可)
location ~ \.php${
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
6-8,DNS服务-域名解析
- DNS服务介绍
- DNS(Domain Name System)域名系统
- FQDN(Full Qualified Domain Name)完全限定域名
- 域分类:根域,顶级域(TLD)
- 查询方式:递归、迭代
- 解析方式:正向解析、反向解析
- DNS服务器的类型:缓存域名服务器、主域名服务器、从域名服务器
早期实现
/etc/hosts ip 域名 使用邮件定期发送给用户进行更新(手动并且时效性差)
- BIND软件的安装
yum install bind bind-utils
systemctl start named.service
- BIND的配置文件
vim /etc/named.conf
- 使用dig和nslookup命令测试DNS
- 从域名服务器的配置
- 从服务器内容会自动同步主服务器(读写分离等架构的基础)
zone "test.com" IN {
type slave;
file "slaves/test/com.zone";
masters { 10.211.55.3; };
};
附录1,文件系统
- 万事万物皆文件,mount扩容很方便。
- 各目录的含义(注意linux为/,windows为\)
/bin:
可执行文件,系统管理命令、脚本(bin是Binary的缩写,这个目录存在着最经常使用的命令。)
/boot:
启动时用的引导文件(这里存放着启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。)
/dev:
设备信息(dev是Device(设备)的缩写,该目录下存放的是linux的外部设备,在Linux中访问设备的方式与访问文件的方式是相同的)
/etc:
配置文件
/home:
非root用户的家目录
/lib:
最基本的动态链接共享库
/lost+found:
一般是空的,系统非法关机后,该目录中会存放一些文件
/media:
u盘,光驱等linux自动识别的外部设备
/mnt:
让用户临时挂载别的文件系统(比如将光驱挂载到/mnt上,进入该目录可以查看光驱中的内容)
/opt:
软件的自定义安装位置
/proc:
进程信息(一个虚拟的目录,是系统内存的映射,可以通过直接访问该目录获取系统信息。
该目录的内容不在硬盘上而在内存里,并可以直接修改里面的某些文件。)
/root:
系统管理员的用户主目录
/sbin:
系统管理员才能使用的系统管理程序
/selinux:
这个目录是red/centos所特有的目录,selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux的相关文件的
/srv:
存放服务启动之后需要提取的数据
/sys:
系统内核信息(是linux2.6内核的一个很大的变化,该目录下安装了linux2.6内核中新出现的一个文件系统sysfs
sysfs集成了3种文件系统的信息,针对进程信息的proc文件系统、针对设备的devfs文件系统、以及针对伪终端的devpts文件系统,该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。)
/tmp:
临时文件(临时变量)
/usr:
一个非常重要的目录,用户许多应用程序和文件都放在该目录下。类似于windows下的program files目录。
/usr:
多个用户的共享区域,软件的默认安装区域。(类似于C:\Windows)
/usr/bin
/usr/sbin
/usr/src:
内核源代码默认的放置目录
/var:
存放着不断扩充着的东西,习惯将不断被修改的目录放在该目录下,包括各种日志文件。
/run:
一个临时文件系统,存储系统启动以来的信息(系统常量、系统变量)。如果系统上有/var/run目录,应将其指向/run。
附录2,Ubuntu与Centos的区别
附录3,vi/vim键盘图
附录4,帖子汇总
问君哪得清如许,为有源头活水来(中文版本)
问君哪得清如许,为有源头活水来(英文版本)
2021年 Windows10 环境下使用WSL和Docker 配置深度学习环境- 可使用任意版本的 Ubuntu+CUDA image 以及踩坑记录
Windows系统WSL2 的ubuntu子系统安装 docker、nvidia-docker调用GPU
Ubuntu下载、配置、运行Anaconda
Ubuntu下载anaconda教程(全过程)
docker配置ubuntu16.04+cuda10.1+cudnn7详解
Linux Tools Quick Tutorial
行动是治愈恐惧的良药,而犹豫拖延将不断滋养恐惧。