Linux基本

一、安装

(一)bios basic input / output system

  1. cpu虚拟化技术需要开启

    intel

    amd

  2. 不同品牌进入bios快捷键不一样

(二)vmware

  1. 新建

  2. 配置硬件

    • 硬盘

      • 建议单个虚拟硬盘文件,比较好管理

      • r如果有转移的需求,建议多个

        u盘的格式化

        ntfs

    • 网络

      • 只可以访问主机资源

        host only

      • 可以自由访问网络资源

        brige 桥接:主机与虚拟机 各自独立ip

        NAT:网络地址转换。主机和虚拟机同一个ip

      • 桥接模式 一定要显示vmnet 所对应的网络适配器 为本地用来上网的适配器硬件

        查询方法:右下角网络图标--网络和internet-更改适配器-查看本地网络的适配器

        如果上不了网查看是否选择本地网卡

    • 光驱

      需要指定光驱硬件,读取资源的来源

      • 物理光驱,比较少用

      • iso文件:选择本地iso后要选择上方的自动连接

        如果没有指定会进入网络安装模式 报错:DHCP ckent...

  3. 安装时

    (1)系统安装目标:直接指定硬盘,选择Done完成

    (2)网络:打开按钮------自动进行dhcp 分配地址

    • 动态分配地址,租约到就收回

    • 有时挂起:挂起时保留的ip,因为没有使用,租约到期,被收回或者给他人使用。导致挂起的虚拟机恢复后,因为ip仍然是之前配置的,无法上网。需要重新启动网络,再次动态分配一个地址。

    (3)用户root密码的设置

  4. 安装好之后

    • 登录
      • 输入root用户名
      • 回车-----提示输入密码
      • 此时输入的密码是不可见的,输完直接回车即可进入系统
      • 正确提示:root@localhost #
  5. 常见问题

    • 网络ip addr

      • 只有本地回路 loopback ens33 只有一行信息

      (1)vmnet0 桥连接模式在安装vmware未安装成功 需要 将 C盘属性安全的第1个和第4个权限全部打开

      (2)gui安装界面 点击打开网络按钮

      ​ 偶发:显示按钮打开,但实际相关的配置信息没有保存,导致相关的虚拟网卡适配器,没有开机启动

二、虚拟化(硬件)软件

1.vmware

  1. 该公司其他软件

    workstation

    esxi 虚拟管理系统

2.virtualbox

3.bochs

仅模拟 不是完全虚拟

4.通过系统资源 来虚拟化出来一些硬件(实现硬件相应的功能)

三、linux的理解

(一)linux内核:kernel

(二)unix有自己的内核和相关的外围软件。收费

(三)自己造内核

  1. minix内核:为了教学用
  2. linus:结合社区,持续更新
  3. gnu project:Gnu is Not Unix。自己造内核,同时自己造软件。gpl开源协议

(四)根据不同的外围软件的分类及管理方式

​ 出现不同的发行版 distrbution distro

  1. 两发发行版派系
  • debian系
    • debian
    • unbuntu 开发者常用
  • redhat系
    • redhat
    • centos
  1. linux支持的桌面

    kde、gnome、lxde、xfce、unity

  2. 与windows的区别

    • linux常用服务器,比较稳定

    • windows常用语pc,也有服务器,但没有linux稳定

四、网络相关知识

UID:唯一标志

ONBOOT=yes:表示开机启动自动连接

GATEWAY=:表示网关地址

1.基础

  1. bootproto

    • 网络地址的协议

      static

      dhcp

  2. gateway

    • 网关

      • 内网与外界通信时,需要经过的通道,方便管理和监控。

      • 与本机ip前三段一致,第4位是1,一般是172.16.8.1

      • 通过命令添加网关,也可以修改配置文件

      • route命令(centos7不再使用)

  3. dns

    • 域名服务器

      • 8.8.8.8 谷歌域名服务器

      • 国内114 域名服务器

    • 通过域名访问时,将域名发送给域名解析服务器,转换域名为ip后进行通信。

      假如没有配置域名服务器:ping xx.xx.xx.xx 可以ping通;

2.相关配置文件

  1. 域名服务器路径

    可以ping通,但是ping baidu.com 提示unknown host,需要配置域名解析服务

    cat /etc/resolv.conf
    
  2. 编辑网络配置文件

    ens33没有获得ip,将最后一行ONBOOT=no修改为yes,修改完后重启网络systemctl restart network

    vi /etc/sysconfig/network-scripts/ifcfg-ens33
    

    ens33参数说明

    sh 复制代码
    TYPE="Ethernet"		#网卡类型(通常是Ethemet以太网)
    PROXY_METHOD="none"	#代理方式:为关闭状态
    BROWSER_ONLY="no"	#只是浏览器:否
    BOOTPROTO="static"	#网卡的引导协议【static:静态IP  dhcp:动态IP   none:不指定,不指定容易出现各种各样的网络受限】
    DEFROUTE="yes"		#默认路由
    IPV4_FAILURE_FATAL="no"		#是否开启IPV4致命错误检测
    IPV6INIT="yes"		#IPV6是否自动初始化:是(现在还未用到IPV6,不会有任何影响)
    IPV6_AUTOCONF="yes"	#IPV6是否自动配置:是(现在还未用到IPV6,不会有任何影响)
    IPV6_DEFROUTE="yes"	#IPV6是否可以为默认路由:是(现在还未用到IPV6,不会有任何影响)
    IPV6_FAILURE_FATAL="no"		#是否开启IPV6致命错误检测
    IPV6_ADDR_GEN_MODE="stable-privacy"	#IPV6地址生成模型
    NAME="ens33"		#网卡物理设备名称
    UUID="ab60d501-535b-49f5-a76b-3336a4120f64"#通用唯一识别码,每一个网卡都会有,不能重复,否则两台linux机器只有一台可上网
    DEVICE="ens33"		#网卡设备名称,必须和'NAME'值一样
    ONBOOT="yes"		#是否开机启动,要想网卡开机就启动或通过 `systemctl restart network`控制网卡,必须设置为 `yes`
    IPADDR=192.168.31.59	# 本机IP
    NETMASK=255.255.255.0		#子网掩码
    GATEWAY=192.168.31.1		#默认网关
    DNS1=8.8.8.8#
    DNS2=8.8.8.5#
    ZONE=public#

3.相关命令

  1. ping

    测试当前服务器是否可以连接目的主机

    ping www.baidu.com
    
  2. 查看ip地址

    方法一

    ip addr
    
    ip a
    

    方法二

    sh 复制代码
    1.需要先安装网络工具
    yum install net-tools
    
    2.查询ip地址
    ifconfig
  3. 网络命令

    修改配置文件后,通常需要重新启动服务

    sh 复制代码
    重启
    systemctl restart network
    
    停止
    systemctl stop network
    
    开始
    systemctl start network
    
    状态
    systemctl status network
  4. systemctl 还可以 enable服务 和 disable服务,安装的服务是否被启动

4.网络出现问题时如何排查

  1. 服务

  2. 网络接口配置

  3. ping

    网关、常见网站

  4. dhcp时 是否挂机?

5.修改静态IP

vi /etc/sysconfig/network-scripts/ifcfg-ens33

6.网络连接的三种模式

桥接模式

虚拟系统可以和外部系统通讯 ,但是容易造成IP冲突

NAT模式

网络地址转换模式,虚拟系统可以和外部系统通讯 ,不造成IP冲突

主机模式

独立的系统

五、关机、重启、登录、注销

1.关机、重启

关机

shell 复制代码
#立刻关机
shutdown -h now

#1分钟后关机
shutdown -h 1

#希望在09:35关闭计算机
shutdown -h 9:35

#终止定时关机
shutdown -c

#关机,和shutdown -h now一个作用
halt

重启

sh 复制代码
#现在重新启动计算机
shutdown -r now

#现在重新启动计算机
reboot

把内存的数据同步到磁盘

sh 复制代码
sync

不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中

目前的shutdown/reboot/halt等命令均已经在关机前进行了sync,老韩提醒:小心驶得万年船

2.登录、注销

  • 登录时尽量少用root帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可以利用普通用户登录,登录后再用"su -用户名'命令来切换成系统管理员身份。

  • 在提示符下输入 logout即可注销用户

    logout注销指令在图形运行级别无效,在运行级别3下有效。

3.运行级别 runlevel

选项

0∶系统停机状态,系统默认运行级别不能设置为0,否则不能正常启动

1:单用户【找回丢失密码】,root权限,用户系统维护,禁止远程登录

2:多用户状态没有网络服务

3:多用户状态有网络服务

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

5:图形界面

6:系统正常关闭并重启,默认运行级别不能设置为6,否则不能正常启动

常用的是3和5

命令

init 0
init 1
init 2
init 3
init 4
init 5
init 6

六、目录介绍

linux中一切皆文件

1. 目录结构

  • /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令。
  • /boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。(不要动)
  • /dev : dev是Device(设备)的缩写, 存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
  • **/etc: 这个目录用来存放所有的系统管理所需要的配置文件和子目录。**yum安装的软件会装载此目录
  • /home:用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
  • /lib: 这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。(不要动)
  • /lost+found: 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。(存放突然关机的一些文件)
  • /media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
  • /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。(我们后面会把一些本地文件挂载在这个目录下)
  • **/opt:这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。**安装的第三方文件,比如JDK、Tomcat、Mysql
  • /proc: 这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。(不用管)
  • /root:该目录为系统管理员,也称作超级权限者的用户主目录。
  • /sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
  • /srv:该目录存放一些服务启动之后需要提取的数据。
  • /sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs 。
  • /tmp:这个目录是用来存放一些临时文件的。用完即丢的文件,可以放在这个目录下,安装包!
  • /usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
  • /usr/bin: 系统用户使用的应用程序。
  • /usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序。Super
  • /usr/src: 内核源代码默认的放置目录。
  • /var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
  • /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。
  • /www:存放服务器网站相关的资源,环境,网站的项目

2.文件类型的颜色

文件颜色代表含义

蓝色文件----------表示目录

灰色文件----------表示其他文件

白色文件----------表示一般性文件,如文本文件,配置文件,源码文件等

浅蓝色文件----------表示软链接文件,主要是使用ln -s命令建立的文件

绿色文件----------表示可执行文件,可执行的程序

红色文件-----------表示压缩文件或者包文件

黄色文件-----------表示设备文件

红色闪烁------------表示链接的文件有问题。比如原文件删除后,原文件会闪烁。

Linux下用字符表示的文件类型

-:普通文件
d:目录文件
l:链接文件
b:块设备文件
c:字符设备文件
p:管道文件

七、目录相关命令

1.进入 cd

语法

cd

例子

sh 复制代码
#进入上级目录
cd ..

#进入当前用户主目录
cd ~

#进入上两级目录
cd ../..

#进入当前目录命令
cd .

#进入/usr/local目录
cd /usr/local

2.查看 ls

sh 复制代码
#列出当前目录中所有的子目录和文件(不包含隐藏文件  .开头的)
ls			

#列出目录下的所有的子目录和文件(包含隐藏文件  .开头的)
ls -a       

#列出文件的详细信息(包括权限、所有者、文件大小等) 两种方式
ls -l	
ll

#列出当前目录中所有以"test"开头的详细内容
ls -l test*			

#按文件最后修改时间排序,降序
ls -t		

#按文件大小排序,从大到小
ls -S		

#显示目录
ls -d 		

#查看文件大小时增加可读性(1K 2M 2G) 两种方式
ls -l -h
ll -h

#查询文件inode号(inode存储文件的详细信息) 信息编号,类似于人的身份证号码
ls -i 

#递归按层显示,每层显示完后 显示下一层
ls -R      

#字符文件
ls -c

ls -l 或ll详解

lrwxrwxrwx.   1 root root    7 1月  23 01:01 bin -> usr/bin

drwxr-xr-x.   4 root root   30 1月  25 13:28 home
sh 复制代码
第一栏位:
	-:普通文件
	l:是软链接,类似于windows的快捷方式
	d:是目录,相当于windows的文件夹
	c:是字符设备文件,鼠标,键盘
	b:是块设备,比如硬盘
	rwxrwxrwx:rwx分别代表读、写、执行权限。
			   第1-3位确定所有者(该文件的所有者)拥有该文件的权限。 --user
			   第4-6位确定所属组(同用户组的)拥有该文件的权限。 --group
			   第7-9位确定其他用户拥有该文件的权限。 --other

第二个栏位,表示文件个数。如果是文件的话,那这个数目自然是1了,如果是目录的话,那它的数目就是该目录中的文件个数了。

第三个栏位,表示该文件或目录的拥有者。若使用者目前处于自己的Home,那这一栏大概都是它的账号名称。

