类别:CentOS / 日期:2023-08-28 / 浏览:1244 / 评论:0

操作系统OS:


  1. 没有安装操作系统的计算机(通常称为裸机),想在裸机上运行自己写的程序,要用机器语言编写。

  2. 如果安装了操作系统,就可以在操作系统上安装支持高级语言的环境,进而能够用高级语言进行开发。

  3. 操作系统的作用:

  • 操作不同的计算机硬件进行工作;

  • 将操作硬件的方法,封装成不同的系统调用,供其他的成员访问

  1. 常见的操作系统:

  • Windows:桌面操作系统;

  • macOS:开发人员;

  • Linux:服务器和嵌入式操作系统;

  • iOS、Android:基于移动设备的操作系统

  1. windows 和 linux的区别:





基础介绍:


概述:


  1. Linus是一个开源、免费的操作系统,其稳定性、安全性、处理多并发等方面已经得到业界的认可。
    Linux在服务器领域的应用是最强的,它的免费、稳定、高效等特点在这里得到了体现。
    服务器,需要远程通过软件终端,操作和维护。

  2. 目前很多企业级项目,如c、c++、python、java、go等,都会部署到Linux、Unix系统上。

  3. Linux内核:是系统的心脏,是运行程序和管理磁盘和打印机等硬件设备的核心程序,提供了一个裸设备与应用层之间的抽象层

  4. 常见的Linux发行版:Ubuntu、RedHat(CentOS)

  5. 最初是LIinux 0.01版本,不到1w行代码。


起源与发展:



Linux环境:


虚拟机(Virtual Machine):通过软件模拟的具有完整硬件系统功能的、一个完全隔离的独立完整计算机系统。





存储分区:







Linux网络相关:


网络连接的三种模式:







Linux网络配置:


NAT网络原理图:


image.png
image.png


设置主机名和hosts映射:


设置主机名:


命令:hostname,可直接查看主机名


设置hosts映射:


  • windows在C:\Windows\System32\drivers\etc\hosts文件指定即可




  • linux在etc\hosts文件指定





主机名解析过程分析:


  1. Hosts是一个文本文件,用来记录 **IP 和 Hostname(主机名)**的映射关系。

  2. DNS(即Domain Name Systems域名系统)是互联网上作为 域名和IP地址 相互映射的一个分布式数据库


举例:用户在浏览器输入 www.baidu.com之后发生事情:


  1. 浏览器先检查缓存中有没有域名解析IP地址,有就先调用这个IP完成解析;没有,就检查DNS解析器缓存。这两个缓存,可理解为本地解析器缓存

  2. 一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存他的IP地址(DNS解析记录)。


	在cmd窗口输入:
	ipconfig /displaydns:DNS域名解析缓存
	ipconfig /flushdns:手动清理DNS缓存


  1. 如果本地解析器缓存没有找到对应的映射,检查系统中hosts文件中,有没有配置对应的域名IP映射,有则完成解析并返回。

  2. 如果 本地DNS解析器缓存和hosts文件,均没有找到对应的IP,则到域名服务DNS进行解析域。





虚拟机的克隆:


如果你已经安装了一台Linux操作系统,可通过克隆的形式拷贝更多的虚拟系统。


  • 直接拷贝一份安装好的虚拟机文件

  • 使用vmware的克隆操作,克隆时,需要先关闭Linux系统


虚拟机的快照:


如果你在使用虚拟机系统时,想回到原先的某个状态,vmware提供的快照可完成此操作。





注:每个快照都会占用磁盘空间,故要正确使用。


虚拟机迁移和删除:


虚拟系统安装好后,本质上就是文件(存放在文件夹中)。


虚拟系统的迁移:可以把安装好的虚拟系统这个文件夹整体拷贝或者剪切到另外位置使用。


虚拟系统的删除:① 用vmware进行移除,再点击菜单->从磁盘删除即可;② 直接手动删除虚拟系统对应的文件夹即可。


安装vmtools:


  1. vmtools安装好后,可以让我们在windows下更好的管理vm虚拟机

  2. 可以设置windows和centos的共享文件夹




  1. 设置共享文件夹
    windows和centos可以通过共享文件夹共享文件,该共享文件夹在centos/mnt/hgfs文件夹下。
    注:实际开发中,文件上传和下载需要使用远程方式完成。


关机&重启命令:


基本介绍:


  • shutdown -h now 或 halt:立即进行关机

  • shutdown -h 1:1分钟后关机

  • shutdown -r now 或 reboot:立即进行重启

  • sync:将内存中的数据同步到磁盘


使用细节:


  • 无论重启还是关闭系统,首先要执行 sync命令,即将内存中的数据写到磁盘中;

  • 目前的 shutdown/halt/reboot均在要先执行 sync命令。


用户登录和注销:


  • root超级用户,是系统管理员,就可以操作任意文件和目录。
    对于普通用户而言,能操作的只有用户目录。
    建议登陆时,尽可能采用普通用户登录,必要时可使用命令:su root切换到超级用户。

  • 在提示符下输入logout即可注销用户。(只在Shell下有效)





用户管理:


基本介绍:


Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须先向系统管理员申请一个账号,之后才能通过该账号进入系统。


添加用户:


  • 基本语法:useradd 用户名

  • 使用细节:创建用户成功后,会自动创建和用户同名的家目录,默认该用户的家目录在 /home/用户名,也可通过命令 useradd -d 指定目录 新的用户名,给新创建的用户指定家目录。


指定/修改密码:


  • 基本语法:passwd 用户名

  • 注:显示当前用户所在的目录 pwd





删除用户:


  • 基本语法:userdel 用户名

  • 是否保留用户的家目录:
    ① 保留,则使用命令 userdel 用户名
    ② 不保留,则使用命令 userdel -r 用户名(慎重!!!)


查询用户信息指令:


  • 基本语法:id 用户名

  • 注:当用户不存在时,会返回无此用户


切换用户:


介绍:


操作Linux时,如果当前用户权限不够,可通过 su 用户名 指令,切换到高权限的用户,如root用户。


基本语法:


su - 切换用户名


细节说明:


  • 高权限切换到低权限,不需要密码;反之,则需要

  • 当需要返回到原来用户时,使用 exit/logout指令


用户组:


Linux中每个用户必须属于一个组,不能独立于组外。


介绍:


类似于角色,系统可以对有共性的多个用户进行统一管理。


新增组:


基本语法(指令):groupadd 组名


删除组:


基本语法(指令):groupdel 组名


增加用户时,直接加上组:


在添加用户时,可以指定该用户条件到哪个组。


基本语法(指令):useradd -g 用户组 用户名


修改用户所在组:


