一、安装
(一)bios basic input / output system
-
cpu虚拟化技术需要开启
intel
amd
-
不同品牌进入bios快捷键不一样
(二)vmware
-
新建
-
配置硬件
-
硬盘
-
建议单个虚拟硬盘文件,比较好管理
-
r如果有转移的需求,建议多个
u盘的格式化
ntfs
-
-
网络
-
只可以访问主机资源
host only
-
可以自由访问网络资源
brige 桥接:主机与虚拟机 各自独立ip
NAT:网络地址转换。主机和虚拟机同一个ip
-
桥接模式 一定要显示vmnet 所对应的网络适配器 为本地用来上网的适配器硬件
查询方法:右下角网络图标--网络和internet-更改适配器-查看本地网络的适配器
如果上不了网查看是否选择本地网卡
-
-
光驱
需要指定光驱硬件,读取资源的来源
-
物理光驱,比较少用
-
iso文件:选择本地iso后要选择上方的自动连接
如果没有指定会进入网络安装模式 报错:DHCP ckent...
-
-
-
安装时
(1)系统安装目标:直接指定硬盘,选择Done完成
(2)网络:打开按钮------自动进行dhcp 分配地址
-
动态分配地址,租约到就收回
-
有时挂起:挂起时保留的ip,因为没有使用,租约到期,被收回或者给他人使用。导致挂起的虚拟机恢复后,因为ip仍然是之前配置的,无法上网。需要重新启动网络,再次动态分配一个地址。
(3)用户root密码的设置
-
-
安装好之后
- 登录
- 输入root用户名
- 回车-----提示输入密码
- 此时输入的密码是不可见的,输完直接回车即可进入系统
- 正确提示:root@localhost #
- 登录
-
常见问题
-
网络ip addr
- 只有本地回路 loopback ens33 只有一行信息
(1)vmnet0 桥连接模式在安装vmware未安装成功 需要 将 C盘属性安全的第1个和第4个权限全部打开
(2)gui安装界面 点击打开网络按钮
偶发:显示按钮打开,但实际相关的配置信息没有保存,导致相关的虚拟网卡适配器,没有开机启动
-
二、虚拟化(硬件)软件
1.vmware
-
该公司其他软件
workstation
esxi 虚拟管理系统
2.virtualbox
3.bochs
仅模拟 不是完全虚拟
4.通过系统资源 来虚拟化出来一些硬件(实现硬件相应的功能)
三、linux的理解
(一)linux内核:kernel
(二)unix有自己的内核和相关的外围软件。收费
(三)自己造内核
- minix内核:为了教学用
- linus:结合社区,持续更新
- gnu project:Gnu is Not Unix。自己造内核,同时自己造软件。gpl开源协议
(四)根据不同的外围软件的分类及管理方式
出现不同的发行版 distrbution distro
- 两发发行版派系
- debian系
- debian
- unbuntu 开发者常用
- redhat系
- redhat
- centos
-
linux支持的桌面
kde、gnome、lxde、xfce、unity
-
与windows的区别
-
linux常用服务器,比较稳定
-
windows常用语pc,也有服务器,但没有linux稳定
-
四、网络相关知识
UID:唯一标志
ONBOOT=yes:表示开机启动自动连接
GATEWAY=:表示网关地址
1.基础
-
bootproto
-
网络地址的协议
static
dhcp
-
-
gateway
-
网关
-
内网与外界通信时,需要经过的通道,方便管理和监控。
-
与本机ip前三段一致,第4位是1,一般是172.16.8.1
-
通过命令添加网关,也可以修改配置文件
-
route命令(centos7不再使用)
-
-
-
dns
-
域名服务器
-
8.8.8.8 谷歌域名服务器
-
国内114 域名服务器
-
-
通过域名访问时,将域名发送给域名解析服务器,转换域名为ip后进行通信。
假如没有配置域名服务器:ping xx.xx.xx.xx 可以ping通;
-
2.相关配置文件
-
域名服务器路径
可以ping通,但是ping baidu.com 提示unknown host,需要配置域名解析服务
cat /etc/resolv.conf
-
编辑网络配置文件
ens33没有获得ip,将最后一行ONBOOT=no修改为yes,修改完后重启网络systemctl restart network
vi /etc/sysconfig/network-scripts/ifcfg-ens33
ens33参数说明
shTYPE="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.相关命令
-
ping
测试当前服务器是否可以连接目的主机
ping www.baidu.com
-
查看ip地址
方法一
ip addr ip a
方法二
sh1.需要先安装网络工具 yum install net-tools 2.查询ip地址 ifconfig
-
网络命令
修改配置文件后,通常需要重新启动服务
sh重启 systemctl restart network 停止 systemctl stop network 开始 systemctl start network 状态 systemctl status network
-
systemctl 还可以 enable服务 和 disable服务,安装的服务是否被启动
4.网络出现问题时如何排查
-
服务
-
网络接口配置
-
ping
网关、常见网站
-
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.路径的表示
-
相对路径
./ 表示当前目录 ../ 表示上一级目录 通过../ ./ 来代替pwd显示的内容
-
绝对路径
/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 用来显示文件开头的内容
-
默认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.阿里云镜像加速地址
- 阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- 登录后,左侧菜单选中镜像加速器就可以看到你的专属地址了
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
环境变量加载顺序
- /etc/environment
- /etc/profile
- /etc/bashrc
- ~/.profile
- ~/.bashrc