第四个栏位,表示所属的组(group)。每一个使用者都可以拥有一个以上的组,不过大部分的使用者应该都只属于一个组,只有当系统管理员希望给予某使用者特殊权限时,才可能会给他另一个组。

第五栏位,表示文件大小。文件大小用byte来表示,而空目录一般都是1024byte,当然可以用其它参数使文件显示的单位不同,如使用ls --k就是用kb莱显示一个文件的大小单位,不过一般我们还是以byte为主。  

第六个栏位,表示最后一次修改时间。以"月,日,时间"的格式表示,如Aug 15 5:46表示8月15日早上5:46分。

第七个栏位,表示文件名。我们可以用ls --a显示隐藏的文件名。
  • pwd

    显示当前工作目录

  • ll 和 ls -l 效果一样

  • --help

3.新建 mkdir

语法

shell 复制代码
mkdir 目录名

选项

shell 复制代码
-p	用于创建多级目录
-m:创建指定权限的目录

例子

sh 复制代码
#新建目录
mkdir dir1

# 从根目录开始创建。在目录//home下创建目录tools   
mkdir  /home/tools    	 

#同时创建3个目录
mkdir dir2 dir3 dir4          	 

#同时创建一个3层目录
mkdir -p dir1/dir2/dir3       

#新建目录dir,并设置所有权限
mkdir -m 777 dir

4.删除 rmdir

语法

shell 复制代码
#删除一个空目录
rmdir  目录名 
shell 复制代码
#递归删除,会出现警告
rm -r  
#强制删除,不会出现警告
rm -f    
#强制删除文件夹,用于删除非空目录
rm -rf
#系统直接全部被删除(勿用)
rm -rf  /*                          

例子

sh 复制代码
#删除/opt目录下的文件a.txt (系统会询问是否删除)
rm /root/a.txt

#强行删除/opt目录下的文件a.txt(直接删除,系统不会提示)
rm -f /root/a.txt

#强行删除/opt/chen/目录下的 polo/文件夹
rm -rf /opt/chen/polo/

#删除/opt/chen/目录下的所有内容
rm -rf /opt/chen/*

5.重命名 mv

在同一目录下mv表示重命名

语法

shell 复制代码
mv 原目录名 新目录名

例子

shell 复制代码
#在同一个目录下为改名
mv test test1

6.拷贝 cp

语法

shell 复制代码
cp -r				拷贝目录必须加  -r    进行递归

选项

sh 复制代码
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的原文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件。

例子

shell 复制代码
#复制文件test.txt到/usr/local目录
cp test.txt /usr/local

#将一个文件夹复制到另一个文件夹下
cp -r /home/packageA /home/packageB

#再次复制文件test.txt到/usr/local目录,强制覆盖
cp -f test.txt /usr/local

#再次复制文件test.txt到/usr/local目录,询问是否强制覆盖
cp -i test.txt /usr/local

#复制文件tests.txt到/usr/local目录,并把修改时间和访问权限也复制
cp -p test.txt /usr/local
shell 复制代码
#将一个文件夹下的所有内容复制到另一个文件夹下
--方法一
cp -r /home/packageA/* /home/cp/packageB/`
--方法二
cp -r /home/packageA/. /home/cp/packageB/`

7.移动 mv

语法

shell 复制代码
mv 

选项

sh 复制代码
-b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
-i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
-f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
-n: 不要覆盖任何已存在的文件或目录。
-u:当原文件比目标文件新或者目标文件不存在时,才执行移动操作。

例子

shell 复制代码
#将dir1移动到home中
mv dir1 /home       

#移动两个目录 f2 f3 到目录 /opt下
mv f2 f3 -t /opt

#当前目录的test.tar.gz 移动到 /usr/local目录,并重命名为testtest.tar.gz
mv test.tar.gz /usr/local/testtest.tar.gz

#移动目录到上级目录
mv f3 ../

#移动f2到/opt下,但/opt已存在f2,会询问是否覆盖
mv f2 -i /opt

#移动f2到/opt下,但/opt已存在f2,强制覆盖
mv f2 -f /opt

8.路径的表示

  1. 相对路径

    ./  表示当前目录
    
    ../ 表示上一级目录
    
    通过../  ./  来代替pwd显示的内容
    
  2. 绝对路径

    /etc/resolv.conf         从根目录开始
    

八、文件相关命令

1.查看

cat

由第一行开始显示文件内容,用来读文章或者读取配置文件

sh 复制代码
#获取test.txt文件所有内容
cat test.txt

#无论是否为空行,都显示行号
cat -n test.txt

#显示行号,除了空行
cat -b test.txt

#连续读取两个文件,按顺序输出
cat test1.txt test2.txt

#倒序输出
--其实就是cat倒过来写即可
tac test.txt

nl

读取的内容显示行号

sh 复制代码
#显示行号,除了空行
--默认就是这个
nl test.txt

#无论是否为空行,都显示行号
nl -b a test.txt

#行号靠最左显示
nl -n ln test.txt

#行号靠最右显示
nl -n rn test.txt

#行号靠最右显示,不足位数左边补0
nl -n rz test.txt

more

  • 一页一页显示内容

语法

more 文件名
sh 复制代码
#向下滚动一屏(3种方法)
z
空格键
ctrl+f

#向上滚动一屏(2种方法)
b
ctrl+b

#查看下一行内容
回车键

#输出文件名和当前行的行号
:f

#退出more模式
q
sh 复制代码
#每次显示5行
more -5 test.txt

#从第5行开始显示
more +5 test.txt

#每次翻页时,先清空屏幕内容
more -5 -p test.txt

#若遇到连续两行以上的空白行,合并为一行空白行
more -s test.txt

less

  • 空格翻页
  • 上下键可以前进和后退
  • 通过q退出

语法

sh 复制代码
less 文件名
sh 复制代码
#显示当前行数的百分比
less -m test.txt

#显示当前行数/总行数和百分比
less -M test.txt

#显示连续空行为一行
less -s test.txt

进入less模式之后的操作

sh 复制代码
g:移动到第一行

G:移动到最后一行

u:向前移动半屏

d:向后移动半屏

f:向后移动指定行数或一屏

b:向前移动指定行数或一屏

j:向下移动一行(↑也可以替代)

k:向上移动一行(↓也可以替代)

q:结束less模式

more和less区别

  • less可以按键盘上下方向键显示上下内容,more不能通过上下方向键控制显示
  • less不必读整个文件,加载速度会比more更快
  • less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容
  • head 用来显示文件开头的内容

  • 默认head命令打印其相应文件的开头10行

参数说明

sh 复制代码
-q 隐藏文件名

-v 显示文件名

-c<字节> 显示字节数

-n<行数> 显示的行数

案例

sh 复制代码
1.默认前10行
head test.log

2.输出文件的头7行(两种方式)
head -n 7 test.log

head 7 test.log

3.输出文件除了最后7行的全部内容
head -n -7 test.log

4.显示文件的前100个字符
head -c 100 test.log

5.显示文件的第10-20行
head -20 test | tail -10

tail

  • tail用来显示文件尾部的内容
  • 使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.

参数说明

shell 复制代码
命令格式: tail[必要参数][选择参数][文件]
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

案例

sh 复制代码
1.默认后10行
tail test.log   

2.查询日志尾部最后10行的日志
tail  -n  10   test.log   

3.从第10行开始显示内容
tail  -n +10   test.log  

4.多用于查看动态内容,不用刷新
tail -f test.log	

5. 循环实时查看最后1000行记录(最常用的)
tail  -fn 1000   test.log  

一般还会配合着grep用,例如 :

js 复制代码
 tail -fn 1000 test.log | grep '关键字'

如果一次性查询的数据量太大,可以进行翻页查看,例如:

js 复制代码
tail -n 4700  aa.log |more -1000 可以进行多屏显示(ctrl + f 或者 空格键可以快捷键)

2.新建

vi

shell 复制代码
--如果文件不存在则新建这个文件,如果文件存在就是修改这个文件
vi 文件名

touch

shell 复制代码
--只新建。可以同时新建多个文件
touch 文件名

#同时创建两个文件
touch test1.txt test2.txt

#批量创建文件(如创建2000个文件)
touch test{0001..2000}.txt

>、>>创建

>		直接覆盖原文件,不会有任何提示

>>		追加在原文件末尾,不会覆盖原文件的内容
  • > 意思是创建,>>是追加
sh 复制代码
#创建文件
> chen.txt

cat

shell 复制代码
--其实用的也是 > 和 >> ,但是有一点不一样的是,敲完上述命令会进入chen.txt的编辑模式,可以直接输入你想要写入的内容,最后按回车键换一行后再ctrl+d退出
cat > chen.txt
cat >> chen.txt

3.删除 rm

语法

shell 复制代码
#force(强制),不进行提示信息的提醒 
rm -f               

#递归删除    针对文件夹
rm -r                 

#删除前逐一询问确认
rm -i               

#删除当前目录下所有文件,强制删除
rm -rf              

4.拷贝 重命名

语法

shell 复制代码
#把hello文件拷贝到/opt/test下
cp -r hello /opt/test                            

#将文件newfile拷贝到opt目录下的dir01中,并重命名为new

cp -r newfile /opt/dir01/new            

#远程拷贝
scp /home/administrator/news.txt root@192.168.6.129:/etc/squid**

/home/administrator/   本地文件的绝对路径
news.txt             要复制到服务器上的本地文件
root                 通过root用户登录到远程服务器(也可以使用其他拥有同等权限的用户)
192.168.6.129        远程服务器的ip地址(也可以使用域名或机器名)
/etc/squid             将本地文件复制到位于远程服务器上的路径

5.移动 重命名

语法

shell 复制代码
#重命名为file_2
mv file_1 file_2                  

#将文件file移动到/home/dir中
mv file  /home/dir                       

#将文件移动到home目录下,并重命名为new
mv newfile  /home/new         

6.链接(面试题)

软连接

  • 类似windows下的快捷方式,删除原文件,快捷方式也访问不了
  • 链接文件内存储的是原文件的inode,也就是说是用来指向原文件,这两个文件的inode是不一样的。可以通过ls -i查看索引节点

语法

ln -s  原文件 目标文件

例子

shell 复制代码
#创建软链接
ln -s f1 f2       把f2 链接到f1

#echo指向文件写入内容
--给f1写入内容,通过cat查找,f2也会显示内容,删除f1,f2不能再用

echo "i love you" >>f1

cat f1
cat f2

#查看索引节点
[root@localhost home]# ls -i
33642041 f1  34353106 f2

特点

  • 类似于windows中的快捷方式
  • 有自己的索引和存储block模块,但是数据块只保存原文件的文件名和i节点号,并没有实际的文件数据。
  • 链接文件中存储的是被链接文件的元信息,路径或者inode节点
  • 原文件添加内容后,软链接里面也会有原文件的内容。但是查找过程会多一个环节,就是软链接里面存的是原文件路径,而不是内容,最后是通过原文件路径去找i节点,再通过i节点去找内容
  • 删除被链接文件(原文件),软连接不能使用
  • 软链接可以链接任何类型的文件,包括目录和设备文件都可以作为被链接的对象

硬链接

  • 硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件

  • A是原文件,B是硬链接,那么他们两个指向了同一个文件!允许一个文件拥有多个路径,用户可以通过这种方式链接到一些重要的文件,防止误删。

语法

shell 复制代码
ln  原文件 目标文件

例子

shell 复制代码
#创建硬链接
ln  f3 f4 

#echo指向文件写入内容
--给f3写入内容,通过cat查找,f4也会显示内容,删除f3,f4还能用

echo "i love you" >>f3

cat f3
cat f4

#查看索引节点
[root@localhost home]# ls -i
34353107 f3  34353107 f4

复制

  • 复制产生的文件是一个独立的文件,有自己的元信息和inode节点

    [root@localhost home]# touch f3
    [root@localhost home]# cp f3 f4
    [root@localhost home]# ls -i
    34353106 f3 34353107 f4

特点

  • 可以看成是同一个文件,多个入口
  • 硬链接的两个文件是独立的两个引用计数文件,他们共用同一份数据,所以他们拥有相同的索引和存储block模块
  • 修改链接文件和被链接文件中的其中一个,另一个都改变
  • 删除硬链接中的任意一个文件,另外一个文件不会被删除。没有任何影响,链接文件一样可以访问,内容和被链接文件一模一样。
  • 不能跨分区
  • 不能针对目录使用
  • 硬链接占用的空间和被链接文件一样大(其实就是同一片空间)
  • 无论修改原文件还是硬链接文件,都是修改同一片区域
  • 硬链接 ≠ 复制。复制相当于将原文件进行一个拷贝,为另一个全新的文件,与原文件没有关系了。修改任何一个都不会影响另一个。

查看索引节点

shell 复制代码
ls -i

ls -li
sh 复制代码
[root@localhost home]# ls -li
总用量 8
34353107 -rw-r--r--. 2 root root 2 3月  30 06:36 f1
34353107 -rw-r--r--. 2 root root 2 3月  30 06:36 f2
[root@localhost home]# ls -i
34353107 f1  34353107 f2
[root@localhost home]#

硬链接和复制区别

  • 复制相当于将原文件进行一个拷贝,为另一个全新的文件,与原文件没有关系了,修改任何一个都不会影响另一个;而硬链接修改链接文件或被链接文件其中一个,另一个都会改变
  • 复制产生的文件是一个独立的文件,有自己的元信息和inode节点
  • 删除或修改复制文件,对原文件不会产生任何影响,反过来也是一样的
  • 复制可以复制文件,也可以复制目录。而硬链接不能针对目录使用

软链接和硬链接区别

  • 创建软链接:ln -s 原文件名 目标文件名;

    创建硬链接:ln 原文件名 目标文件

  • 软链接与原文件有不同的i节点

    硬链接与原文件有相同的i节点

  • 删除原文件后,软链接不可用

    删除原文件后,硬链接可以使用(至少有一个硬链接指向原文件)

  • 创建软连接时,应该指定原文件的绝对路径

九、编辑模式

1.vi

vi 某个文件后进入的是命令模式,输入i会进入到编辑模式,输入冒号会进入到底线命令模式。

步骤:

vi test					进入test文件的名模式

i						vi后键盘按i进入到编辑模式,通过上下键操作

esc:					退出编辑模式,此时切换到命令模式

编辑后按ESC键和冒号后输入wq保存退出,输入q不保存退出

进入vi

sh 复制代码
vi filename               打开或新建文件,并将光标置于第一行首

vi +n filename           打开文件,并将光标置于第 n行首

vi + filename             打开文件,并将光标置于最后一行首

vi -r filename            在上次正用 vi编辑时发生系统崩溃,恢复文件

vi file1....filen            打开多个文件,依次编辑

命令行模式

命令模式 vi/vim+文件名 进入命令模式 不可以输入文字,只能识别命令

a:在光标所在字符后插入
A:在光标所在行尾插入
i:在光标所在字符前插入
I:在光标所在行行首插入
o:在光标下插入新行
O:在光标上插入新行

编辑模式

按i/a/o进入,可以继续输入文字

ESC 返回到命令模式。

底线命令模式

在命令模式下按下:(英文冒号)就进入了底线命令模式。

按ESC键可随时退出底线命令模式。

:wa		保存并退出

:q		退出

:w		保存文本

:q!		强制退出

:n		将光标移到第n行		

:set nu		显示行号

:set nonu	取消行号

/word		向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可!(常用)

?word		向光标之上寻找一个字符串名称为 word 的字符串。

2.vi/vim按键说明

第一部分:一般模式可用的光标移动、复制粘贴、搜索替换等

移动光标的方法
h 或 向左箭头键(←) 光标向左移动一个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
l 或 向右箭头键(→) 光标向右移动一个字符
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕『向下』移动半页
[Ctrl] + [u] 屏幕『向上』移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n< space> 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。
0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 移动到这个档案的最后一行(常用)
nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg 移动到这个档案的第一行,相当于 1G 啊!(常用)
n< Enter> n 为数字。光标向下移动 n 行(常用)
搜索替换
/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可!(常用)
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
删除、复制与粘贴
x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd 删除游标所在的那一整行(常用)
ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d$ 删除游标所在处,到该行的最后一个字符
d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy 复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
y1G 复制游标所在行到第一行的所有数据
yG 复制游标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行!举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢?那么原本的第 20 行会被推到变成 30 行。(常用)
J 将光标所在行与下一行的数据结合成同一行
c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)

第二部分:一般模式切换到编辑模式的可用的按钮说明

进入输入或取代的编辑模式
i, I 进入输入模式(Insert mode):i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。(常用)
a, A 进入输入模式(Insert mode):a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用)
o, O 进入输入模式(Insert mode):这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处输入新的一行』;O 为在目前光标所在处的上一行输入新的一行!(常用)
r, R 进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
[Esc] 退出编辑模式,回到一般模式中(常用)

第三部分:一般模式切换到指令行模式的可用的按钮说明

指令行的储存、离开等指令
:w 将编辑的数据写入硬盘档案中(常用)
:w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
:q 离开 vi (常用)
:q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ 这是大写的 Z 喔!若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开!
:w [filename] 将编辑的数据储存成另一个档案(类似另存新档)
:r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中看 /home 底下以 ls 输出的档案信息!
:set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu 与 set nu 相反,为取消行号!
  • .swp

    (1)临时文件,有时可能阻碍文件的保存,需要删除后,对原文件进行修改和保存

    (2)有时通过ctrl+z 强制退出可能会产生

3.vim

vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。

vim 则可以说是程序开发者的一项很好用的工具。

所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。

连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。

4.vi/vim工作模式

十、查找

1.查找

find

查找文件或目录

语法

shell 复制代码
find [搜索范围] [选项]

选项

shell 复制代码
-name		按照指定的文件名查找
-path   	可以对文件的dir_name、file_name匹配
-type		通过文件类型查找
-mtime  	查找几日之内或几日之前的文件
-mmin 		查找几分钟之内或几分钟之前的文件
-size		按照指定的文件大小查找文件

-a:与,即&&(默认都是与)
-o:或:即||
-not:非,即条件结果取反

-empty		搜索空文件
-user		查找属于指定用户名文件
-group		查找属于指定用户组文件

通过文件名搜索

shell 复制代码
#根据名称查找/home目录下的hello.txt文件
find /home -name hello.txt

#将当前目录及其子目录下所有文件后缀为 .txt 的文件列出来
find . -name "*.txt"

#将/etc及其子目录下所有文件后缀为 .conf 的文件列出来
find /etc -name "*.conf"

#查找/opt/dir目录下的.txt文件
find /opt -path "/*dir*/*.txt"
--在这里是不能使用-name的。因为 -name 是不能使用 / 的,除非文件名包含了 / , 因为 -name 只能匹配 file_name (即文件名),并不匹配 dir_name (即目录名)