用root的管理权限可以改变某个用户的所在组。
① usermod -g 新组名 用户名:修改用户的所在组
② usermod -d 目录名 用户名 :改变该用户登录的初始目录(注:该用户需要有进入到新目录的权限


用户和组相关文件:


  1. /etc/passwd文件:用户的配置文件,记录用户的各种信息。
    每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell




注:Shell的作用,如下图:




  1. /etc/shadow文件:口令的配置文件。
    每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:警告时间:不活动时间:失效时间标志

  2. /etc/group文件:组的配置文件,记录Linux包含的组的信息。
    每行的含义:组名:口令:组标识号:组内用户列表


Linux运行级别:


运行级别说明:


  • 0:系统停机状态,默认不能设置为0,否认无法正常启动

  • 1:单用户工作状态,root权限用于系统维护,禁止远程登录

  • 2:多用户状态(没有NFS),不支持网络服务

  • 3:完全的多用户状态(有NFS),支持网路服务,登陆后进入控制台命令行模式

  • 4:系统未使用,保留给用户

  • 5: x11控制台,登陆后进入图形GUI模式

  • 6:系统正常关闭并重启,默认不能设置为0,否认无法正常启动
    注:常用的是级别3 和 5


开机的流程说明:







常见指令:


不同应用级别的切换:init [0/1/2/3/4/5/6]


查看当前系统运行级别:systemctl get-default


修改当前运行级别:systemctl set-default TARGET.target(TARGET=multi-user或graphical)


CentOS7后运行级别说明:


multi-user.target:analogous to runlevel 3(多用户有网,无图形界面)


graphical.target:analogous to runlevel 5(多用户有网,有图形界面)


相关操作指令:


① To view current default target,run,可使用systemctl get-default


② To set current default target,run,可使用systemctl set-default multi-user.target/graphical.target


找回root用户密码:


  1. 首先,启动系统,进入开机界面,在界面中按“e”进入编辑界面,如图




  1. 进入编辑界面,使用键盘上的上下键把光标往下移动,找到以 “Linux16” 开头内容所在的行数,在行的最后面输入:init=/bin/sh,如图:




  1. 输入完成后,直接按快捷键:Ctrl+x 进入单用户模式

  2. 接着,在光标闪烁的位置输入:mount -o remount,rw / ,之后按下回车。如图:




  1. 在新的一行最后面输入:passwd,完成后按键盘的回车键。输入密码,然后再次确认密码即可(最好是8位以上,但非必须),密码修改完成后,会出现 passwd..... 的样式,说明密码修改成功。




  1. 接着,在鼠标闪烁的位置,输入:touch /.autorelabel,完成后按键盘的回车键。

  2. 继续输入:exec /sbin/init,完成后按键盘的回车键,等待系统自动修改密码(时间可能有点长)。之后,系统会自动重启,即新的密码生效。





terminal使用要点:


  1. 在输入命令和路径时,按TAB健可以自动补全

  2. 按上下键,意义上下翻阅输入的历史命令

  3. 宿主机和虚拟机之间,可以拷贝文件

  4. 终端命令格式:command [-options] [parameter] ,即 命令名 [-选项(用来对命令进行控制)] [传给命令的参数]

  5. 查询命令的帮助信息: command --helpman command (其中,man是manual手册的意思)

  6. 不想执行输入的命令,使用Ctrl+C即可

  7. 文件相关:.文件名,该文件就变成了隐藏文件了
    要想查看隐藏文件,命令中要加-a参数

  8. ~:代表当前用户的主目录 .:代表当前目录 …:代表上一级目录

  9. clear:清除terminal内容的命令


SSH的远程操作:


Linux系统主要应用于服务器端,而服务器的管理,并不能像PC一样直接操作。服务器一般放在数据中心机房,一般在服务器安装好后很少会再进入现场。故对于Linux服务器,一般采用SSH的远程操作,即需要配置网络使用特定的支持SSH的软件


  1. SSH(Secure Shell)为建立在应用层和传输层上的安全协议。

  2. SSH是目前较可靠的,专为远程登录会话和其他网络服务提供安全性的协议。

  3. 使用SSH服务,需要安装相应的服务器和客户端。

  4. 客户端与服务器的关系:B机器要远程控制A机器,则A机器需要安装SSH服务器、B机器需要安装SSH客户端。通过SSH客户端,可连接到运行了SSH服务器的远程机器(传输的数据是加密和压缩的)。通过IP地址找到计算机后,通过端口号找到计算机上运行的应用程序。
    -域名:一组用点分隔的名字组成,是IP地址的别名(通过IP地址可以找到网络上的计算机)
    -端口号:通过端口号(SSH:22、Web:80、HTTPS:443、FTP:21)可以找到计算机上运行的应用程序。


CentOS 7的网络配置:


详见CentOS 7的网络配置


远程登陆Linux:


为什么需要远程登录?


  • Linux服务器是开发小组共享

  • 正式上线的项目运行在公网

  • 程序员需要远程登录到 Linux 进行项目管理或开发


常用的远程登录客户端有 Xshell 和 Xftp 等。





远程登录和操作 - XShell:







远程上传下载文件 - Xftp6:


Xftp6是一个基于windows平台的功能强大的SFTP、FTP文件传输软件,能够安全地在 Linux 和 Windows PC 之间传输文件。





如果出现乱码,即如下:




只需改变改变建立会话的过程中,选择utf-8编码,即可。








Ubuntu17及之后版本的网络配置:


  • 使用ifupdown配置网络/etc/network/interfaces 配置固定IP是无效的;

  • 重启网络的命令 /etc/init.d/networking restart 是无效的

  • 引入新工具netplan来进行网络设备的管理,配置文件位于/etc/netplan文件夹下。

  • 配置静态ip:
    1.打开网络配置文件:sudo gedit /etc/netplan/01-network-manager-all.yaml
    2.输入具体的配置信息:
    注意:存在层级概念,使用缩进表示层级关系缩进不允许使用tab,只允许空格


   # Let NetworkManager manage all devices on this system
   network:
     version: 2
     renderer: NetworkManager
     ethernets:
       ens33:
         dhcp4: false #static 
         dhcp6: false
         addresses: [192.168.10.4/24]
         gateway4: 192.168.10.2 #gateway
         nameservers:
           addresses: [192.168.10.2] #DNS


  1. 生效网络: sudo netplan apply

  2. 确定ip配置:ifconfigping www.baidu.com


远程登录Ubuntu


与CentOS不同,Ubuntu默认没有安装SSHD服务(可使用netstat命令,即netstat -anp | more,查看是否有22号端口存在),故无法远程登录。





安装SSH和启用:


  1. sudo apt-get install openssh-server,执行该命令后该台linux会安装ssh服务器和客户端。

  2. service sshd restart,该命令会启动sshd服务,即会监听22号端口。


从一台linux系统远程登录另一台linux系统:





在创建服务器集群时,会用到该技术。


  • 基本语法:ssh 用户名@IP
    注意:使用ssh访问,如果出现错误,可查看是否有该文件/.ssh/known_ssh,有则尝试删除该文件解决,一般不存在问题。

  • 退出:exitlogout


Linux目录结构:


  1. Linux世界中,一切皆文件。

  2. Windows操作系统:每个驱动器都有一个根目录结构,会形成多个树并行。




  1. Linux文件系统采用级层式的树状目录结构,没有盘符的概念,此结构的最上层是根目录"/",之后才能在此目录下创建其他目录。

  2. 根目录,必须包含 “开机软件”、“核心文件”、“开机所需程序”、"函数库、“修复系统程序” 等文件。下层有/bin、/usr、/lib、/etc、/home等文件目录(其中,最重要的是根目录下的/home目录)。







  1. 具体的目录结构:





    • /bin(/usr/bin,/usr/local/bin)(是Binary的缩写):存放着最经常使用的命令,即二进制可执行文件。普通用户和 root 都可以执行。

    • /sbin(/usr/sbin、/usr/local/sbin)(s是super user):存放管理员使用的系统管理程序。保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看。

    • /home:存放普通用户的主目录
      Linux下每个用户都有一个自己的目录,一般该目录名是以用户的账号命名,为该用户默认登录和保存自己数据的位置。

    • /root:该目录为系统管理员,即超级权限者的用户主目录。

    • /lib:系统开机所需要的最基本的动态链接共享库,类似于Windows中的dll文件。

    • /etc:所有的系统管理所需要的配置文件和子目录,比如安装mysql数据库my.conf配置文件。
      系统内所有采用默认安装方式(rpm 安装)的服务配置文件全部保存在此目录中,如用户信息、服务的启动脚本、常用服务的配置文件等

    • /usr,全称为Unix Software Resource:用于存储系统软件资源,类似于windows下的program file目录。

    • /boot:存放的是启动Linux时使用的一些核心文件,如连接文件、镜像文件、内核文件(vmlinuz…)和启动引导程序grub2等。

    • /proc(不能动):是一个虚拟的目录,是系统内存的映射访问这个目录来获取系统信息。即这个目录的内容在内存中,而不是在硬盘上。

    • /srv(不能动):service缩写,存放一些系统服务启动之后,需要提取的数据

    • /sys(不能动):Linux2.6内核的一个很大的变化,该目录下安装了2.6内核中新出现的一个文件系统sysfs

    • /tmp:存放临时文件的目录。在该目录下,所有用户都可以访问和写入。(建议此目录中不要保存重要数据,最好每次开机都把该目录清空)

    • /dev:Linux 系统,任何装置与接口设备都是以文件的形态存在于这个目录当中的。 通过存取这个目录底下的某个文件,就等于在对某个硬件设备进行操作。

    • 挂载目录:早期 Linux 中只有这一个挂载目录,并没有细分。

  1. /mnt:系统提供该目录是为了让用户临时挂载别的文件系统,通常将外部的存储挂载在/mnt,如共享文件夹/mnt/hgfs

  2. /media:Linux系统会自动识别一些设备,并将识别到的设备挂载到这个目录下,如软盘和光盘。系统建议用来挂载媒体设备

  3. /misc:系统建议用来挂载 NFS 服务的共享目录。

虽然系统准备了三个默认挂载目录 /mnt/、/media/、/misc/,但是到底在哪个目录中挂载什么设备可以由管理员自己决定。

    • /opt:放置和安装第三方软件。手工安装的源码包软件,都可以安装到这个目录中。也可以把软件放到 /usr/local/ 目录。

    • /var:用于存储动态数据,即会不断扩充的东西。例如缓存、日志文件、软件运行过程中产生的文件等。


vi 和 vim 编辑器:


介绍:


Linux 系统会内置 vi文本编辑器。


vim 是具有程序编程能力,可看作是 vi 的增强版本,可主动以字体颜色辨别语法的正确性,方便程序设计。代码补全、编译及错误跳转等方便编程的功能十分丰富,被广泛应用。


常用的三种模式:


  1. 正常模式:vim 文档名,就直接进入了一般模式。
    这种模式下,可使用【上下键】移动光标、【删除字符】 或 【删除整行】来处理文档内容,也可使用【复制、粘贴】来处理你的文件数据。

  2. 插入模式:一般按 i 即可进入。

  3. 命令行模式:按下esc按键,并输入:即可进入该模式。
    该模式下,可通过相关指令,完成读取、存盘、替换、离开 vim、显示行号等动作。


模式的相互切换:







快捷键的使用:


  1. 在文件中查找某个单词,需在【命令行模式下】,【/关键字】,【回车】查看,【输入n】就是查找下一个该关键字在的位置。

  2. 设置文件的行号:【命令行模式下】【set nu】
    取消文件的行号:【命令行模式下】【set nonu】







Linux常用指令:


帮助指令:


  1. man命令(查看 ls 命令的帮助信息):man [命令或配置文件]

  2. help命令(获得 shell 内置命令的帮助信息):help 命令


文件目录类:


命令 [参数选项] *** ***:参数可联合使用且没有先后顺序之分


|管道符,表示将前一个命令处理结果传递给后面的命令处理


(一)查看、创建、切换文件目录:


  1. pwd :print work directory,显示当前活动目录的绝对路径

  2. ls :list,显示当前以及指定工作目录下的内容
    ls -s:可以查看的当前文件目录下,文件的详细信息
    ls -a:显示当前目录下的所有目录和文件,包括隐藏文件(.文件名,用来配置软件内容的文件)
    ls -l:以列表的方式显示信息
    ls -lh:以列表的方式显示信息,且文件大小显示更人性化
    注:ls的通配符(用来查找文件,前提文件名中有相同的部分),包括*(代表任意个数个字符)、?(只能代表一个字符)、[string](可以匹配字符组string中的任意一一个 )三个。

  3. tree :以树状图列出文件中目录结构
    tree -d 目录(只显示该目录下的tree)

  4. cd :change directory,切换工作目录
    cd ~:切换到自己的家目录,即/root/home/sgy
    cd /:切换到根目录
    cd ..:切换到上一级的目录
    cd .:保持当前目录不变
    cd -:表示最近两次使用目录之间的切换

  5. touch :如果文件不存在,新建空文件

  6. mkdir :make directory,创建新的目录
    基本语法:mkdir [参数选项] 目录名
    -p: 递归创建多个目录
    如:mkdir -p grand/father/son (如果父目录不存在,创建时参数选项为 -p(递归创建多个目录);否则,可忽略不写)

  7. rm :remove,删除文档和目录
    -r:递归删除整个文件夹
    -f:强制删除不提示

  8. rmdir :remove directory,删除空目录


(二)拷贝和移动文件:


  1. cp :copy,复制文件或者目录
    基本语法:cp 源文件或者目录 目标文件或者目录
    cp -r 源文件或者目录 目标文件或者目录:递归复制整个文件夹

  2. mv :move,移动文档和目录 或 重命名
    mv 源文件 目标文件:如果源文件和目标文件地址不同,则是移动;相同且只是文件名不同,则是重命名
    注:mv命令,只是修改了目录项dentry,并没有修改文件本身。


(三)查看文件内容:


  1. echo :输出内容到控制台,通常与重定向联合使用
    举例:echo $PATH 或 echo $HOSTNAME

  2. 重定向 > 和 >> :本应该在终端上的内容 输出/追加 到指定的文件
    >:会覆盖原文件的内容
    >>:表示追加,会将内容追加到已有文件的末尾
    基本语法:

    1. ls -l >文件:列表的内容写入文件中(覆盖写)

    2. ls -al >>文件:列表的内容追加到文件的末尾

    3. cat 文件1 > 文件2:将文件1的内容覆盖到文件2中

    4. echo "内容" >> 文件

    5. cal >> 文件:将日历信息追加到文件中


  1. cat :查看文件内容
    -n:对输出的所有行编号
    注意:两个特殊的查看文件内容的命令,如下:
    od -tcx filename:查看文件的 16 进制表示形式
    od -tcd filename:查看文件的 10 进制表示形式

  2. 管道 :将一个 命令的输出 通过管道 作为另一个命令的输入
    ls -a | more ...




  1. more :分屏显示文件内容




  1. less :用来分屏查看文件内容,功能类似于more指令但更强大,支持各种显示终端。
    less指令,并不是一次将整个文件加载之后显示,而是根据显示需要加载内容对显示大型文件具有较高的效率




  1. head :用于显示文件的头部内容,默认情况下 head 指令显示文件的前10行内容
    head -n 5 文件名 :查看文件头5行内容,5可改为任意数字

  2. tail :用于显示文件的尾部内容,默认情况下 tail 指令显示文件的尾10行内容
    tail -n 5 文件名 :查看文件尾5行内容,5可改为任意数字
    tail -f 文件名 :实时追踪该文档的所有更新


(四)软/硬连接


linux系统中,链接文件解决了文件的共享使用


链接的方式可以分为两种:硬链接(Hard Link)、软链接(又称符号链接,Symbolic Link)。


硬链接:


通过索引节点来进行链接


基本语法:ln 源文件的绝对路径 链接文件


在Linux的文件系统中,保存在磁盘分区中的文件,都会给它分配一个唯一的Inode编号(称为索引节点编号Inode,是文件/目录在一个文件系统中的唯一标识,可通过stat filename查看该文件的信息),存储着文件重要参数信息(即元数据metadata),如读写权限、所属用户、归属的用户组、文件大小、创建时间、修改时间、数据所在block磁盘盘号等,如下图:




Linux系统中,多个文件名指向同一索引节点Inode是正常且允许的,一般这种链接就称为硬链接(如存储中的快照功能,增加一个快照就多了一个硬链接),这样具有相同Inode的文件彼此同步(修改其中一个硬链接文件,其他文件也会修改)。删除时,只会将硬链接计数减一,只有减为0时,Inode才会被删除。详细见Linux系统编程中,文件存储


硬链接的作用之一:允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止 “误删” 源数据


注意:硬链接只能在同一文件系统中的文件之间进行链接,不能对目录创建。删除其中一个硬链接文件,并不影响其他有相同 inode 号的文件(详见文件系统原理


文件系统的原理


只要文件的索引节点还有一个以上的链接(仅删除了该文件的指向),只删除其中一个链接并不影响索引节点本身和其他的链接(数据的实体并未删除),只有当最后一个链接被删除后(硬链接计数为0,类似于引用计数为0时),此时如果有新数据要存储到磁盘上,被删除的文件的数据块及目录的链接才会被释放,空间被新数据占用覆盖。


软链接:


类似于Windows下的快捷方式,相当于重新创建一个文件,这个文件有独立的inode,但是该文件的内容是另外一个文件的路径(一般是绝对路径)。


访问软链接的时候,实际上相当于访问到了另外一个文件,所以可以跨文件系统的,甚至目标文件被删除了,但链接文件还是在的,只不过指向的文件找不到了而已,即软连接失效了。


基本语法:ln -s 源文件的绝对路径 链接文件






软链接的特点:


  1. 删除软链接对源文件没有影响;

  2. 删除源文件,软链接将失效,但不会影响硬链接;

  3. 可对目录进行链接;

  4. 可以跨文件系统,但硬链接不可以。
    注:linux中,文件数据和文件名是分开储存的


(五)文件类型:


通过ls -al命令,在权限前的一个字符表示的就是对应文件的类型。


  1. 普通文件:‘-’

  2. 目录文件:‘d’

  3. 字符设备文件:‘c’

  4. 块设备文件:‘b’

  5. 软链接:‘l’

  6. 管道文件:‘p’

  7. 套接字:‘s’

  8. 未知文件





(六)文件的权限:


权限的基本介绍:







修改文件/目录权限chmod:


方式一:+、-、= 变更权限


u:所有者、g所在组、o其他人、a所有人(u、g、o的总和)


  1. chmod u=rwx,g=rx,o=x 文件/目录名,赋予所有者读写执行权限、所在组读执行权限、其他人执行权限

  2. chmod o+x 文件/目录名,赋予其他人执行权限

  3. chmod a-x 文件/目录名,剥夺所有人的执行权限


方式二:通过数字变更权限


  1. r=4、w=2、x=1、rwx=7

  2. chmod 751 文件/目录名 等价于 chmod u=rwx,g=rx,o=x 文件/目录名


修改文件所有者chown:


  1. chown newOwner 文件/目录名,改变所有者

  2. chown newOwner:newGroup 文件/目录名,改变所有者和所在组


注:-R:使该目录下所有子文件或目录递归生效


修改文件/目录所在组chgrp:


基本语法:chgrp newGroup 文件/目录,改变所在组


注:-R:使该目录下所有子文件或目录递归生效


(七)Linux组:


Linux中每个用户必须属于一个组,不能独立于组外。


Linux中每个文件有所有者、所在组、其他组的概念。


文件/目录所有者:


一般文件的创建者,就是该文件的所有者。


查看文件所有者:ls -ahl 文件名


修改文件所有者:chown 用户名 文件名


文件/目录所在组:


当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组。




修改文件的所在组:chgrp 组名 文件名


其他组:


除文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组。


查询历史指令:


  1. history :查看已经执行过的历史命令,也可执行历史指令
    history:显示所有的历史命令
    history 10:显示最近使用的10个指令,10为任意数可更改
    !5 :执行历史编号为5的指令,5为历史指令所在的行号可更改


时间日期类:


  1. date :显示当前日期




  1. date -s 字符串时间:设置日期
    date -s 2020-11-12 21:23:23

  2. cal :查看日历
    cal 年份:可显示具体年份的日历


搜索查找类:


  1. find :从指定目录向下递归遍历其各个子目录,将满足条件的文件或目录显示在终端。
    基本语法:find [搜索范围] [选项]



举例:

    1. find /home -name *.txt,查找home目录下.txt的文件

    2. find /home -user sgy,查找home目录下用户名sgy的文件

    3. find /home -size -10M,查找home目录下小于10M的文件
      (其中,+n表示大于,-n表示小于,n等于;n的单位有k、M、G)


  1. locate :快速定位文件路径。
    locate可以利用事先建立的系统中,所有文件名称及路径的locate数据库,实现快速定位文件。
    locate无需遍历整个文件系统,查询速度较快。
    注:由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库。
    举例:updatedblocate hello.txt,定位 hello.txt文件所在的位置。

  2. which :查看某个指令在哪个文件夹下

  3. grep :过滤查找,搜索文本文件内容(如果要搜索的文本之间有空格,要用双引号引起来)
    基本语法:grep [参数] 查找内容 源文件





压缩和解压类:


  1. gzip :用于压缩为.gz文件,基本语法:gzip 文件
    gunzip :用于解压文件,基本语法:gunzip 文件.gz
    注:gzip只能压缩文件,不能压缩目录;不会保留源文件。

  2. zip :用于压缩文件或目录

  • 基本语法:zip [选项] ***.zip 待压缩的文件/目录

  • -r :递归压缩,即压缩目录

unzip :用于解压文件

    • 基本语法:unzip [选项] ***.zip

    • -d 解压到的目标位置 :指定解压后文件的存放目录

注:zip可压缩目录且会保留源文件。

  1. tar :用于打包和解包某个目录和文件
    基本语法:tar [选项] ***.tar.gz 打包的内容:打包目录并压缩,文件格式为.tar.gz



举例:
① tar -zcvf ***.tar.gz 打包的内容:压缩
② tar -zxvf ***.tar.gz:解包到当前目录
③ tar -zxvf ***.tar.gz -C 解压到的目标位置:解包到指定目录


任务调度:


任务调度简介:


是指系统在某个时间执行特定的命令或程序


任务调度分类:


① 系统工作:有些重要的工作必须周而复始地执行,如病毒扫描写、缓存数据到硬盘、清理日志等


② 个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份、定时邮件提醒等


crond任务调度:


基本介绍:


crond 是 Linux 下用周期性的执行某种任务或者等待处理某些事件的一个守护进程。crond 进程会每分钟定期检查是否有要执行的任务,如果有要执行的任务则自动执行该任务。


基本语法:


crontab [选项]





新增任务调度:


  1. 设置任务调度文件:/etc/crontab 或 设置个人任务调度:执行crontab -e命令

  2. 接着输入任务到调度文件


举例:


例一:


*/1 * * * * ls -l /etc/ > /tmp/to.txt,即每一小时的每分钟执行ls -l /etc/ > /tmp/to.txt命令。


例二:每隔1分钟将当前日期和日历都追加到/home/mycal文件中






五个占位符的参数细节说明:








特殊符号说明:








crond的相关命令:


  1. service crond restart:重启任务调度

  2. service crond start:启动服务

  3. service crond stop:关闭服务

  4. service crond reload:重新载入配置

  5. service crond status:查看服务状态


at定时任务:


基本介绍:


  1. at 命令是一次性定时任务,at 的 "守护进程atd” 会以后台模式运行,检查作业队列来运行。执行完后就不再执行此任务了。

  2. 默认情况下,“atd守护进程” 每 60s 检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。

  3. 使用 at 命令时,一定要保证 “atd守护进程” 的启动,可以使用相关指令ps -e查看。
    注:大多数 Linux 系统上,可以命令 sudo systemctl enable --now atd,来启用 atd 服务并将它们设置为从现在开始自动启动。





at命令格式:


at [选项] [时间]


  • ctrl + D :结束 at 命令的输入

  • 选项:




  • 时间:
    -1. 接受当天的 hh:mm(小时:分钟)式的时间指定,假如该时间已过去,则第二天该时间执行。
    -2. 使用midnight、noon、teatime等比较模糊的词语来指定。
    -3. 采用12小时制,即在时间后面加上AM或PM来说明上下午。
    -4. 指定命令执行的具体日期,指定格式为 月 日月/日/年日.月.年,且指定的日期必须在指定的时间后面。
    -5. 使用相对计时法,指定格式为:now + count time-units,now是当前时间,time-units是时间单位如minutes、hours、days、weeks等,count是时间的数量。举例:now + 5 minutes。
    -6. 直接使用today、tomorrow来指定完成命令的时间。
    注:
    -1. atq命令查看系统中,没有执行的工作任务
    -2. atrm 编号删除已经设置的任务


举例:


  1. 2天后下午5点执行/bin/ls /home命令
    at 5pm + 2days
    at> /bin/ls /home

  2. 2分钟后,执行/bin/ls /home >> /home/dates.txt命令





磁盘分区:


原理介绍:


1.一个磁盘都有一个分区表(分区表表告诉系统磁盘是如何分区的、分区起始/结束位置,哪些分区是可引导的,哪些扇区分配给哪些分区等),可以将该磁盘划分为多个分区(本质上就是多个块设备)。


  • dev/sda是整个磁盘,但是/dev/sda1/dev/sda2,是磁盘上的两个分区。分区对于分离数据非常有用,如果你需要某个文件系统,可以轻松地创建一个分区,而不是将整个磁盘设置为一种文件系统类型。

  • 一个磁盘上有多个分区,但不能相互重叠。如果有未分配给分区的空间,则称为空闲空间。分区的类型取决于你的分区表。

  • 一个分区中,可以拥有一个文件系统,也可以专用于其他功能,如交换分区。


  1. Linux无论多少分区或分给哪一个目录,归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux每个分区都是用来组成整个文件系统的一部分。

  2. Linux采用一种叫做 “载入” 的处理方法,整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。
    要载入的一个分区将使它的存储空间在一个目录下获得。




  1. 常见的磁盘分区表:开机区MBR(master boot record)、GPT(partition table)。
    注意:如果要对磁盘进行分区,需注意不同的分区表采用不同的指令:MBR 分区表使用fdisk, GPT 分区表使用gdisk

  2. 常见的文件系统:XFS(一个日志式文件系统,而 CentOS 7.x 拿它当预设的文件系统)、NFS、EXT(磁盘文件系统)等。

  3. 如果想在系统里面新增一颗磁盘时,需要做哪些动作:
    5.1 对磁盘进行分区,以建立可用的 partition ;
    5.2 对该 partition 进行格式化 (format),以建立系统可用的 filesystem;
    5.3 若想要仔细一点,则可对刚刚建立好的 filesystem 进行检验;
    5.4 在 Linux 系统上,需要建立挂载点 (亦即是目录),并将他挂载上来; 注意:在上述过程中,需要考虑的问题还有很多,如磁盘分区槽(partition)需要定多大? 是否需要加入 journal 的功能?inode 与 block 的数量应该如何规划等。


硬盘说明:


  1. Linux硬盘分为IDE硬盘 和 SCSI硬盘,目前基本上是SCSI硬盘

  2. 对于IDE硬盘,驱动器标识符为hdx~,其中hd表明分区所在设备的类型,x为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘),~表示分区(前四个分区用数字1~4表示为主分区或扩展分区,5开始就是逻辑分区)。

  3. 对于SCSI硬盘,标识符为sdx~,其中sd表示分区所在设备的类型(这里指SCSI硬盘),其余则于IDE硬盘表示方法相同。


lsblk-查看所有设备挂载情况:


命令:lsblk 或 lsblk -f





经典案例:


以增加一块硬盘为例,来熟悉磁盘的相关指令和深入理解 “磁盘分区”、“挂载”、“卸载” 的概念。


如何增加一块硬盘:


  1. 虚拟机添加硬盘sdb
    在【虚拟机】菜单中,选择【设备】,然后将列表里添加硬盘,之后下一步,选择好硬盘大小后,直至完成,最后重启系统即可。

  2. 分区
    分区命令:fdisk /dev/sdb



    注:开始分区后,输入n新增分区,之后选择p即分区类型为主分区,两次回车默认剩余全部空间,最后输入w写入分区,并输入q退出输入。

  3. 格式化
    格式化磁盘分区命令:mkfs -t ext4 /dev/sdb1,其中 ext4是分区类型。
    注:只有格式化后,才会给该分区分配唯一的40位id号

  4. 挂载,即将一个分区与目录联系起来
    mount 设备名称 挂载目录:挂载设备到目录下,即给该分区设置挂载点
    umount 设备名称 或 挂载目录:卸载,即拿掉该分区的挂载点
    注:采用命令行挂载,重启后会失效

  5. 设置可以自动挂载,即永久挂载
    永久挂载:通过修改/etc/fstab实现挂载
    添加完成后,执行mount -a,即可生效


磁盘情况查询:


df-查询系统整体磁盘使用情况:


基本命令:df -h







du-查询指定目录的磁盘占用情况:


基本命令:du -h [目录名] ,不指定目录时默认为当前目录



磁盘实用指令:


  1. 统计/home文件夹下文件的个数
    ls -l /home | grep "^-" | wc -l

  2. 统计/home文件夹下目录的个数
    ls -l /home | grep "^d" | wc -l

  3. 统计/home文件夹下文件的个数,包括子文件夹
    ls -lR /home | grep "^-" | wc -l

  4. 统计/home文件夹下目录的个数,包括子文件夹
    ls -lR /home | grep "^-" | wc -l

  5. 以树状显示目录结构
    tree 目录
    注:如果提示不存在tree指令,则需要执行安装yum install tree命令。


系统管理:


Linux中的进程和服务。


  • 计算机中,正在执行的程序或命令,被称为 “进程”(possess)

  • 系统启动后,常驻内存的进程,被称为 “服务”(service)


进程管理:


进程ps(process status),只显示终端正在执行的进程。


基本介绍:


  1. Linux中,每个执行的程序都被称为一个进程,每个进程都分配一个ID号pid,即进程号)。

  2. 每个进程都可能以两种方式:前台和后台。
    前台进程:用户目前的屏幕上可以进行操作
    后台进程:屏幕无法看到进程,通常使用后台方式执行

  3. 一般系统服务,都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。


