WSL-ubuntu常用操作

1,基础

1-1,安装与卸载

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
      • 空洞文件

3-4-2,文件系统管理

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分区
  • 常见配置文件
    • /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 当前进程的名称
    • 位置变量:
$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,脚本优先级控制

  • 对脚本占用资源的分配,可以使用nicerenice调整脚本优先级
  • 避免出现“不可控的”死循环,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
    • 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交换模式空间和保持空间内容

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中使用 $1 $2 ... $n 表示每一个字段 awk '{print $1, $2, $3}' filename
      • 例子
        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变量
        }
        

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的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

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/
配置文件:
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

posted @ 2021-09-30 16:18  tensor_zhang  阅读(1946)  评论(0编辑  收藏  举报