通过文件的类型来搜索

sh 复制代码
#在/opt目录下查找所有的目录
find /opt -type d

#在/opt目录下查找所有的文件
find /opt -type f

通过文件的时间搜索

sh 复制代码
#在/opt目录下查找修改时间在5日以内的文件
find /opt -mtime -5

#在/opt目录下查找修改时间在3日以前的文件
find /opt -type f -name "*.txt" -mtime +3

#在/opt目录下查找更改时间在5分钟以内的.txt文件
find /opt -type f -name "*.txt" -mmin -5

#在/opt目录下查找修改时间在10分钟以前的文件
find /opt -mmin +10

注意:

  • 无论是 -mtime +5 还是 -mtime -5 ,第五天内修改过的文件都不会被搜索出来,可看下图

通过文件的大小来搜索

b:512字节的块**(默认)**,1b = 512c

c:bytes,指定字节大小

w:等价于两个bytes,1w=2c,一般用户匹配中文

k:平时常说的1kb,1k=1024c=2b

M:1MB,1M=1024k=2048b

G:1GB,1GB=1024MB=2048*1024b

+n		大于
-n		小于
n		等于
sh 复制代码
#在~/test目录下查找所有size=0字节的文件
find ~/test -size 0
 

#在~/test目录下查找所有size<100k的文件
find ~/test -size -100k
 

#在~/test目录下查找所有size>1MB的文件
find ~/test -size +1M

通过编程中的"与、或、非"来搜索

  • -a:与,即&&(默认都是与)
  • -o:或:即||
  • -not:非,即条件结果取反
sh 复制代码
#在~/test目录下查找文件大小在1kb和10kb内的所有文件
find ~/test -size +1k -size -10k
find ~/test -size +1k -a -size -10k
 

#在~/test目录下查找大于1kb或类型为普通文件的文件
find ~/test -size +1k -o -type f
 

#在~/test目录下查找非空文件
find ~/test -not -size 0
 

#在~/test目录下查找文件或目录
find ~/test -type f -o -type d

搜索空文件

sh 复制代码
find ~/test -empty -type f

通过文件所属用户搜索

sh 复制代码
find ~/test -user root

通过文件所属组group搜索

sh 复制代码
find ~/test -group root

which

查找某个指令的路径

shell 复制代码
#查找ls命令的位置
which ls

2.搜索

grep

在文件中查找字符串

  • 常常和管道符 | 结合使用
  • grep过滤查找,管道符 "|",表示将前一个命令的处理结果输出传递给后面的命令处理

语法

shell 复制代码
grep [选项] 查找内容 原文件

grep的常用选项参数

shell 复制代码
-G	默认值
-F	相当于使用fgrep,但必须用 -F
-E	相当于使用egrep,但必须用 -E。匹配多个条件使用
-V	打印 grep 的版本号
sh 复制代码
#查找f1和dir文件
ls  | grep -E "f1|dir"

匹配控制选项参数

sh 复制代码
-n		显示匹配行及行号
-e		当你有多个正则表达式想同时匹配时,可以用 -e,一个 -e 接一个正则表达式,它们是或的关系,不是与的关系
-i		忽略首字母大小写
-v		反转匹配,选择没有被匹配到的内容
-w		匹配整词,精确的单词,单词的两边必须是非字符符号(即不能是字母数字或下划线)
-x		精确匹配。仅选择与整行完全匹配的匹配项
sh 复制代码
#查找含f或d的文件
ls | grep -e f -e d

#查找dir文件,忽略首字母大写。意思就是大小写都显示
ls | grep -i dir
--结果:
dir
DIR

#包含dir的文件都不显示
ls | grep -v dir

#查找jj.txt。只输入一个j是匹配不出来的
ls | grep -w jj

#查找jj.txt。与-w相比,-x必须输入整个文件名
ls | grep -x jj.txt

一般输出控制选项

sh 复制代码
-s			禁止显示错误信息
-q			安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0
-m num		匹配 num 次后停止
-c			匹配成功数量
-l			列出匹配成功结果的文件来源(标准输入或文件名称)
-H			给每一个匹配结果打印来源(标准输入、文件名)
sh 复制代码
#匹配d开头文件3次
ls | grep -m 3 d

#匹配dir文件的数量
ls | grep -c dir

输出控制参数讲解

sh 复制代码
-b	输出的同时打印字节偏移
-n	输出的同时打印行号
-H	给每一个匹配结果打印来源(标准输入、文件名)
-h	输出是不显示来源(默认)
-o	只显示匹配 PATTERN 的部分
sh 复制代码
#显示匹配的dir同时显示行号
ls | grep -n dir

上下文线控制选项

sh 复制代码
-A num	匹配到搜索到的行以及该行下面的num行
-B num	匹配到搜索到的行以及该行上面的num行
-C num	匹配到搜索到的行以及上下各num行
sh 复制代码
#显示dir3及下面的2行
ls | grep -A 2 dir3

#显示dir3及上面的2行
ls | grep -B 2 dir3

#显示dir3及上下的2行
ls | grep -C 2 dir3

文件和目录选项

sh 复制代码
-a		不忽略二进制的数据
-d		当要查找的是目录而非文件时,必须使用这项参数
-r		以递归方式读取每个目录下的所有文件; 这相当于-d recurse选项。

常用语法

写的正则表达式最好用 ""包起来,当碰到需要转义符的时候才会生效

sh 复制代码
#查找/opt/dir下.txt文件
ls /opt/dir | grep ".txt"

#查找指定进程
ps -ef | grep "java"

#查找指定进程并统计数量
ps -ef | grep -c "java"

#从文件中查找关键字
grep "b" jj.txt

#从文件中查找关键字并输出它的行号
grep -n "b" jj.txt

#从多个文件中查找关键字
grep "b" jj.txt bb.txt

#查找jj.txt文件中的"b"
cat jj.txt | grep "b"

#查找jj.txt文件中的"b",并显示行号
cat jj.txt | grep -n "b"

#从文件中查找关键字后,再从结果中找到指定关键字
cat jj.txt | grep "s" | grep "b"

#找出文件中的空白行
grep -n ^$ jj.txt

3.查看历史指令

选项

sh 复制代码
-c		清除历史记录
-w		将目前的 history 记忆内容写入 histfiles

例子

shell 复制代码
#查看所有历史指令
history

#查看命令mkdir 的历史执行记录
history | grep mkdir 

#查看最近使用的10个指令(两种方式)
history 10
history | tail -10

#执行历史记录中,序号为5的命令 
!5

#执行上一条命令(直接输入两个感叹号)
!!

#清除历史记录
history -c

#将当前所有历史记录写入历史文件中,默认写入 ~/.bash_history 
history -w

cat ~/.bash_history#查看写入的历史记录

十一、Linux中三种时间

1.分类

  • atime
  • ctime
  • mtime