显示系统执行的进程:


基本介绍:


ps命令是用来查看目前系统中,有哪些正在执行的进程,以及它们的执行情况。


top:按照CPU占用率排序,有大到小


ps显示的信息选项:





ps加参数后:


  1. ps -a:显示当前终端的所有进程信息

  2. ps -u:以用户的格式显示进程信息

  3. ps -x:显示后台进程运行的参数


ps -aux详解:


指令:ps -aux | grep ***


指令说明:


  1. USER:用户名称

  2. PID:进程号

  3. **%CPU**:进程占用CPU的百分比

  4. **%MEM**:进程占用物理内存的百分比

  5. **VSZ**:进程占用虚拟内存的大小

  6. **RSS**:进程占用物理内存的大小

  7. TT:终端名称的缩写

  8. STAT:进程状态
    S:睡眠
    s:表示该进程是会话的先导进程
    N:表示进程拥有比普通优先级更低的优先级
    R:正在运行
    D:短期等待
    Z:僵死进程
    T:被跟踪或者被停止等待

  9. STARTED:进程的启动时间

  10. TIME:进程使用CPU的总时间

  11. COMMAND:启动进程所用的命令和参数,过长会被截断显示


ps -ef以全格式显示当前所有进程:


-e:显示所有进程,-f:全格式


  1. UID:用户ID

  2. PID:进程ID

  3. PPID:父进程ID

  4. C:CPU用于计算执行优先级的因子。
    数值越大,表明进程是CPU密集型运算,执行优先级会降低。
    数值越小,表明进程是I/O密集型运算,执行优先级会提高。

  5. STIME:进程启动时间

  6. TTY:完整的终端名称

  7. TIME:CPU时间

  8. CMD:启动进程所用的命令和参数