简名 全名 中文 作用
atime Access Time 访问时间 最后一次访问文件(读取或执行)的时间
ctime Change Time 变化时间 最后一次改变文件(属性或权限)或者目录(属性或权限)的时间
mtime Modify Time 修改时间 最后一次修改文件(内容)或者目录(内容)的时间

2.如何查看atime、ctime、mtime

stat filename

3.什么命令会修改atime、ctime、mtime

N表示没改变,Y表示改变了

命令 atime mtime ctime
mv N N Y
cp Y N N
chmod N N Y
chown N N Y
touch Y Y Y
>、>> Y Y Y
vim、vi(不修改文件的内容) Y N N
vim、vi(修改文件中的内容) Y Y Y
./test.sh Y N N

为什么修改内容,三个时间都会变呢?

因为对文件编辑之后,不仅访问了文件(改变了atime),还增删了内容,这个文件的大小等状态也发生了变化,所以mtime、ctime变化也很正常

mv

不管是重命名还是移动结果都一样

cp

执行.sh文件

注意!貌似只有第一次执行的时候会更新atime哦!

十二、权限的操作

  • 为了管理多用户在对资源使用时的各自的操作的类型和范围

  • 通过分组将不同的权限分不到不同的组中,再通过用户不同组的归属,进行权限的分配和管理

  • 用户------->组---------->组各自的权限

1.用户的管理

创建用户 useradd

用户账号的管理工作主要涉及到用户账号的添加、修改和删除。

添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。

语法

shell 复制代码
useradd 选项 用户名

细节说明

创建用户后,默认该用户的家目录在/home/用户名

选项

shell 复制代码
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录。
-G 	指定用户的附加组。我们把用户加入其他组,一般都使用附加组。
-m 使用者目录如不存在则自动建立。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

例子

shell 复制代码
# 此命令创建了一个用户kuangshen,其中-m选项用来为登录名kuangshen产生一个主目录 /home/kuangshen
useradd -m kuangshen



--增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。

删除用户 userdel

  • 如果一个用户的账号不再使用,可以从系统中删除。
  • 删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

语法

shell 复制代码
userdel 选项 用户名

选项

shell 复制代码
-r 它的作用是把用户的主目录一起删除。

例子

shell 复制代码
#删除保留家目录
userdel kuangshen

#同时删除用户的家目录。
--慎重选择,如果要保留资料,那么就普通删除
userdel -r kuangshen

修改用户 usermod

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。

语法

shell 复制代码
usermod 选项 用户名

选项

shell 复制代码
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录。
-G 	指定用户的附加组。我们把用户加入其他组,一般都使用附加组。
-m 使用者目录如不存在则自动建立。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

例子

shell 复制代码
#修改用户zwj所在组为wudang
usermod -g wudang zwj

#将qinqiang的主目录改为/home/233
usermod -d /home/233 qinqiang

#此命令将用户kuangshen的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。
usermod -s /bin/ksh -d /home/z --g developer kuangshen

添加用户到附属组

sh 复制代码
#添加chen到附属组dj
usermod -G dj chen

#查看dj组是否有用户chen
cat /etc/group

切换用户 su

语法

shell 复制代码
su 用户名

例子

shell 复制代码
#切换到kuangshen用户
su kuangshen

#切回root用户
su root		需要输入root密码

#回到原来用户
在终端输入exit或logout或使用快捷方式ctrl+d,可以退回到原来用户,其实ctrl+d也是执行的exit命令

用户密码设置 passwd

  • 一般通过root创建用户的时候!要配置密码
  • 用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
  • 指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。

语法

shell 复制代码
passwd 选项 用户名

选项

shell 复制代码
-l 锁定账户密码
-u 解锁账户密码
-d 删除密码
-f 强迫用户下次登录时修改口令。

例子

普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。

shell 复制代码
#当前用户修改密码
passwd

#超级用户修改密码
passwd kuangshen
shell 复制代码
#为用户指定空口令时,执行下列形式的命令:
passwd -d kuangshen

#passwd 命令还可以用 -l(lock) 选项锁定某一用户,使其不能登录,例如:
passwd -l kuangshen

锁定账户 passwd

root,比如张三辞职了!冻结这个账号,一旦冻结,这个人就登录不上系统了!

shell 复制代码
# 锁定之后这个用户就不能登录了!
passwd -l qinjiang 

# 没有密码也不能登录!
passwd -d qinjiang 

显示用户id、所属组id

id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。

shell 复制代码
#显示当前用户id
id

#查看fox所属的组
id fox

显示当前用户所在目录

pwd

显示当前用户

shell 复制代码
whoami

who am i

2.用户组的管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理(开发、测试、运维、root)。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

创建用户组 groupadd

语法

shell 复制代码
groupadd 选项 用户组

选项

shell 复制代码
-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

例子

shell 复制代码
#此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。
groupadd group1

#此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。如果不指定会自增1
groupadd -g 101 group2

增加用户并指定组 useradd

shell 复制代码
useradd -g 用户组 用户名
sh 复制代码
#先创建组
groupadd dj  

#新建用户cx,指定到dj组
--如果没有指定值,会默认生成一个跟用户名相同的组
useradd -g dj cx

删除用户组 groupdel

语法

groupdel 用户组

例子

shell 复制代码
#此命令从系统中删除组group1。
groupdel group1

修改用户组 groupmod

语法

groupmod 选项 用户组

选项

shell 复制代码
-g GID 为用户组指定新的组标识号。

-o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。

-n新用户组 将用户组的名字改为新名字

例子

shell 复制代码
#创建一个新组
groupmod dj2

#将用户cx的组改为dj2
groupmod -g dj2 cx

切换用户组

如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。

shell 复制代码
#这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。

$ newgrp root			$b表示普通用户,#表示超级用户

查看用户和组

cat /etc/passwd

  • 用户的配置文件,记录中用户的各种信息

  • 这个文件的每一行都代表着每一个用户,我们可以从这里看出这个用户的主目录在哪里,可以看到属于哪一个组

    chenxin:x:1001:0::/home/chenxin:/bin/bash
    
    用户名:口令:用户id(UID):组id(GID):描述性信息:主目录:默认Shell
    
    "x" 表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中
    

cat /etc/group

用户组的所有信息都存放在/etc/group文件中。

此文件是记录组 ID(GID)和组名相对应的文件。前面讲过,etc/passwd 文件中每行用户信息的第四个字段记录的是用户的初始组 ID,那么,此 GID 的组名到底是什么呢?就要从 /etc/group 文件中查找。

cat /etc/group

root:x:0:root,linuxsir

组名:口令:组id(GID):该用户组中的用户列表

这里的 "x" 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。
  • cat /etc/shadow

    口令的配置文件

3.文件的权限和归属

1. 查看文件/目录所有者

一般为文件的创建者,谁创了该文件,就自然的成为该文件的所有者。

查看文件的所有者

ls -l 或者 ll

第1个root代表用户名,第2个代表组名

2. rwx权限详解

"可读"表示能够读取目录内的文件列表;

"可写"表示能够在目录内新增、删除、重命名文件;

"可执行"则表示能够进入该目录。

文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1 来表示,文件所有者,所属组及其他用户权限之间无关联

文件所有者 文件所属组 其他用户
执行 执行 执行
字符表示 r w x r w x r w x
数字表示 4 2 1 4 2 1 4 2 1

文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。例如,若某个文件的权限为7 则代表可读、可写、可执行(4+2+1);若权限为6 则代表可读、可写(4+2)。我们来看这样一个例子。现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r--,数字法表示即为764。不过大家千万再将这三个数字相加,计算出7+6+4=17 的结果,这是小学的数学加减法,不是Linux 系统的权限数字表示法,三者之间没有互通关系。Linux 系统的文件权限相当复杂,但是用途很广泛,建议大家把它彻底搞清楚之后再学习下一节的内容。现在来练习一下。请各位读者分别计算数字表示法764、642、153、731 所对应的字符表示法,然后再把rwxrw-r--、rw--w--wx、rw-r--r--转换成数字表示法。

3. ls -l显示内容说明

案例

lrwxrwxrwx.   1 root root    7 1月  23 01:01 bin -> usr/bin

drwxr-xr-x.   4 root root   30 1月  25 13:28 home

说明

sh 复制代码
第一栏位:
	-:普通文件
	l:是软链接,类似于windows的快捷方式
	d:是目录,相当于windows的文件夹
	c:是字符设备文件,鼠标,键盘
	b:是块设备,比如硬盘
	rwxrwxrwx:rwx分别代表读、写、执行权限。
			   第1-3位确定所有者(该文件的所有者)拥有该文件的权限。 --user
			   第4-6位确定所属组(同用户组的)拥有该文件的权限。 --group
			   第7-9位确定其他用户拥有该文件的权限。 --other

第二个栏位,表示文件个数。如果是文件的话,那这个数目自然是1了,如果是目录的话,那它的数目就是该目录中的文件个数了。

第三个栏位,表示该文件或目录的拥有者。若使用者目前处于自己的Home,那这一栏大概都是它的账号名称。

第四个栏位,表示所属的组(group)。每一个使用者都可以拥有一个以上的组,不过大部分的使用者应该都只属于一个组,只有当系统管理员希望给予某使用者特殊权限时,才可能会给他另一个组。

第五栏位,表示文件大小。文件大小用byte来表示,而空目录一般都是1024byte,当然可以用其它参数使文件显示的单位不同,如使用ls --k就是用kb莱显示一个文件的大小单位,不过一般我们还是以byte为主。  

第六个栏位,表示最后一次修改时间。以"月,日,时间"的格式表示,如Aug 15 5:46表示8月15日早上5:46分。

第七个栏位,表示文件名。我们可以用ls --a显示隐藏的文件名。

4. 修改权限

权限说明

前三位代表文件所有者的权限(u表示)

中间三位代表文件所在组的权限(g表示)

后三位代表其他组的权限(o表示)

所有人(a表示。u、g、o的总和)

方式一字符修改

+、-、=变更权限

  • +:增加权限
  • -:取消权限
  • =:设定权限
shell 复制代码
chmod u=rwx,g=rx,o=x 文件/目录名

chmod o+w 文件/目录名

chmod a-x 文件/目录名
sh 复制代码
1.给abc文件的所有者读写执行的权限,给所在组读执行权限,给其他组读执行权限
chmod u=rwx,g=rx,o=rx abc

2.给abc文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w abc

3.给abc文件的所有者、所在组、其他组同时添加读的权限
chmod a+r abc
方式二数字修改
sh 复制代码
#给这个文件所有权限
chmod 777 文件/目录名

#给所有者所有权限,所属组读执行权限,其他组执行权限
chmod 751 文件/目录名
shell 复制代码
#将home/abc.txt文件的权限修改成 rwxr-xr-x,使用数字的方式实现
chmod 755 home/abc.txt

5. 修改文件所有者

语法

chown

例子

shell 复制代码
#将hell.taxt的文件所有者改为mary
chown mary hell.txt        

#将目录/opt/test的所有者改为mary  
chown mary /opt/test     
     
#将目录/opt/test及其所有子目录及文件的所有者改为mary  
chown -R  mary /opt/test

6. 修改文件所属组

语法

chgrp

例子

shell 复制代码
#将hell.taxt的文件所在的组改为mary
chgrp mary hell.txt        

#将目录/opt/test的所在的组改为mary  
chgrp mary /opt/test     
     
#将目录/opt/test及其所有子目录及文件的所在的组改为mary    
chgrp -R  mary /opt/test  

7.其他组

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

修改用户所在组

语法

shell 复制代码
usermod -g 新组名 用户名

usermod -d 目录名 用户名 改变该用户登录的初始目录	#需用需要有进入新目录的权限,否则报错

例子

shell 复制代码
#修改用户zwj所在组为wudang
usermod -g wudang zwj

十三、磁盘管理

1.df

df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

语法

shell 复制代码
df [-ahikHTm] [目录或文件名]

选项

shell 复制代码
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i :不用硬盘容量,而以 inode 的数量来显示

例子

shell 复制代码
# 将系统内所有的文件系统列出来!
--在 Linux 底下如果 df 没有加任何选项
--那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来!

df

文件系统                  1K-块    已用    可用 已用% 挂载点
/dev/mapper/centos-root 8374272 1062120 7312152   13% /
devtmpfs                 485780       0  485780    0% /dev
tmpfs                    497948       0  497948    0% /dev/shm
tmpfs                    497948    7860  490088    2% /run
tmpfs                    497948       0  497948    0% /sys/fs/cgroup
/dev/sdb1               1014680    2564  943356    1% /newdisk
/dev/sda1               1038336  135380  902956   14% /boot
tmpfs                     99592       0   99592    0% /run/user/0
shell 复制代码
# 将容量结果以易读的容量格式显示出来
df -h

文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root  8.0G  1.1G  7.0G   13% /
devtmpfs                 475M     0  475M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  7.7M  479M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/sdb1                991M  2.6M  922M    1% /newdisk
/dev/sda1               1014M  133M  882M   14% /boot
tmpfs                     98M     0   98M    0% /run/user/0
shell 复制代码
# 将系统内的所有特殊文件格式及名称都列出来
df -aT

文件系统                类型         1K-块    已用    可用 已用% 挂载点
rootfs                  -                -       -       -     - /
sysfs                   sysfs            0       0       0     - /sys
proc                    proc             0       0       0     - /proc
devtmpfs                devtmpfs    485780       0  485780    0% /dev
securityfs              securityfs       0       0       0     - /sys/kernel/security
tmpfs                   tmpfs       497948       0  497948    0% /dev/shm
devpts                  devpts           0       0       0     - /dev/pts
tmpfs                   tmpfs       497948    7860  490088    2% /run
tmpfs                   tmpfs       497948       0  497948    0% /sys/fs/cgroup
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/systemd
pstore                  pstore           0       0       0     - /sys/fs/pstore
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/devices
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/net_cls,net_prio
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/pids
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/memory
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/cpuset
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/cpu,cpuacct
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/blkio
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/hugetlb
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/perf_event
cgroup                  cgroup           0       0       0     - /sys/fs/cgroup/freezer
configfs                configfs         0       0       0     - /sys/kernel/config
/dev/mapper/centos-root xfs        8374272 1062120 7312152   13% /
selinuxfs               selinuxfs        0       0       0     - /sys/fs/selinux
systemd-1               autofs           0       0       0     - /proc/sys/fs/binfmt_misc
debugfs                 debugfs          0       0       0     - /sys/kernel/debug
mqueue                  mqueue           0       0       0     - /dev/mqueue
hugetlbfs               hugetlbfs        0       0       0     - /dev/hugepages
/dev/sdb1               ext4       1014680    2564  943356    1% /newdisk
/dev/sda1               xfs        1038336  135380  902956   14% /boot
tmpfs                   tmpfs        99592       0   99592    0% /run/user/0
shell 复制代码
# 将 /etc 底下的可用的磁盘容量以易读的容量格式显示
df -h /etc

文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root  8.0G  1.1G  7.0G   13% /

2.du

Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍Linux du命令。

与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据。

语法

shell 复制代码
du [-ahskm] 文件或目录名称

选项

shell 复制代码
-a :显示所有目录或文件的大小
-h :以K,M,G为单位,提高信息可读性
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以1024 bytes为单位。列出容量显示;
-m :以1MB为单位。列出容量显示;
--max-depth=1 表示只深入到第1层目录,此处设置为0,即表示不深入到子目录。

例子

shell 复制代码
# 只列出当前目录下的所有文件夹容量(包括隐藏文件夹):
--直接输入 du 没有加任何选项时,则 du 会分析当前所在目录的文件与目录所占用的硬盘空间。

du

16./redis
8./www/.oracle_jre_usage  # 包括隐藏文件的目录
24./www
48.                        # 这个目录(.)所占用的总量
shell 复制代码
# 将文件的容量也列出来
du -a