终止进程kill 和 killall:


基本说明:


若 “某个进程执行一半需要停止” 或 “已消耗了很大的系统资源” 时,此时可考虑停止该进程。


基本语法:


kill [选项] 进程号:用进程号杀死进程。


killall 进程名称:用进程名称杀死进程,也支持通过通配符,当系统因负载过大变得很慢时有用。


常用的选项:-9,表示强迫进程立即停止


应用举例:


  1. 踢掉某个非法登录用户







  1. 终止远程登录服务sshd,并在适当时候再次重启sshd服务







  1. killall gedit,即可终止多个gedit进程

  2. 强制杀掉一个终端,kill -9 bash对应的进程号


查看进程树pstree:


基本语法:


pstree [选项],可以直观的来查看进程信息


常用选项:


-p:显示进程的PID


-u:显示进程的所属用户


服务管理:


基本介绍:


服务本质就是守护进程,但运行在后台,且通常会监听某个端口,等待其它程序的请求,比如mysql,sshd,防火墙等。







service服务管理:


  1. service 服务名 [start | stop | restart | reload | status]

  2. service指令管理的服务在/etc/init.d查看




  1. 在CentOS 7.0后,很多服务不再使用service,而是systemctl


chkconfig服务管理:


基本介绍:


  1. 通过chkconfig命令可以给服务的各个运行级别设置自启动/关闭

  2. chkconfig指令管理的服务在/etc/init.d查看

  3. 在CentOS 7.0后,很多服务使用systemctl管理


基本语法:


  1. 查看服务:
    chkconfig --list [| grep ***]
    chkconfig 服务名 --list

  2. 设置后台服务的自启配置:chkconfig --level 指定运行级别 服务名 on/off


使用细节:


chkconfig重新设置服务后,自启动或关闭需要重启机器生效。


systemctl服务管理:


systemctl指令管理的服务在/usr/lib/systemd/system中查看。







基本介绍


  1. 早期的服务管理使用 systemV 的机制,透过 /etc/init.d/*, service, chkconfig, setup 等指令,来管理服务的启动/关闭/预设启动;

  2. 从 CentOS 7.x 开始,采用 systemd 的机制,此机制最大功能为平行处理,并采单一指令管理 systemctl,开机速度加快!

  3. systemd 将各服务定义为 unit,而 unit 又分类为 service, socket, target, path, timer 等不同的类别,方便管理与维护;

  4. 启动/关闭/重启的方式: systemctl [start|stop|restart] unit.service

  5. 设定预设启动/不启动的方式: systemctl [enable|disable] unit.service

  6. 查询系统所有启动的服务 systemctl list-units --type=service ,查询所有的服务 (含不启动) systemctl list-unit-files --type=service

  7. systemd 取消了以前的 runlevel 概念 ,转而使用不同的 target 操作环境。常见操作环境为 multi-user.target 与 graphical.target。 不重新启动而转不同的操作环境 systemctl isolate unit.target,而设定预设环境则使用 systemctl set-default unit.target

  8. systemctl 系统默认的配置文件主要放在 /usr/lib/systemd/system,管理员若要修改或自行设计则建议放在 /etc/systemd/system/ 目录下;

  9. 管理员应使用 man systemd.unit, man systemd.service, man systemd.timer 查询 /etc/systemd/system/ 底下配置文件的语法, 并使用 systemctl daemon-reload 加载后,才能自行撰写服务与管理服务!

  10. 除 atd 与 crond 外,可以 透过 systemd.timer 亦即 timers.target 的功能,来使用 systemd 进行时间管理、定时任务的功能。


基本语法


systemctl [start | stop | restart | status] 服务名


systemctl设置服务的自启动状态:


  1. systemctl list-unit-files [| grep 服务名]:查看服务开机启动状态,grep可以进行过滤

  2. systemctl enable 服务名:设置服务开机启动(会同时在运行级别3和5进行设置)

  3. systemctl disable 服务名:关闭服务开机启动(会同时在运行级别3和5进行设置)

  4. systemctl is-enabled 服务名:查询某个服务是否是自启动的


使用细节:


  1. systemctl [start | stop] firewalld,关闭或启动防火墙后,立即生效。
    但只是临时失效,重启系统后还是会回归到以前对防火墙的设置。

  2. 如果要设置某个服务自启动或关闭永久生效,要使用systemctl [enable|disable] 服务名


firewall指令:







打开或关闭指定端口:


真正的生产环境中,往往需要防火墙打开,但问题是如果打开防火墙则外部请求数据包就不能跟服务器监听端口通讯,这时就需要打开指定端口。


常用的firewall指令:


  1. 打开端口:firewall-cmd --permanent --add-port=端口号/协议
    注:通过netstat -anp | more可以查看端口的协议。

  2. 关闭端口:firewall-cmd --permanent --remove-port=端口号/协议

  3. 重新载入后,才能生效:firewall-cmd --reload

  4. 查询端口是否开放:firewall-cmd --query-port=端口/协议

  5. 查看已经开放的所有端口号:firewall-cmd --list-ports


应用举例:


  1. 启动防火墙,测试111端口是否能 telnet(肯定不行)







  1. 开放111端口







  1. 再次关闭111端口







top-动态监控进程:


基本介绍:


top和ps命令很相似,都是用来显示正在执行的进程。


最大的区别在于:top执行一段时间可以更新正在进行的进程


基本语法:


top [选项]


选项说明:


  • -d 秒数:指定top命令每隔几秒更新,默认3秒

  • -i:使top不显示任何闲置或僵死进程

  • -p:通过指定监控进程ID来仅仅监视某个进程的状态


交互操作说明:


  • P:以CPU使用率排序,默认就是此项

  • M:以内存的使用率排序

  • N:以PID排序

  • q:退出top


应用举例:


  1. 监视特定用户:

  • 通过top指令,查看执行的进程

  • 输入u命令后回车,之后输入用户名,即可

  1. 终止指定的进程:

  • 通过top指令,查看执行的进程

  • 输入k命令后回车,之后输入要结束的进程ID号,即可


监控网络状态:







netstat-查看系统网络情况:


基本语法:netstat [选项]


选项说明:


  • -an:按一定顺序排列输出

  • -p:显示哪个进程在调用


举例:查看mysqld进程local address和端口3306。







ping-检测主机连接命令:


是一种网络监测工具,主要是用检测远程主机是否正常或者两部主机间的网线或网卡故障


基本语法:ping 对方IP地址


软件包及其安装:


centos中的RPM和YUM:


rpm包的管理:


rpm包名:名称-版本号-适用的操作系统(i686、i386表示32位系统,noarch表示通用)


查询已安装的rpm列表:


rpm -qa


rpm -qa | grep ***


查询软件包是否安装:


rpm -q 软件包名


查询软件包信息:


rpm -qi 软件包名


查询软件包中的文件:


rpm -ql 软件包名


查询文件所属的软件包名:


rpm -qf 文件全路径名


卸载rpm包:


基本语法:rpm -e rpm包名


使用细节:


  • 如果其他软件包依赖于要卸载的软件包,卸载时则会产生错误信息

  • 可通过增加参数--nodeps,强制删除该软件包,但一般不推荐


安装rpm包:


基本语法:rpm -ivh RPM包全路径


参数说明:





yum包的管理:


基本介绍:


Yum是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包


默认的系统 YUM 源,需要连接国外 apache 网站,网速比较慢。可以修改关联的网络YUM源为国内镜像的网站,如网易163、aliyun 等。





yum基本指令:


基本语法:yum [选项] [参数]


参数说明:




查询yum服务器是否有需要安装的软件:yum list | grep ***





安装指定的yum包:yum install ***


ubuntu中的APT:


APT工作原理:


apt(advanced packaging tool),是一款安装包管理工具。在ubuntu下,可使用apt命令进行软件包的安装、删除、清理等,类似于windows下的软件管理工具。







apt软件安装包管理器:


  1. sudo apt-get update:更新源

  2. sudo apt-get upgrade:更新已安装的软件包

  3. sudo apt-get dist-upgrade:升级系统

  4. sudo apt-get install ***:安装软件包

  5. sudo apt-get install *** --reinstall:重新安装软件包

  6. sudo apt-get -f install:恢复安装

  7. sudo apt-get build-dep ***:安装相关的编译环境

  8. sudo apt-get remove ***:移除软件包

  9. sudo apt-get remove *** --purge:移除软件包,包括配置文件

  10. sudo apt-cache search ***:搜索软件包

  11. sudo apt-cache show ***:获取软件包的相关信息,如说明、大小、版本等

  12. sudo apt-cache depends ***:了解该包依赖哪些包

  13. sudo apt-cache rdepends ***:了解该包被哪些包依赖

  14. sudo apt-get source ***:下载该包的源代码

  15. sudo apt-get list:软件包列表


Shell编程:


常见的可执行脚本:


可执行脚本:


脚本程序Script,是一种解释执行的程序。


linux下常见的三种脚本程序:


Shell脚本 *.sh 、Python脚本 *.py (python是一个可跨平台运行的脚本程序,windows、linux都可以执行)、 Perl脚本 *.pl。


执行脚本程序的解释器:


  • Shell脚本解释器:/bin/bash

  • Python脚本解释器:/bin/python3

  • Perl脚本解释器:/bin/perl


Shell/python脚本书写:


  1. 编辑一个文本文件,保存为.sh文件;
    #!/bin/bash #!/bin/python3
    echo “hello world!” print(“hello world!”);

  2. 添加可执行权限:chmod u+x 脚本文件名.sh

  3. 执行程序:./脚本文件名.sh


Shell基本介绍:


Shell是什么?


Shell是一种命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至编写程序。


Shell,会接收应用程序/用户命令,然后调用操作系统内核。





Linux中的Shell解释器:







bash和sh的关系:







centos7默认的解释器:







Shell脚本的执行方式:


脚本格式要求:


  1. 脚本以#!/bin/bash开头

  2. 脚本有需要可执行权限


脚本的常用执行方式:


方式一:脚本的绝对路径相对路径(需要赋予脚本执行权限)


方式二:sh 脚本,不用赋予脚本执行权限,即可直接执行


Shell的变量:


基本介绍:


  1. Linux Shell中的变量分为:“系统变量” 和 “用户自定义变量” 等

  2. 系统变量:$HOME$PWD$SHELL$USER

  3. 显示当前shell中所有变量:set


变量定义:


  1. 定义变量:变量名=值

  2. 撤销变量:unset 变量

  3. 声明静态变量:readonly 变量(注:该变量不能unset)







定义变量的规则:


  1. 变量可由字母、数字、下划线组成,但不能以数字开头

  2. 等号两侧不能有空格

  3. 变量名称,一般大写

  4. 命令的返回值赋给变量A='命令' 或 A=$(命令)


设置环境变量:


基本语法:


  1. 将shell变量输出为 “环境变量/全局变量” :export 变量名=变量值

  2. 让修改后的配置信息立即生效:source 配置文件

  3. 查询环境变量的值:echo $变量名


注:可在shell脚本中使用,也可在terminal终端中使用,但只对当前终端有效。


常见的环境变量:


PATH环境变量:


  1. 最常见的环境变量,用来描述可执行程序的搜索路径

  2. 查看PATH环境变量:echo $PATH,多个路径之间用冒号分隔

  3. 系统默认在以下目录中搜索可执行程序: /usr/bin/usr/sbin/usr/local/bin/usr/local/sbin
    ,其中:/usr/下是系统自带的程序、/usr/local/下是用户自己安装的程序、sbin为超级用户root才能执行的程序

  4. 设置:export PATH=$PATH:/opt/JAVA_HOME/bin


系统环境变量:


定义在/etc/profile中,且对所有用户都有效


一般不直接在profile文件中修改,而是在/etc/profile.d/中,创建一个自定义的脚本,细节如下:


  1. 创建一个脚本:/etc/profile.d/myprofile.sh

  2. 定义环境变量:
    #!/bin/bash
    export JAVA_HOME = /opt/jdk1.8

  3. 重启后,查看:echo $JAVA_HOME


用户环境变量:


原理:

当用户打开终端时,会自动的运行.profile,并将变量注入到当前环境中(每个用户都有自己的配置文件.profile(Linux中以 “.开头的文件” 是 “隐藏文件”(默认不显示)))


定义用户环境变量:

  1. 打开~/.profile文件:vim ~/.profile

  2. 添加用户环境变量:export $JAVA_HOME = /opt/jdk1.8

  3. 修改后的配置信息立即生效:source ~/.profile

  4. 查看:echo $JAVA_HOME


位置参数变量:


基本介绍:


当执行一个shell脚本时,如果希望获得命令行的参数信息,就可以使用到位置参数变量。


基本语法:


  • $n:n为数字,$0表示命令本身、$0~$9表示第一到九个参数、第10个以上的参数需要加圆括号,如$(10)

  • $*:表示命令行的所有参数,即所有参数被看成了一个整体

  • $@:表示命令行中所有参数,但每个参数被去呗对待

  • $#:表示命令行中所有参数的个数


举例:







预定义变量:


基本介绍:


预定义变量,就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。


基本语法:


  • $$:当前进程的进程号PID

  • $!:后台运行的最后一个进程的进程号PID

  • $?:最后一次执行的命令的返回状态:变量的值为0,表示上一个命令正确执行、变量的值非0(具体哪个数由命令自己决定)表示上一个命令执行不正确


举例:







运算符:


  1. $((运算符))$[运算符]

  2. expr m + n

  3. 注意,expr \*,/,%





流程控制:


单分支:


if [ 条件判断语句]
then
	代码
fi


多分支:


if [ 条件判断语句]
then
	代码
elif [ 条件判断语句 ]
then
	代码
fi


for循环:


for 变量 in 值1 值2 值3...
do 
	代码
done


for ((初始值;循环控制条件;变量变化))
do 
	代码
done







while循环:


while [条件判断式]
do 
	代码
done







条件判断:


判断语句:


[ condition ](注意condition前后要有空格)


,非空返回true,可使用$?验证(0为true,>1为false)


常用的判断条件:



read读取控制台输入:


read [选项] 变量参数


  • -p:指定读取值时的提示符

  • -t:指定读取值时的等待时间(单位秒),没有则不再等待

  • 变量参数:指定读取值的变量名





函数:


系统函数:


1、basename函数:返回完整路径最后/的部分,常用于获取文件名


basename [string] [suffix]:删除掉所有前缀包括最后的一个/字符,然后将字符串显示;如果suffix被指定,则basename会将string中的suffix去掉。


2、dirname函数:返回完整路径最后/的前面部分,常用于返回路径


dirname 文件绝对路径:从给定的包含绝对路径的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录的部分)。


自定义的函数:


function funcname()
{
	Action;
	[return int;]
}


funcname [值]







案例:备份mysql数据库







#!/bin/bash


BACKUP_ADDR=/test_backup_data/backup_mysql_db


DATETIME=$(date + %Y-%m-%d_%H%M%S)
echo "$DATETIME"


if [ ! -d "${BACKUP_ADDR}/${DATETIME}" ]
then
	mkdir -p "${BACKUP_ADDR}/${DATETIME}"
fi



DB_USER=root
DB_PASSWORD=123456789

ADDR=localhost

DATABASE=students


mysqldump -u${DB_USER} -p${DB_PASSWORD} --host=${ADDR} -q -R --databases ${DATABASE} | gzip > ${BACKUP_ADDR}/${DATETIME}/$DATETIME.mysql.gz


cd ${BACKUP_ADDR}
tar -zcvf $DATETIME.tar.gz ${DATETIME}

rm -rf ${DATETIME}


find ${BACKUP_ADDR} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;


日志管理:


基本介绍:


  1. 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户登录信息、系统的启动信息、系统安全信息、邮件相关信息、各种服务相关信息等。

  2. 日志对安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因 或 受攻击时攻击者留下的痕迹。

  3. 日志是用来记录重大事件的工具。


系统日志文件位置:


/var/log/:是系统日志文件的保存位置





系统常用的日志:





日志管理服务:


CentOS 7.6日志服务是rsyslogd


  • 查询Linux中的rsyslogd服务是否启动
    ps aux | grep "rsyslog" | grep -v "grep"




  • 查询rsyslogd服务的自启动状态
    systemctl list-unit-files | grep rsyslog





配置文件:


/etc/rsyslog.conf存放rsyslogd服务相关的配置文件。


编辑文件时的格式为:*.* 存放日志文件,其中第一个*表示日志类型,第二个*表示日志级别。


  1. 日志类别分为:

  • auth:pam产生的日志

  • authpriv:ssh、ftp等登录信息的验证信息

  • cron:时间任务相关

  • kern:内核

  • lpr:打印

  • mail:邮件

  • mark(syslog)-rsyslog:服务内部的信息,时间标识

  • news:新闻组

  • user:用户程序产生的相关信息

  • uucpunix to unix copy主机之间相关的通信

  • local1~7:自定义的日志设备

  1. 日志级别分为:

  • debug:有调试信息的,日志通信最多

  • info:一般信息日志,最常用

  • notice:最具有重要性的普通条件的信息

  • warning:警告级别

  • err:错误级别,阻止某个功能或者模块不能正常工作的信息

  • crit:严重级别,阻止整个系统或者整个软件不能正常工作的信息

  • alert:需要立即修改的信息

  • emerg:内核崩溃等重要信息

  • none:不记录任何信息

注:从上到下,级别越低,记录信息越少。


日志文件格式:


由日志服务rsyslogd记录的日志文件,格式包括以下4列:


  • 事件产生的时间

  • 产生事件的服务器的主机名

  • 产生事件的服务名或程序名

  • 事件的具体信息


举例:查看cat /var/log/secure日志文件。





自定义日志服务:


/etc/rsyslog.conf中添加一个日志文件/var/log/self_define_log.log。当有事件发送时(如下图中sshd服务(登录等)相关的事件),该文件会接收并保存信息。
1、修改配置文件/etc/rsyslog.conf,如下图:




2、在XShell建立两个会话,用rootsgy身份登录,观察自定义的日志文件/var/log/self_define_log.log中,关于sshd的相关事件信息,如下图:





日志轮替:


基本介绍:


日志轮替,就是将旧的日志文件移动并改名,同时建立新的空日志文件,当旧的日志文件超出保存的范围后,就会进行删除


日志轮替文件命名:


CentOS7使用logrotate进行日志轮替管理,要想改变日志轮替文件名字,通过/etc/logrotate.conf配置文件中dateext参数。


  1. 如果配置文件中dateext参数存在,那么会用日期来作为日志文件的后缀。这样日志文件不会重叠,也就不需要日志文件的改名,只需指定保存日志个数,删除多余日志文件即可。

  2. 如果配置文件中dateext参数不存在,则日志文件需要进行改名。第一次进行轮替时,当前日志自动添加后缀.1,并新建日志用来保存新的日志;
    第二次进行轮替时,后缀.1会自动更名为.2,当前后缀会更名为.1,之后会新建日志用来保存新的日志。





logrotate配置文件:





将自己的日志加入日志轮替:


法一:直接在/etc/logrotate.conf配置文件中,写入该日志的轮替策略。


法二:在/etc/logrotate.d目录中新建立该日志的轮替文件,并在该轮替文件中写入正确的轮替策略。该目录中的所有文件,都会被 “include” 到主配置文件中。





注:推荐使用法二,方便管理和后期维护。


日志轮替机制:


原理:


日志轮替之所以可以在指定时间备份日志,是依赖系统定时任务


/etc/cron.daily/目录中,logrotate文件(可执行文件)依赖定时任务执行。





工作原理图:







查看内存日志:


journalctl:可用来查看内存日志,常用的指令如下:


  • journalctl:查看全部的内存日志

  • journalctl -n 3:查看最新的3条日志

  • journalctl --since 19:00 --until 19:10:10:查看起始到结束之间的日志

  • journalctl -p err:报错日志

  • journalctl -o verbose:日志详细内容

  • journalctl_PID=1245 _COMM=sshd:查看包含这些参数的日志

  • journalctl | grep sshd:查看远程远程连接的日志


注:journalctl查看的是内存日志,重启会清空


定制Linux系统(Linux裁剪):


启动流程介绍:


  1. 首先Linux要通过自检,检查硬件设备有没有故障

  2. 如果有多块启动盘,则需要在BIOS中选择启动磁盘

  3. 启动MBR中的bootloader引导程序(grub2)

  4. 加载内核文件

  5. 执行所有进程的父进程systemd

  6. 欢迎界面


注:Linux启动流程中,加载内核文件时关键文件:


  1. kernel文件:vmlinuz-3.10.0-957.el7.x86_64

  2. initrd文件:initramfs-3.10.0-957.el7.x86_64.img


制作min_Linux系统:







  1. 为现有的Linux增加一块大小为20G的硬盘(注需要将其作为单个文件存储)



  1. 通过lsblk查看是否存在sdb,然后对其进行分区fdisk /dev/sdb




  1. /dev/sdb/进行格式化,使用mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2




  1. 创建两个新的目录/mnt/boot/mnt/sysroot,并挂载到新硬盘(其中,/dev/sdb1挂载到/mnt/boot目录上、/dev/sdb2挂载到/mnt/sysroot目录上)




  1. 安装引导程序grub到设备/dev/sdb,并将内核文件拷贝至目标磁盘

  • grub2-install --root-directory=/mnt /dev/sdb,通过hexdump -C -n 512 /dev/sdb,即查看二进制确保安装成功




    • cp -rf /boot/* /mnt/boot,拷贝当前linux中/boot/*/mnt/boot




  1. 修改/mnt/boot/grub2/grub.cfg文件(需要通过lsblk -f指令查看)