4./redis/.bash_profile
4./redis/.bash_logout    
....中间省略....
4./kuangstudy.txt # 有文件的列表了
48.
shell 复制代码
# 检查根目录底下每个目录所占用的容量
--通配符 * 来代表每个目录。
du -sm /*

0/bin
146/boot
.....中间省略....
0/proc
.....中间省略....
1/tmp
3026/usr  # 系统初期最大就是他了啦!
513/var
2666/www
sh 复制代码
#流出opt目录,深度为1
du -h --max-depth=1 /opt

3. 查看所有设备及挂载情况

lsblk用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。

语法

lsblk

选项

shell 复制代码
-a, --all            显示所有设备。
-b, --bytes          以bytes方式显示设备大小。
-d, --nodeps         不显示 slaves 或 holders。
-D, --discard        print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs             显示文件系统信息。
-h, --help           显示帮助信息。
-i, --ascii          use ascii characters only。
-m, --perms          显示权限信息。
-l, --list           使用列表格式显示。
-n, --noheadings     不显示标题。
-o, --output <list>  输出列。
-P, --pairs          使用key="value"格式显示。
-r, --raw            使用原始格式显示。
-t, --topology       显示拓扑结构信息。-a, --all            显示所有设备。
-b, --bytes          以bytes方式显示设备大小。
-d, --nodeps         不显示 slaves 或 holders。
-D, --discard        print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs             显示文件系统信息。
-h, --help           显示帮助信息。
-i, --ascii          use ascii characters only。
-m, --perms          显示权限信息。
-l, --list           使用列表格式显示。
-n, --noheadings     不显示标题。
-o, --output <list>  输出列。
-P, --pairs          使用key="value"格式显示。
-r, --raw            使用原始格式显示。
-t, --topology       显示拓扑结构信息。

例子

sh 复制代码
1.lsblk

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   10G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0    9G  0 part
  ├─centos-root 253:0    0    8G  0 lvm  /
  └─centos-swap 253:1    0    1G  0 lvm  [SWAP]
sr0              11:0    1  4.3G  0 rom


NAME :这是块设备名。
MAJ:MIN :本栏显示主要和次要设备号。
RM :本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
SIZE :本栏列出设备的容量大小信息。例如10G表明该设备大小为10G,而1K表明该设备大小为1KB。
RO :该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
MOUNTPOINT :本栏指出设备挂载的挂载点。
sh 复制代码
2.lsblk -f

NAME            FSTYPE      LABEL           UUID                                   MOUNTPOINT
sda
├─sda1          xfs                         248990cf-cffe-4b3f-ac4e-d2ee25459d01   /boot
└─sda2          LVM2_member                 Zl2Twp-gutn-oVHF-fCqn-YPRj-1vp4-KllWxh
  ├─centos-root xfs                         ef6483e7-9209-4f5d-9f53-5ed246ca47c4   /
  └─centos-swap swap                        d428d502-3119-4529-ab5a-f55588f1b98b   [SWAP]
sr0             iso9660     CentOS 7 x86_64 2018-11-25-23-54-16-00

4.分区

语法

fdisk [必要参数][选择参数]

选项

sh 复制代码
1.必要参数:

-l 列出素所有分区表
-u 与"-l"搭配使用,显示分区数目

2.选择参数:
-s<分区编号> 指定分区
-v 版本信息

3.选项
m :显示菜单和帮助信息
a :活动分区标记/引导分区
d :删除分区
l :显示分区类型
n :新建分区
p :显示分区信息
q :退出不保存
t :设置分区号
v :进行分区检查
w :保存修改
x :扩展应用,高级功能

查看设备。下面的sdb是之前在虚拟机手动添加的硬盘,目的是练习分区、格式化、挂载、永久挂载命令

sh 复制代码
lsblk

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   10G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0    9G  0 part
  ├─centos-root 253:0    0    8G  0 lvm  /
  └─centos-swap 253:1    0    1G  0 lvm  [SWAP]
sdb               8:16   0    1G  0 disk
sr0              11:0    1  4.3G  0 rom

新建分区

1.命令行输入,弹出以下内容

sh 复制代码
[root@localhost ~]#fdisk /dev/sdb
sh 复制代码
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x2f2536bd 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):

2.输入m,弹出以下内容

m
sh 复制代码
命令操作
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

3.选择n新建分区,弹出以下内容

n
sh 复制代码
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended

4.选择p,弹出以下内容

p

#如果选择1增加1个分区,如果2就是增加2个分区
分区号 (1-4,默认 1):

5.选择1,弹出以下内容

起始 扇区 (2048-2097151,默认为 2048):

6.回车,弹出以下内容

Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):

7.回车,弹出以下内容

命令(输入 m 获取帮助):

8.输入w写入分区并退出,若不保存输入q

5.磁盘格式化

查看设备

sh 复制代码
lsblk -f
sh 复制代码
NAME            FSTYPE      LABEL           UUID                                   MOUNTPOINT
sda
├─sda1          xfs                         248990cf-cffe-4b3f-ac4e-d2ee25459d01   /boot
└─sda2          LVM2_member                 Zl2Twp-gutn-oVHF-fCqn-YPRj-1vp4-KllWxh
  ├─centos-root xfs                         ef6483e7-9209-4f5d-9f53-5ed246ca47c4   /
  └─centos-swap swap                        d428d502-3119-4529-ab5a-f55588f1b98b   [SWAP]
sdb
└─sdb1
sr0             iso9660     CentOS 7 x86_64 2018-11-25-23-54-16-00

语法

mkfs

选项

sh 复制代码
-t 文件系统格式:用于指定格式化的文件系统,如 ext3、ext4;

例子

sh 复制代码
#将sdb1格式化
mkfs -t  ext4 /dev/sdb1

再次查看设备,sdb1出现了UUID,说明这块分区已经格式化了

sh 复制代码
lsblk -f
sh 复制代码
NAME            FSTYPE      LABEL           UUID                                   MOUNTPOINT
sda
├─sda1          xfs                         248990cf-cffe-4b3f-ac4e-d2ee25459d01   /boot
└─sda2          LVM2_member                 Zl2Twp-gutn-oVHF-fCqn-YPRj-1vp4-KllWxh
  ├─centos-root xfs                         ef6483e7-9209-4f5d-9f53-5ed246ca47c4   /
  └─centos-swap swap                        d428d502-3119-4529-ab5a-f55588f1b98b   [SWAP]
sdb
└─sdb1          ext4                        be5c9b0e-57d3-4574-ba58-5431a14b3a63
sr0             iso9660     CentOS 7 x86_64 2018-11-25-23-54-16-00

6.磁盘挂载与卸除

挂载

指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。

纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。

前面讲过,根目录下的 /dev/ 目录文件负责所有的硬件设备文件,事实上,当 U 盘插入 Linux 后,系统也确实会给 U 盘分配一个目录文件(比如 sdb1),就位于 /dev/ 目录下(/dev/sdb1),但无法通过 /dev/sdb1/ 直接访问 U 盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。

总之,Linux 系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。

注意:用命令行挂载重启后会失效

语法

mount

例子

shell 复制代码
1.根目录,新建newdisk。
--挂载的地方一定非要在根目录,也可以在root,也可以在home目录下
[root@localhost /]# mkdir newdisk

2.将sdb1挂载到newdisk
mount /dev/sdb1 /newdisk

查看设备。sdb1后面多了一个挂载点

lsblk -f

NAME            FSTYPE      LABEL           UUID                                   MOUNTPOINT
sda
├─sda1          xfs                         248990cf-cffe-4b3f-ac4e-d2ee25459d01   /boot
└─sda2          LVM2_member                 Zl2Twp-gutn-oVHF-fCqn-YPRj-1vp4-KllWxh
  ├─centos-root xfs                         ef6483e7-9209-4f5d-9f53-5ed246ca47c4   /
  └─centos-swap swap                        d428d502-3119-4529-ab5a-f55588f1b98b   [SWAP]
sdb
└─sdb1          ext4                        be5c9b0e-57d3-4574-ba58-5431a14b3a63   /newdisk
sr0             iso9660     CentOS 7 x86_64 2018-11-25-23-54-16-00

永久挂载(自动挂载)

通过修改/etc/fstab实现永久挂载,添加完成后执行mount -a即可生效

sh 复制代码
1.进入fstab

vi /etc/fstab

2.添加挂载信息
方法一:通过名字直接写
/dev/sdb1                                       /newdisk                ext4    defaults        0 0

方法二通过UUID
UUID=be5c9b0e-57d3-4574-ba58-5431a14b3a63		/newdisk                ext4    defaults        0 0

重启后,查看设备挂载并没有消失

sh 复制代码
NAME            FSTYPE      LABEL           UUID                                   MOUNTPOINT
sda
├─sda1          xfs                         248990cf-cffe-4b3f-ac4e-d2ee25459d01   /boot
└─sda2          LVM2_member                 Zl2Twp-gutn-oVHF-fCqn-YPRj-1vp4-KllWxh
  ├─centos-root xfs                         ef6483e7-9209-4f5d-9f53-5ed246ca47c4   /
  └─centos-swap swap                        d428d502-3119-4529-ab5a-f55588f1b98b   [SWAP]
sdb
└─sdb1          ext4                        be5c9b0e-57d3-4574-ba58-5431a14b3a63   /newdisk
sr0             iso9660     CentOS 7 x86_64 2018-11-25-23-54-16-00

卸载

语法

umount 设备名称 或者挂载目录

umount /dev/sdb1	或者umount /newdisk

选项

shell 复制代码
选项:
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-n :不升级 /etc/mtab 情况下卸除。

例子

shell 复制代码
umount /dev/sdb1

查看设备。会发现sdb1后面的挂载点没有了

lsblk -f

NAME            FSTYPE      LABEL           UUID                                   MOUNTPOINT
sda
├─sda1          xfs                         248990cf-cffe-4b3f-ac4e-d2ee25459d01   /boot
└─sda2          LVM2_member                 Zl2Twp-gutn-oVHF-fCqn-YPRj-1vp4-KllWxh
  ├─centos-root xfs                         ef6483e7-9209-4f5d-9f53-5ed246ca47c4   /
  └─centos-swap swap                        d428d502-3119-4529-ab5a-f55588f1b98b   [SWAP]
sdb
└─sdb1          ext4                        be5c9b0e-57d3-4574-ba58-5431a14b3a63
sr0             iso9660     CentOS 7 x86_64 2018-11-25-23-54-16-00

7.磁盘实用指令

1.统计文件夹下文件的个数

shell 复制代码
#统计etc下文件的个数
ls -l /etc | grep "^-" | wc -l

2.统计文件夹下目录的个数

sh 复制代码
#统计etc下目录的个数
ls -l /etc | grep "^d" | wc -l

3.统计文件夹下文件的个数,包括子文件夹里的

sh 复制代码
ls -lR /etc | grep "^-" | wc -l

4.统计文件夹下目录的个数,包括子文件夹里的

sh 复制代码
ls -lR /etc | grep "^d" | wc -l

5.以树状显示目录结构

sh 复制代码
1.安装tree
yum install tree

2.显示tmp
tree /tmp

/tmp/
├── systemd-private-6aabace300d647608d7f97fd4ca60046-chronyd.service-q3Lgjw
│   └── tmp
├── vmware-root_5964-726237471
├── vmware-root_5999-1681333115
├── vmware-root_6017-1715412458
└── vmware-root_6028-726237631

6 directories, 0 files

十四、进程管理

Linux中一切皆文件

(文件:读写执行(查看,创建,删除,移动,复制,编辑),权限(用户、用户组)。系统:(磁盘,进程))

对于我们开发人员来说,其实Linux更多偏向于使用即可!

基本概念

1、在Linux中,每一个程序都是有自己的一个进程,每一个进程都有一个id号!

2、每一个进程呢,都会有一个父进程!

3、进程可以有两种存在方式:前台!后台运行!

4、一般系统的服务都是后台运行的,而且都会常驻在系统中,只有关机才会结束。基本的程序都是前台运行的!

查看进程 ps

选项

shell 复制代码
-a 显示当前终端运行的所有的进程信息(当前的进程一个)
-u 以用户的信息显示进程
-x 显示后台运行进程的参数!

查看所有进程

shell 复制代码
ps -A

查看特定的进程。java进程。父进程id是7807

sh 复制代码
ps -ef | grep java

结果显示:
root       8104   7807  0 14:05 pts/1    00:00:00 grep --color=auto java

显示所有进程信息,连同命令行

sh 复制代码
ps -ef

--结果显示:
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 10:12 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 10:12 ?        00:00:00 [kthreadd]
root          3      2  0 10:12 ?        00:00:00 [ksoftirqd/0]
root          5      2  0 10:12 ?        00:00:00 [kworker/0:0H]
--字段含义
UID:表示用户ID
PID:表示进程ID
PPID:表示父进程号
C:表示CPU的占用率
STIME:进程的启动时间
TTY:登入者的终端机位置
TIME:表示进程执行起到现在总的CPU占用时间
CMD:表示启动这个进程的命令

显示所有进程更详细的信息,包括进程占用CPU、内存

sh 复制代码
ps -aux|grep sshd

--结果显示:
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.6 127980  6544 ?        Ss   10:12   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    10:12   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    10:12   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   10:12   0:00 [kworker/0:0H]
--字段含义:
USER:表示哪个用户启动了这个进程
PID :进程ID
%CPU:进程CPU的占用率
%MEM:进程物理内存的占用率
VSZ :进程占用的虚拟内存量 (Kbytes)
RSS :进程当前实际上占用了多少内存
TTY :进程是在哪个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
  R :运行;该程序目前正在运作,或者是可被运作
  D:不可中断:一般是IO进程
  S :中断;该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
  T :停止:该程序目前正在侦测或者是停止了
  Z :僵尸:该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (僵尸) 程序的状态
START:该进程启动的时间点
TIME :进程从启动后到现在,实际占用CPU的总时间
COMMAND:启动该进程的命令

根据CPU、内存使用来降序排序

sh 复制代码
ps -aux --sort -pcpu

ps -aux --sort -pmem

查看进程树 pstree

sh 复制代码
#看父进程我们一般可以通过目录树结构来查看!
1.需要先安装
yum install psmisc

2.pstree -pu
-p 显示父id
-u 显示用户组

杀死进程 kill

杀掉进程,等价于window结束任务!

sh 复制代码
kill -9 进程的id

killall 进程名称

十五、压缩解压缩

概念

归档,也称为打包,指的是一个文件或目录的集合,而这个集合被存储在一个文件中。归档文件没有经过压缩,因此,它占用的空间是其中所有文件和目录的总和。

通常,归档总是会和系统(数据)备份联系在一起,不过,有关数据备份的内容,留到后续章节讲,本章仅学习归档命令的基本使用。

和归档文件类似,压缩文件也是一个文件和目录的集合,且这个集合也被存储在一个文件中,但它们的不同之处在于,压缩文件采用了不同的存储方式,使其所占用的磁盘空间比集合中所有文件大小的总和要小。

压缩 是指利用算法将文件进行处理,已达到保留最大文件信息,而让文件体积变小的目的。其基本原理为,通过查找文件内的重复字节,建立一个相同字节的词典文件,并用一个代码表示。比如说,在压缩文件中,有不止一处出现了 "C语言中文网",那么,在压缩文件时,这个词就会用一个代码表示并写入词典文件,这样就可以实现缩小文件体积的目的。

1.tar

压缩

shell 复制代码
选项:
-z           压缩tar.gz格式    
-j			 压缩tar.bz2格式
-c           代表压缩
-v           详细显示操作信息,压缩文件的过程
-f           后面紧跟 压缩之后的文件名
shell 复制代码
#将目录里所有jpg文件打包成jpg.tar
tar -cvf jpg.tar *.jpg 

#将目录里所有jpg文件打包成jpg.tar.gz
tar -zcvf jpg.tar *.jpg

#把anaconda-ks.cfg文件和/tmp目录打包成ana.tar文件包
tar -cvf ana.tar anaconda-ks.cfg /tmp/

#将chen归档并压缩成test.tar.gz格式压缩包(test为压缩包名)
tar -zcvf test.tar.gz  chen

#将chen打包bz2格式压缩包
tar -jcvf test.tar.bz2  chen

解压缩

默认提取到当前目录,不会创建和压缩文件名称一样的目录

shell 复制代码
选项:
-z                    解压tar.gz格式
-j					  解压tar.bz2格式
-x                    代表解压
-v                    解压过程详细信息
-f                    后面紧跟 解压之后的文件名
-C 					  大写C。指定解压缩目录
shell 复制代码
#解压 tar包
tar -xvf file.tar 

#将gz格式test解压到目录/home/dir1
tar -zxvf test.tar.gz  -C /home/dir1

#将bz2格式test解压到目录/home/dir1
tar -jxvf test.tar.bz2 -C /home/dir1

2.zip

需要安装

shell 复制代码
yum install zip
yum install unzip

压缩

shell 复制代码
选项:
-r	递归压缩目录,及将制定目录下的所有文件以及子目录全部压缩。
-m	将文件压缩之后,删除原始文件,相当于把文件移到压缩文件中。
-o    将压缩文件内的所有文件的最新变动时间设为压缩的时间
-v	显示详细的压缩过程信息。
-q	在压缩的时候不显示命令的执行过程。
-压缩级别	压缩级别是从 1~9 的数字,-1 代表压缩速度更快,-9 代表压缩效果更好。
-u	更新压缩文件,即往压缩文件中添加新文件。
shell 复制代码
#将anaconda-ks.cfg压缩,包名为ana
zip ana.zip anaconda-ks.cfg

#使用 -r 压缩目录
--创建目录
mkdir dir1

--压缩目录
zip -r dir1.zip dir1

解压

shell 复制代码
选项:
-d 		目录名	将压缩文件解压到指定目录下。
-n		解压时并不覆盖已经存在的文件。
-o		解压时覆盖已经存在的文件,并且无需用户确认。
-v		查看压缩文件的详细信息,包括压缩文件中包含的文件大小、文件名以及压缩比等,但并不做解压操作。
-t		测试压缩文件有无损坏,但并不解压。
-x  	指定不要处理压缩文件中的那些文件
shell 复制代码
#不论是文件压缩包,还是目录压缩包,都可以直接解压缩
unzip dir1.zip

#使用 -d 选项手动指定解压缩位置
unzip -d /tmp/ ana.zip

十六、服务管理

1.systemctl管理指令

语法

sh 复制代码
#启动服务
systemctl start 服务名

#停止服务
systemctl stop 服务名

#重启服务
systemctl restart 服务名

#查看服务状态
systemctl status 服务名

2.systemctl设置服务的自启动状态

sh 复制代码
#查看服务开机启动状态,grep可以进行过滤
systemctl list-unit-files [| grep 服务名]

#设置服务开机启动
systemctl enable 服务名

#关闭服务开机启动
systemctl disable 服务名

#查看某个服务是否是自启动的
systemctl is-enabled 服务名

3.应用

sh 复制代码
#查看防火墙开机启动状态
systemctl list-unit-files | grep firewalld

#查看防火墙当前状况
systemctl status firewalld

#查看防火墙是否自启动
systemctl is-enabled firewalld

4.防火墙配置

教程:https://www.cnblogs.com/auguse/p/13325522.html

1、查看firewall的状态

shell 复制代码
firewall-cmd --state

2、firewalld基本命令

sh 复制代码
#查看状态
systemctl status firewalld
shell 复制代码
# 开启 
systemctl start  firewalld

# 重启 
systemctl restart  firewalld

# 关闭
systemctl stop firewalld

# 开机启动
systemctl enable firewalld      

#取消开机启动
systemctl disable firewalld            

4、查看防火墙规则

shell 复制代码
firewall-cmd --list-all 

5.查看端口列表

sh 复制代码
firewall-cmd --permanent --list-ports

结果:
9090/tcp 9100/tcp 3000/tcp

6、查询、开放、关闭端口

查询端口是否开放

shell 复制代码
firewall-cmd --query-port=8080/tcp

开放端口

sh 复制代码
# 开放8080端口
1.方法一
firewall-cmd --zone=public --add-port=8080/tcp --permanent

2.方法二
firewall-cmd --permanent --add-port=8080/tcp

#更新防火墙规则,每次开放完后要执行此命令
firewall-cmd --reload
shell 复制代码
# 参数解释
1.firewall-cmd:是Linux提供的操作firewall的一个工具;
2.--zone=public:设置作用域为公共的
3.--add-port:标识添加的端口;
4.--permanent:表示设置为永久生效,没有此参数重启后失效;

关闭端口

shell 复制代码
#关闭8080端口
1.方法一
firewall-cmd --zone=public --remove-port=8080/tcp --permanent

2.方法二
firewall-cmd --permanent --remove-port=8080/tcp

#更新防火墙规则,每次开放完后要执行此命令
firewall-cmd --reload

十七、动态监控系统

1.介绍

top与ps命令很相似,他们都是用来显示正在执行的进程。top与ps最大的不同之处,在于top在执行一段时间可以更新正在运行的进程

2.应用

查看所有进程的资源占用情况

top

top命令行选项

sh 复制代码
-d	秒数。指定top命令每隔几秒更新。默认是3秒

-i	使top不显示任何限制或者僵死进程

-p	通过指定监控进程ID来仅仅监控某个进程的状态
sh 复制代码
#指定系统每隔5秒自动更新
top -d 5

交互命令

输入top命令后,按下面键进行切换

sh 复制代码
#监控每个逻辑CPU的状况
top  ,按 1

#高亮显示当前运行进程
top ,按 b

#显示进程完整路径和程序名
top ,按 c

#切换显示CPU
top,按t

#按CPU使用率从大到小排序
top,按P

#切换显示Memory
top,按m

#按Memory占用率从大到小排序
top,按M

#以PID排序
top,按N

#按累计运行时间Time从大到小排序
top,按T

#高亮CPU列
top,按b、x

#彩色高亮显示
top,按z

#调配色方案
top,按Z或shift+z

#通过"shift + >"或"shift + <"可以向右或左改变排序列
top shift + >或shift + <

#忽略闲置和僵死进程,这是一个开关式命令
top,按i

#杀掉进程
top,按k,输入PID
sh 复制代码
#监控特定用户,比如监控fox
1.输入top命令,然后回车

2.输入u,然后输入fox,再回车
sh 复制代码
#终止指定进程,终止fox用户登录

1.输入top命令,回车

2.输入k,输入要结束的进程ID,再回车

3.输入9,再回车。强制删除,再看就没有fox登录状态了

3. top命令监控列表的详细解析

统计信息区(系统资源信息区)

前五行,即列表上方的五行

[

第一行:输出系统任务队列信息

  • 19:46:10:系统当前时间
  • up 2days 2:53:系统开机后到现在的总运行时间
  • 1 user:当前登录用户数
  • load average: 0, 0.04, 0.05:系统负载,系统运行队列的平均利用率,可认为是可运行进程的平均数;三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值;单核CPU中load average的值=1时表示满负荷状态,多核CPU中满负载的load average值为1*CPU核数

第二行:任务进程信息

[

  • **total:**系统全部进程的数量
  • **running:**运行状态的进程数量
  • **sleeping:**睡眠状态的进程数量
  • **stoped:**停止状态的进程数量
  • **zombie:**僵尸进程数量

第三行:CPU信息

[

  • **us:**用户空间占用CPU百分比
  • **sy:**内核空间占用CPU百分比
  • **ni:**已调整优先级的用户进程的CPU百分比
  • **id:**空闲CPU百分比,越低说明CPU使用率越高
  • **wa:**等待IO完成的CPU百分比
  • **hi:**处理硬件中断的占用CPU百分比
  • **si:**处理软中断占用CPU百分比
  • **st:**虚拟机占用CPU百分比

第四行:物理内存信息

[

以下内存单位均为MB

  • total:物理内存总量
  • free:空闲内存总量
  • used:使用中内存总量
  • buff/cacge:用于内核缓存的内存量

第五行:交换区内存信息

[

  • free:空闲交换区总量
  • used:使用的交换区总量
  • avail Mem:可用交换区总量

**注:**如果used不断在变化, 说明内核在不断进行内存和swap的数据交换,说明内存真的不够用了

**问题:**内存空间还剩多少空闲呢?

**答案:**空闲内存=空闲内存总量+缓冲内存量 +可用交换区总量

进程信息区(进程列表)

[

  • PID:进程号
  • USER:运行进程的用户
  • PR:优先级
  • NI:nice值。负值表示高优先级,正值表示低优先级
  • VIRT:进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内;VIRT=SWAP+RES
  • RES:进程实际使用的物理内存大小,不包括 Swap 和共享内存
  • SHR :共享内存大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等
  • S :进程状态
    • R=运行状态
    • S=睡眠状态
    • D=不可中断的睡眠状态
    • T=被跟踪/停止
    • Z=僵尸进程
  • %CPU:CPU 使用率
  • %MEM:进程使用武力内存占系统总内存的百分比
  • TIME+:上次启动后至今的总运行时间
  • COMMAND:命令名or命令行

内存的重点

  • 虚拟内存通常并不会全部分配给物理内存,从上面的输出可以发现每个进程的虚拟内存都比物理内存大得多
  • 共享内存 SHR 并不一定是共享的,比如程序的代码段、非共享的动态链接库
  • SHR 也包括了进程间真正共享的内容,所以在计算多个进程的内存使用时,不要把所有进程的 SHR 直接相加得出结果

%CPU

  • 表示进程的 CPU 使用率
  • 是用户态和内核态 CPU 使用率的总和(us+sy)
  • 包括进程用户空间使用的 CPU、通过系统调用执行的内核空间 CPU、在就绪队列等待运行的 CPU
  • 在虚拟环境中, 它还包括了运行虚拟机占用的 CPU
  • 没有细分进程的用户态 CPU 和内核态 CPU

进程状态

  • R=运行状态
  • S=睡眠状态
  • D=不可中断的睡眠状态
  • T=被跟踪/停止
  • Z=僵尸进程

十八、监控网络状态

语法

netstat [选项]

选项

-an		按一定顺序排列输出
-p		显示哪个进程在调用

例子

sh 复制代码
#查看服务名为sshd的服务的信息
netstat -anp | grep sshd

十九、rpm和yum

1.rpm

rpm用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文·件。RPM是RedHat Package Manager (RedHat软件包管理工具)的缩写,类似windows的setup.exe,这一文件格式名称虽然打上了RedHat的标志,但理念是通用的。

Linux的分发版本都有采用(suse,redhat, centos等等),可以算是公认的行业标准了。

rpm包查看

rpm包简单查询指令

sh 复制代码
#查询安装的所有firfox包
rpm -qa | grep firefox

--rpm包名基本格式:
firefox-60.2.2-1.el7.centos7.x86_64
名称:firefox
版本号:60.2.2-1
适用操作系统:el7.centos7.x86_64。表示centos7.x的64位系统,如果是i686、i386表示32位系统,noarch表示通用

#查询firfox软件包是否安装
rpm -q firefox

#查询软件包信息
rpm -qi firefox

#查看软件安装哪里了,以及软件包中的软件
rpm -ql firefox

#文件全路径名,查询文件所属的软件包
rpm -qf /usr/lib64/firefox/platform.ini

rpm包卸载

语法

rpm -e 包名称

例子

sh 复制代码
#删除firfox软件包
rpm -e firefox

#强制删除。但是不建议,因为依赖于该软件包的程序可能会无法运行
rpm -e --nodeps firefox

rpm包安装

语法

rpm -ivh 包全路径名称

参数说明

i=install 安装
v=verbose 提示
h=hash 进度条

例子

sh 复制代码
#安装火狐。前提是将已经下载好的rpm上传到了opt目录下
rpm -ivh /opt/firefox-60.2.2-1.el7.centos7.x86_64

2.yum

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

查看

语法

sh 复制代码
#查询yum服务器是否有需要安装的软件
yum list | grep 包名称

例子

sh 复制代码
yum list | grep firefox

firefox.i686                                78.7.0-2.el7.centos        updates
firefox.x86_64                              78.7.0-2.el7.centos        updates

安装

语法

yum install 包名称

例子

sh 复制代码
#安装firefox
yum install firefox

二十、软件安装

1.安装方式

  • yum

  • rpm

    类似于windows安装包

  • 解压(tar包)

  • make

    源码直接编译的安装方式

2...JDK安装

tar包解压安装

上传tar包到tmp目录下

jdk-8u211-linux-x64.tar.gz

解压

sh 复制代码
1.进入tmp
--注意版本,别傻乎乎直接复制
cd /tmp

2.解压至opt目录下
tar -zxvf jdk-8u211-linux-x64.tar.gz -C /opt

3.进入opt目录将jdk改名
cd /opt

mv jdk1.8.0_211 jdk1.8

配置环境变量

1.进入文件
vi /etc/profile

2.将下面的内容添加在末尾
# JAVA_HOME
export JAVA_HOME=/opt/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin

3.执行命令使配置生效
source /etc/profile

4.检测安装是否成功,分别输入以下3个命令
java

javac

java -version

rpm安装

rpm下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html
如果有安装jdk 则卸载

sh 复制代码
1.查看java版本信息
java -version

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

2.查看jdk的rpm安装包
rpm -qa|grep jdk

jdk1.8.0_121-1.8.0_121-fcs.x86_64

3.卸载
rpm -e --nodeps jdk1.8.0_121-1.8.0_121-fcs.x86_64

4.查看
java -version
-bash: /usr/bin/java: No such file or directory  # OK

将JDK的rpm包上传至opt目录下

jdk-8u221-linux-x64.rpm

安装JDK

shell 复制代码
rpm -ivh /opt/jdk-8u221-linux-x64.rpm

配置环境变量

sh 复制代码
1.进入profile
vi /etc/profile

2.将下面的信息,放在文件末尾
JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
CLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME

3.保存退出
按Esc键,随后按冒号,输入wq保存退出

4.让新增的环境变量生效!
source /etc/profile

4.检测安装是否成功,分别输入以下3个命令
	1.java

	2.javac

	3.java -version

	java version "1.8.0_221"
	Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
	Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

3.Tomcat安装

tar包解压

上传tar包至tmp目录下

apache-tomcat-8.5.55.tar.gz

解压

sh 复制代码
1.进入tmp目录
cd /tmp

2.解压至opt目录下
tar -zxvf apache-tomcat-8.5.55.tar.gz -C /opt

3.进入opt目录,改名改为tomcat
cd /opt

mv apache-tomcat-8.5.55 tomcat

启动tomcat

  • 方式一

    #直接通过绝对路径启动
    /opt/tomcat/bin/startup.sh
    
  • 方式二

    1.需要先给执行权限,这里给全部权限
    cd /opt/tomcat/bin	#先进入bin目录
    
    chmod 777 startup.sh	#给所有权限
    

开放8080端口

sh 复制代码
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp

# 开放8080端口
firewall-cmd --permanent --add-port=8080/tcp

#更新防火墙规则
firewall-cmd --reload
sh 复制代码
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为永久生效,没有此参数重启后失效;
3、--add-port:标识添加的端口;

访问

别傻乎乎复制,注意自己的ip和端口
http://172.16.6.117:8080/

4.MySQL安装

tar包解压安装

上传tar包至root目录下

mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz

⾸先查询已安装的Mariadb 安装包

rpm -qa|grep mariadb

mariadb-libs-5.5.60-1.el7_5.x86_64

卸载

rpm -e --nodeps mariadb-libs

解压至/usr/local/目录下,并重命名为mysql

1.解压
tar -zxvf /root/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

2.进入local
cd /usr/local

3.重命名
mv mysql-5.7.30-linux-glibc2.12-x86_64 mysql

创建MySQL⽤户和⽤户组

1.创建用户组
groupadd mysql

2.创建用户,并指定用户组
useradd -g mysql mysql

修改MySQL⽬录的归属⽤户

chown -R mysql:mysql ./

如果有my.cnf,先将其删除

rm -rf /etc/my.cnf

新建MySQL配置文件,并将下面内容写入,最后ESC-->wq保存退出

vi /etc/my.cnf

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock
[mysqld]
skip-name-resolve
#设置3306端⼝
port = 3306
socket=/var/lib/mysql/mysql.sock
# 设置mysql的安装⽬录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放⽬录
datadir=/usr/local/mysql/data
# 允许最⼤连接数
max_connections=200
# 服务端使⽤的字符集默认为8⽐特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使⽤的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M

创建/var/lib/mysql ⽬录,并修改权限

1.创建
mkdir /var/lib/mysql

2.修改权限
chmod 777 /var/lib/mysql

正式开始安装MySQL

1.进入mysql
cd /usr/local/mysql

2.安装。执行完此命令后会出现下图。记住下⾯打印出来的root 的密码,后⾯⾸次登陆需要使⽤
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

复制启动脚本到资源⽬录,并修改/etc/init.d/mysqld ,修改其basedir 和datadir 为实际对应⽬录,最后 保存退出

1.复制
cp ./support-files/mysql.server /etc/init.d/mysqld

2.进入mysqld
vi /etc/init.d/mysqld

3.修改成下面效果
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data

4.最后ESC-->wq保存退出

设置MySQL系统服务并开启⾃启

1.⾸先增加mysqld 服务控制脚本执⾏权限
chmod +x /etc/init.d/mysqld

2.同时将mysqld 服务加⼊到系统服务
chkconfig --add mysqld

3.最后检查mysqld 服务是否已经⽣效即可
chkconfig --list mysqld

这样就表明mysqld 服务已经⽣效了,在2、3、4、5运⾏级别随系统启动⽽⾃动启动,以后可以直接使

⽤service 命令控制mysql 的启停。

启动mysqld服务

service mysqld start

将MySQL 的bin ⽬录加⼊path 环境变量。

这样⽅便以后在任意⽬录上都可以使⽤mysql 提供的命令。

1.编辑~/.bash_profile,在⽂件末尾处追加如下信息,最后保存退出
vi ~/.bash_profile

export PATH=$PATH:/usr/local/mysql/bin

执⾏如下命令使环境变量⽣效

source ~/.bash_profile

⾸次登陆MySQL。之前安装完成后的提示密码:jjipg5rg&ofQ

以root 账户登录mysql ,使⽤上⽂安装完成提示的密码进⾏登⼊

mysql -u root -p

修改ROOT账户密码

在mysql的命令⾏执⾏如下命令即可,密码可以换成你想⽤的密码即可

#123456是你要设置的密码
#user()表示当前用户
alter user user() identified by "123456";

#刷新生效
flush privileges;

设置远程主机登录。分别执行下面3条命令

use mysql;

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

flush privileges;

退出mysql

exit

开放3306端口。不开放Navicat会连接不上

# 查询端口是否开放,如果结果为no,那么继续执行下面语句
firewall-cmd --query-port=3306/tcp

# 开放3306端口
firewall-cmd --permanent --add-port=3306/tcp

#更新防火墙规则
firewall-cmd --reload

Navicat连接测试

rpm、yum安装

将rpm包上传至opt目录下

mysql57-community-release-el7-11.noarch.rpm

安装

sh 复制代码
rpm -ivh /opt/mysql57-community-release-el7-11.noarch.rpm

更改mysql配置文件

sh 复制代码
vi /etc/yum.repos.d/mysql-community.repo
sh 复制代码
#5.6的enabled=0 改为1
enabled=1

#5.7的enabled=1 改为0
enabled=0

安装mysql

sh 复制代码
yum install mysql-community-server
点击y回车安装

查看mysql

sh 复制代码
查找mysql:systemctl list-unit-files | grep mysql
查看mysql服务状态:  systemctl status mysqld
启动mysql: systemctl start mysqld
查看mysql服务状态: systemctl status mysqld

mysql服务随系统启动 执行该命令 :systemctl enable mysqld

mysql设置密码

sh 复制代码
#进入mysql: 
mysql -u root -p           新安装没有密码 回车进入

#查看数据库:
show databases

#进入mysql修改密码:
use mysql;

update user set password=password('123456') where user='root';

flush privileges;

mysql程授权

sh 复制代码
#mysql设置远程登录:
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

#刷新
flush privileges;

5.docker安装

1.安装环境要求

内核版本要求

Linux要求内核3.0以上

uname -r

结果:3.10.0-957.el7.x86_64
Centos7
  • 要安装 Docker Engine,需要 CentOS 7 的维护版本,不支持或未测试存档版本(一句话:需要正常迭代版本的 Centos 7 系统,其他系统都不行)
  • 必须启用 centos-extras 存储库,该存储库默认情况下处于启用状态,但是如果已禁用它,则需要重新启用它
  • 建议使用 overlay2 存储驱动程序
为什么不用别的版本?
  • CentOS 6 因内核太旧,即使支持安装 docker,但会有各种问题,不建议安装
  • CentOS 7 的 extras 源虽然可以安装 docker,但包比较旧,建议从官方源或镜像源站点下载安装 docker
  • CentOS 8 有新技术 podman 代替 docker
  • 因此建议在 CentOS 7 上安装 docker

2.安装

1. CentOS7更换yum源

Linux使用的下载源服务器属于国外,下载速度相对国内会慢很多,像大家日常使用的阿里云和腾讯云等国内服务器厂商,镜像源都默认为自己相关的镜像源,所以在使用时下载应用的速度很快。

1.备份(针对所有CentOS可用,备份文件在当前路径下)

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2.安装wget

yum -y install wget

3.下载CentOS 7的repo文件

如果还wget安装不了的话,请使用curl安装(第2条命令)

1.阿里云源:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

#或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2.网易云源:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo

4.更新镜像源

1.#清除缓存
yum clean all

2.#生成缓存
yum makecache

3.更新yum源,等待更新完毕即可。(执行加载完后会卡顿一会)
yum -y update

4.再次清除
yum clean all

5再次生成缓存
yum makecache
2.安装docker
官方安装手册参考
https://docs.docker.com/engine/install/centos/
查看Centos版本
cat /etc/redhat-release
yum安装gcc

这一步可以暂时跳过

yum -y install gcc
yum -y install gcc-c++
卸载旧版本docker

1.查找是否有旧版本的docker

yum list installed | grep docker

2.移除旧版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

如果出现下图就可以了

注意

  • /var/lib/docker/ 下的内容(包括 images,containers,volumes,networks)被保留
  • Docker Engine 软件包现在称为 docker-ce
安装
  • 使用 Docker 仓库进行安装

    在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库,随后可以从仓库安装和更新 Docker。

1.配置

1.安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

yum install -y yum-utils device-mapper-persistent-data lvm2

2.添加软件源信息,国内 Repository 更加稳定
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.更新
yum makecache fast

2.安装最新版本的 Docker Engine 和 Container

yum install docker-ce docker-ce-cli containerd.io

注意

  • 如果提示接受GPG密钥,请验证指纹是否与 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35 匹配,如果是,可接受
  • 安装成功后不代表 Docker 已成功,且 Docker 组虽已创建,但没有用户添加到该组

3.启动docker

systemctl start docker

4.通过运行hello-world 映像来验证是否正确安装了Docker Engine

docker run hello-world

在安装过程中第一次失败了,重新运行了命令又好了。

3.docker配置镜像加速

1.阿里云镜像加速地址
2.配置文件

1.新建docker目录

mkdir -p /etc/docker

2.在 /etc/docker/下创建daemon.json,并添加刚才获取的阿里云镜像地址,最后保存退出

vi /etc/docker/daemon.json

以下json内容每个人的不一样

{
  "registry-mirrors": ["https://0ij4sffa.mirror.aliyuncs.com"]
}

3.设置生效,并启动docker

systemctl daemon-reload

# 重启docker
systemctl restart docker 
3.也可以添加多个镜像地址

配置多个地址,避免某个站点不行时可以自动切换到后面的站点

vi /etc/docker/daemon.json

{
  "registry-mirrors": ["https://0ij4sffa.mirror.aliyuncs.com",
                       "https://cr.console.aliyun.com/",
                       "http://hub-mirror.c.163.com",
                       "https://docker.mirrors.ustc.edu.cn",
                       "https://reg-mirror.qiniu.com"]
}

systemctl daemon-reload

# 重启docker
systemctl restart docker 

4.docker服务和容器设置开机自启

在etc/rc.d/rc.local目录下写上需要开机启动的命令:

sh 复制代码
1.先给文件拥有者给 执行权限 x
chmod +x /etc/rc.d/rc.local

2.查看所有容器ID。包括未启动的容器
docker ps -a

3.进入rc.local
vi /etc/rc.d/rc.local

4.进入后,在touch /var/lock/subsys/local下方添加docker服务启动命令和docker容器开机自启命令

#docker服务开机自启
systemctl start docker

#docker容器开机自启
docker start fcab64956a00 2a6a314eac60 

--fcab64956a00 2a6a314eac60 分别是mysql和tomcat的容器ID,容器id可以通过docker ps -a查看所有容器

5.卸载docker

yum remove docker-ce docker-ce-cli containerd.io

**备注:**主机上的 Images、containers、volumes、自定义配置文件不会被删除

若要删除执行下面命令

rm -rf /var/lib/docker

6.宝塔面板安装

https://www.bilibili.com/video/av91821322

二十一、MySQL5.7修改密码

update修改

  • update直接编辑那个自动的mysql库中的user表
  • use mysql的意思是切换到mysql这个库,这个库是所有的用户表和权限相关的表都在这个库里面,我们进入到这个库才能修改这个库里面的表。
  • mysql5.7 user表里已经去掉了password字段,改为了authentication_string。
mysql 复制代码
1.先进行登录
mysql -u root -p

2.切换mysql库
use mysql;

3.修改
格式:update user set authentication_string=password("新密码") where user='用户名';

例子:update user set authentication_string=password("112233") where user='root';

4.刷新权限
flush privileges;

5.exit退出,重新登录

注意:如果Mysql的版本是5.7以下的话update语句更换如下:

mysql 复制代码
 update user set password=passworD("112233") where user='root';

alter修改

mysql 复制代码
1.先进行登录
mysql -u root -p

2.修改
格式:alter user "用户名" identified by "新密码";
也可以使用alter user user() identified by "123456";#user()表示当前用户

例子:alter user "root" identified by "112233";

3.刷新权限
flush privileges;

4.exit退出,重新登录

修改远程授权密码

mysql修改完密码后,远程授权也要修改,否则Navcait会连接不上

mysql 复制代码
#登录
use mysql;

#授权。
格式:grant all privileges on *.* to 'root'@'%' identified by '密码' with grant option;
例子:grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

#刷新权限,否则不会生效
flush privileges;

二十二、MySQL5.7忘记密码

检查mysql服务是否启动,如果启动就关闭

shell 复制代码
#检查
ps -ef | grep -i mysql

#关闭
service mysqld stop

修改mysql的配置文件my.conf

sh 复制代码
1.进入文件
vi /etc/my.cnf

2.在文件的[mysqld]标签下添加一句:skip-grant-tables,最后保存退出

启动数据库

sh 复制代码
service mysqld start

修改密码

shell 复制代码
1.进入mysql
mysql -u root

2.切换到mysql表
use mysql;

3.修改
update user set authentication_string=password("112233") where user='root';

4.exit退出,重新登录

重新进入mysql的配置文件my.conf

将刚才添加的skip-grant-tables删除

sh 复制代码
vi /etc/my.cnf

重启数据库

sh 复制代码
service mysqld restart

用刚才修改的密码重新登录mysql就好了

sh 复制代码
musql -u root -p

二十三、配置环境变量的几种方式

1.环境变量配置文件

用户 环境变量配置文件
所有用户 /ect/profile/etc/bashrc/etc/environment
root ~/.bashrc~/.bash-profile
非root用户 /home/非root用户名/.bashrc

更新环境变量

source /etc/profile
or
. /etc/profile 

2.环境变量配置方式

Linux读取环境变量

读取系统已有环境变量的方法

export 显示当前系统定义的所有环境变量

echo $PATH 输出当前的PATH环境变量的值

PATH 变量定义的是运行命令的查找路径,以冒号 : 分割不同的路径

方式一: export PATH

export PATH=/usr/local/src/python3/bin:$PATH

# 或者把PATH放在前面
export PATH=$PATH:/usr/local/src/python3/bin
注意点
  • 生效时间:立即生效
  • 生效期限:当前打开的终端有效,窗口关闭后无效
  • 生效范围:当前登录用户
  • 需要加上$PATH,否则会覆盖原有路径

方式二: vim ~/.bashrc

vim ~/.bashrc

# 在最后一行加上

export PATH=$PATH:/usr/local/src/python3/bin
注意点
  • 生效时间:使用相同的用户打开新的终端时生效,或者手动 source ~/.bashrc 生效
  • 生效期限:永久有效
  • 生效范围:当前登录用户
  • 可能会被后续的环境变量文件覆盖了PATH的值

方式三: vim ~/.bash_profile

vim ~/.bash_profile

# 在最后一行加上

export PATH=$PATH:/usr/local/src/python3/bin
注意点
  • 生效时间:使用相同的用户打开新的终端时生效,或者手动 source ~/.bash_profile 生效
  • 生效期限:永久有效
  • 生效范围:当前登录用户
  • 如果没有 ~/.bash_profile 文件,则可以编辑 ~/.profile 文件或者新建一个

方式四: vim /etc/bashrc

# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/bashrc

vim /etc/bashrc

# 在最后一行加上
export PATH=$PATH:/usr/local/src/python3/bin
注意点
  • 生效时间:使用相同的用户打开新的终端时生效,或者手动 source /etc/bashrc 生效
  • 生效期限:永久有效
  • 生效范围:所有用户

方式五: vim /etc/profile

# 如果/etc/profile文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/profile

vim /etc/profile

# 在最后一行加上
export PATH=$PATH:/usr/local/src/python3/bin
注意点
  • 生效时间:使用相同的用户打开新的终端时生效,或者手动 source /etc/profile 生效
  • 生效期限:永久有效
  • 生效范围:所有用户

方式六: vim /etc/environment

# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/environment

vim /etc/profile

# 在最后一行加上
export PATH=$PATH:/usr/local/src/python3/bin
注意点
  • 生效时间:使用相同的用户打开新的终端时生效,或者手动 source /etc/environment 生效
  • 生效期限:永久有效
  • 生效范围:所有用户

3.环境变量加载原理解析

思考:上述六种环境变量的配置方式, Linux是按什么顺序加载的呢?是否会相互覆盖相同的环境变量呢?

环境变量的分类

用户级别环境变量配置文件:

  • ~/.bashrc
  • ~/.profile
  • ~/.bash_profile(centos7 无)
  • /home/非root用户名/.bashrc

系统级别环境变量配置文件:

  • /etc/bashrc
  • /etc/profile
  • /etc/bash_profile(centos7 无)
  • /etc/environment

环境变量加载顺序

  1. /etc/environment
  2. /etc/profile
  3. /etc/bashrc
  4. ~/.profile
  5. ~/.bashrc
相关推荐
矛取矛求3 小时前
Linux如何更优质调节系统性能
linux
内核程序员kevin4 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
hbh112233abc4 小时前
实现 think/queue 日志分离
php·thinkphp·queue
Ztiddler5 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
小小不董5 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
IPdodo全球网络5 小时前
如何利用静态住宅IP优化Facebook商城的网络稳定性与运营效率
运维·服务器
a1denzzz6 小时前
Linux系统的网络设置
linux·服务器·网络
ac.char6 小时前
在CentOS下安装RabbitMQ
linux·centos·rabbitmq
m0_519523106 小时前
Linux——简单认识vim、gcc以及make/Makefile
linux·运维·vim