注意:grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后,内核会根据grub.cfg配置文件中的配置,找到根分区所使用的文件系统对应的驱动,通过根分区文件系统对应的驱动,挂载根分区,从而达到启动操作系统的目的。




  1. 创建目标主机文件系统
    mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}




  1. 拷贝需要的bash(也可根据需要拷贝其他指令)和库文件给新的系统使用
    cp /lib64/*.* /mnt/sysroot/lib64
    cp /bin/bash /mnt/sysroot/bin

  2. 创建新的虚拟机,之后执行刚创建的磁盘min_Linux.vmdk即可


Linux0.01内核源码结构:








linux内核中的组件:


  • 进程管理:
    每个进程对应一个task_struct结构体,并通过Copy on Write写时复制来对fork的子进程进行task_struct的复制和改写。

  • 内存管理:

  • 文件系统:
    常见的几种文件系统:
    1)ext3/ext4,物理磁盘做一个索引的作用。
    2)fuse,用户态的文件系统fs
    3)分布式文件系统:tfsgfsfastdfs

  • 设备驱动:

  • 网络:


Linux备份和恢复:


方式一:把需要的文件或分区用tar打包,需要恢复时,解压并覆盖即可;


方式二:使用dumprestore命令。


使用dump完成备份:


基本介绍:


dump支持分卷和增量备份(增量备份,指备份上次备份后修改/增加过的文件,又称差异备份)。


dump语法说明:


dump [-cu] [-123456789] [-f <备份后文件名>] [-T <日期>] [目录或文件系统]


dump -wdump -W


  • -c:创建新的归档文件,并将一个或多个参数所指定的内容写入归档文件的开头

  • -0123456789:备份的层级,0为最完整的备份,1~9仅仅备份新增或修改的文件,之后会在此次轮替。

  • -f <备份后文件名>:指定备份后文件名

  • -j调用bzlib库压缩备份文件,即将备份后的文件压缩成bz2格式,让文件更小

  • -T <日期>:指定开始备份的时间和日期

  • -u:备份完成后,在/etc/dumpdates中记录备份的文件系统,层级、日期、时间等

  • -t:指定文件名,若该文件已备份,则列出名称

  • -W:显示需要备份的文件,及最后一次备份的层级、日期、时间

  • -w:与W类似,但仅显示需要备份的文件


举例:


  1. /boot分区备份到/opt/boot.bak0.bz2文件中
    dump -0uj -f /opt/boot.bak0.bz2 /boot

  2. 将新增文件后的/boot分区备份到/opt/boot.bak0.bz2文件中
    dump -1uj -f /opt/boot.bak1.bz2 /boot


使用restore恢复备份:


基本介绍:


restore命令用来恢复已备份的文件,可从dump生成的备份文件中恢复原文件。


基本语法:


restore [模式选项][选项]


四种模式:


  • -C:对比模式,将备份文件与已存在的文件相互对比

  • -i:交互模式,在进行还原操作时,restore将依序询问用户

  • -r:进行还原模式(注意:如果有增量备份时,需要按照顺序进行恢复)

  • -t:查看模式,看备份文件有哪些


选项:


-f <备份设备>:从指定文件中读取备份数据,进行还原操作


Centos7启动流程:


启动过程分析:







启动流程图:







分析关键启动过程:


  1. 第一步:硬件启动阶段

  2. 第二步:GRUB2引导阶段
    CentOS7的主引导程序使用的是grub2
    本步的流程:

    1. 先加载两个镜像;

    2. 再加载MOD模块文件,把grub2程序加载执行;

    3. 接着解析配置文件/boot/grub/grub.cfg,根据配置文件加载内核模块到内存;

    4. 之后构建虚拟根文件系统,最后转到内核。


  1. 第三步:内核引导阶段
    加载驱动,切换到真正的根文件系统,执行初始化程序了/usr/lib/systemd/systemd

  2. 第四步:systemed初始化阶段(又叫系统初始化阶段)
    本步的流程:

    1. 执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关);

    2. 执行sysinit.target来初始化系统和basic.target来准备操作系统;

    3. 启动multi-user.target下的本机服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动;

    4. 执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。

注意:

    • /etc/systemd/system/default.target指向了/lib/systemd/system/下的graphical.targetmultiuser.target




    • graphical.target依赖multiuser.target
      multiuser.target依赖basic.target
      basic.target依赖sysinit.target,故需要倒过来执行。


打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。

 可能感兴趣的文章