记录学习linux+shell的一些知识.

Linux概述

操作系统是用来操作计算机底层硬件的。Linux是操作系统

macOS起源于

  • BSD:商业发行版本的UNIX其中之一
    • 今天还依然盛行,其他版本比较依赖性能强大的主机
    • 这个是伯克利分校开发出来的一个版本,在此基础上衍生了FreeBSD,来自世界各地开发者维护。1993年12月发行
      • FreeBSD协议可以自由开发并且随意修改不限制,在此基础上诞生了达尔文系统,这是苹果macOS前身,可以说就是给予freeBSD诞生的
  • IBM:IBM的商业发行版本
  • HP:惠普

  • Minix,借鉴了unix思想重新实现的开源版本

linux就是在此基础上诞生的,因为Minix有很多缺陷,没有网络连接功能等。1991年完成linux基础版本0.01版本,这个基础版本是内核

  • git也是linus写的。因为之前他们用的bit keeper收费了
  • 2008年github上线

上世纪89、90年代,unix不是开源的有版权

GNU/Linux

  • 理查德·马修·斯托曼,黑客,发起的自由软件运动,软件不应该完全收费,应该开源
    • 1985年发起了一个GUN计划,创造一个自由免费的系统,兼容unix但是不是unix
    • GNU’s Not Unix!
    • linux发布将这个加入到了GNU计划中,GNU缺少内核正好linux发布填补了空白

  • linux内核
    • 硬件接口层
    • 内存管理,进程管理,驱动程序,文件,网络
  • linux系统
    • 指GNU/linux,包含应用层,shell等

可以基于linux kenel在此基础上添加不同的外围应用,就是一个发行版本。我们一般讲安装linux系统就是指GUN/linux,因为要包含shell等

发行版本

Redhat 系列

商业收费版本

  • red hat系列,包含
    • RHEL(red hat enterprise linux)收费

免费版本社区维护

  • red hat系列
    • centos 基于RHEL收费版本,重构的免费版本,除去商标信息,和企业版本基本一致。要等企业版发布
    • fedoro实验版本

debian 系列

最遵循GNU规范的

  • ubuntu系统,基于的debian发展出来的,有自己发展的桌面版本,外观像macos
    • linux mint,基于ubuntu变化的版本,外观像window,也是window的早期版本,windowxp

SUSE

俄罗斯开发的,欧洲使用的多。国内少

国内的-红旗、deepin等

也是基于debian开发

Android

不属于发行版本的,安卓、鸿蒙等但是也是linux内核

linux和window对比

centos

  • 包管理工具,yum
  • ubuntu包管理工具 apt
  • 24年6月停止社区版本维护,有一个centos stream版本,但是不是基于企业版本重构的,不稳定。还有一个centos创始人不满意做法,自己创建了一个rocky centos开源,针对centos企业版本

VMware使用安装系统

  • windows系统有WSL,windows subsystem for linux

系统相关知识

  • cpu处理器
    • 数量由电脑主板决定,主板有几个插槽就有几个cpu。一般个人电脑都是一个,多个可能都是服务器
  • 内核:
    • 当前每一个CPU,独立出来的内部处理核心,提升性能的关键。一般讲的双核,四核等就是指CPU核心数
  • 逻辑处理器
    • 每一个cpu可以有多个内核,而每一个内核如果使用了HT超线程技术可以扩展有两个逻辑内核,相当于看起来有一个内核,但是用起来相当于两个
    • 比如说的2核4线程,4核8线程指的就是内核数量和逻辑内核数量,每一个逻辑核心都可以被认为是逻辑核心

  • 桥接网络
    • 虚拟机和主机等价存在,相当于虚拟机在局域网内,把主机当成一个桥,看到其他人电脑一样
  • NAT转换
    • 完全依托于主机网络,主机是虚拟路由器,表现出来是和主机一个ip,NAT用的会多一点

  • 普通用户是$,
  • root用户是#号
  • ~号表示的是当前这个用户的主文件夹也就是/home/xxxx这个目录

文件系统

linux系统,一切皆文件

有箭头的表示是快捷方式,实际目录在其他地方

文件系统和挂载点

  • linux系统是斜杠 /usr,window是反斜杠\,window会有问题在底层ASCII编码时候,所以有时候看到路径会是双斜杠,因为要转义

目录结构

目录结构从unix那里来的, 根目录

  • bin 目录
    • binary 二进制目录,存放可以直接执行的命令,比如cd,ls,grep,cp等命令
    • 这里是一个快捷方式,在usr/bin目录下还有一个一样的,跟目录的就是指向usr/bin下面的
  • sbin 目录
    • system binary 系统级别的二进制目录
    • 这里是一个快捷方式,在usr/sbin目录下还有一个一样的
  • lib 目录
    • library 库目录,类似window的dll文件,软连接到usr/lib目录
    • 类似window system32目 录
  • lib64 目录
    • 特殊的库目录,类似window system目录,软连接到usr/lib64目录
  • **usr **目录
    • unix software resource,存放了用户应用程序,数据,库文件,需要的文件等
  • usr/local
    • 用户本地应用程序相关的,针对用户的,有一些bin会软连接到usr/local/binm 目录下
  • boot
    • 系统引导加载程序,引导启动的核心文件
  • dev
    • device 设备目录,代表系统中的硬件设备,比如cpu,磁盘,打印机等
  • etc
    • etcetera(附加物)缩写
    • 系统管理所需要的配置文件,系统配置,网络配置,装了一个数据库的配置等等
  • home
    • linux中,每一个用户都有一个自己的主目录,一般登录进来默认就是在home目录下,目录是 home/用户1/,home/用户2/
  • root
    • 系统超级管理员的主目录
  • opt
    • 常用目录,optional缩写,可选目录。给装第三方软件用的,一般三方库可以装到这里
  • meida
    • 媒体目录,识别一些可移动媒体设备,比如U盘,光驱等,数据会在这里。可移动媒体设备的挂载点
    • 挂载点
  • mnt
    • 挂载目录,和media差不多,mount缩写
    • 挂载点
  • proc
    • 虚拟目录,process的意思,进程目录,存放进程信息等
  • run目录
    • 运行目录,存放系统运行以来的所有时时信息,重启就没了
  • srv
    • service,和系统服务相关东西
  • sys
    • 系统硬件信息相关的文件
  • tmp
    • temporary 临时目录,可以删除
  • var
    • variable,可变目录,一般放日志log等

VIM

  • VI编辑器,是unix系统中或者类Unix系统中通用编辑器
  • VIM是VI发展出来更强大的,比如可以用字体颜色辨别语法是否正确等(文本颜色不一样),VIM和VI完全兼容

linux VIM中显示代码行数

1
2
3
4
5
6
# 显示行数
:set nu

# 不显示行数
:set nonu

  • 命令模式

网络配置和系统管理操作

  • ping 命令
    • window和linux通用,用来检测两台主机之间是否可以互相发送数据
    • 比如ping www.baidu.com,ping 192.16.8.14可以ping主机或者ip
  • 局域网ip,外网ip
    • 外网internet-路由器-局域网
  • 为什么有的是192.168,有的是172.16这些?IP分为3类:
    • 1个A类地址段 10.0.0.0/8(10.0.0.0—10.255.255.255);适用用大型网络,在跨省或跨市的大规模城域网中会见到,比如国家或省的跨城域网地址段。
    • 16个B类地址段172.16.0.0/12(172.16.0.0—172.31.255.255);适用于中型网络,在地市级或区县级的中型城域网中比较常见,比如中考考点网络或城域网监控网络,或者大中等校园局域网。
    • 256个C类地址段 192.168.0.0/16(192.168.0.0—192.168.255.255);适用于小型网络,在小规模的园区或办公楼局域网,小规模学校局域网等组网中比较常见。

查看当前电脑网络信息:ifconfig

  • 实际测试linux执行ifconfig报错,执行ip addr或者ip a

同一网段,需要ip前三个一样,比如192.168.1.xxx

  • DHCP服务
    • 可以自动为网络中的主机分配ip地址

桥接网络

虚拟机上网,可以用宿主机通过虚拟网桥(一个网络扩展设备物理上的)上网。如果有多个虚拟机,需要通过网桥-交换机-vm机

这种上网方式,PC和VM虚拟机都是平等的方式,相当于局域网的其他电脑一样,虚拟机地址也一样会占用IP地址

问题是如果是C类地址,子网掩码是255.255.255.0,意味着这一个局域网内最多存在1-254个地址,所以桥接实际情况用的会比较少

NAT模式(netword addres translation)

网络地址转换缩写。

由虚拟机创建NAT服务器做网络地址转换,再有DHCP服务器做动态分配ip。安全性更好,我可以访问外网,外网不能访问我,专用网络

就是构建了一个虚拟机的子网

从网卡上分配出来虚拟一个路由器,给每一个虚拟机分配ip。相当于internet-路由器-局域网这个路径一样,不过是PC-路由器-vm虚拟机。所以虚拟机虚拟出来了另外一个局域网。但是此时宿主机是没办法访问虚拟机网络的,因为就象外网没办法访问搭配局域网内一样,所以虚拟机会创建一个VMnet8,从另外一个网卡上直接连接到虚拟机路由器中,可以让主机和虚拟机在同一个局域网内,这是为了通信专门虚拟出来的网卡

为什么看到的主机ip和虚拟机ip不在同一个网段?因为用的是NAT模式,主机在局域网内而且是B类地址是172.16开头,虚拟机在局域网的局域网内是C类地址192.168开头,两个不同的局域网,此时主机没办法访问虚拟机,所以又虚拟了一个网卡出来,连接到虚拟机出来路由器,让宿主机和虚拟机构建了一个子网,都在虚拟机创局域网络中。


仅主机模式

虚拟机无法访问外部网络,宿主机才可以相当于去掉了虚拟机的路由器,所以没办法访问外网了,只有宿主机可以访问虚拟机

其他

网关

主机虚拟地址是192.168.111.1,虚拟机NAT网关是192.168.111.2

虚拟机修改为静态ip

有些情况不想让电脑重启以后自动更换ip,还需要查询自己电脑当前ip,所以需要修改为静态的,window直接修改vmwarenet8的网络信息。

https://www.freecodecamp.org/chinese/news/setting-a-static-ip-in-ubuntu-linux-ip-address-tutorial/

配置相关的都在/etc 目录下:

  1. 通过ip a命令找到虚拟机的虚拟网卡,其他地址本地回环地址不用管
  2. inet这一项
  3. cd /etc/netplan/
  4. ls
  5. 此时会看到一个yaml文件,vim编辑。ubuntu用Netplan管理网络
  6. <font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">dhcp4: true</font>修改为<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">dhcp4: false</font>,然后添加<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">addresses</font><font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">gateway4</font>行来配置静态IP地址和默认网关。假设您的网络网段为<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">192.168.1.0/24</font>,要将Ubuntu 22.04配置为静态IP地址<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">192.168.1.100</font>,默认网关为<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">192.168.1.1</font>,则配置部分应如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
addresses: [192.168.64.100/24]
gateway4: 192.168.64.2 # NAT模式,1是虚拟出来的宿主机网卡,这里用2
nameservers:
addresses: [8.8.8.8, 1.1.1.1]



# 上面ubuntu22被弃用了,用这个
network:
ethernets:
ens3:
dhcp4: false
addresses:
- 192.168.64.100/24
routes:
- to: default
via: 192.168.1.2 # NAT模式,1是虚拟出来的宿主机网卡,这里用2
nameservers:
addresses: [8.8.8.8, 1.1.1.1]

原来是15,修改为100

⚠️**补充:gateway4设置已经被弃用,使用route来配置**

配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
# 上面ubuntu22被弃用了,用这个
network:
ethernets:
ens3:
dhcp4: false
addresses:
- 192.168.64.100/24
routes:
- to: default
via: 192.168.1.2 # NAT模式,1是虚拟出来的宿主机网卡,这里用2
nameservers:
addresses: [8.8.8.8, 1.1.1.1]

  1. 重启配置生效
1
2
3
4
sudo netplan apply


ip address show ens3

修改以后虚拟机可能会失去连接无法访问。因为地址变了

教程中是centos,路径不一样,这个为准.

https://linux.cn/article-15181-1.html

问题排查

自己查ubuntu对应的

修改主机名

修改主机名称格式为xxx1,xxx2等,后面的数字就是局域网内ip主机的代号。修改了方便维护

  • hostname
    • 查看当前主机名称

修改方式一,需要重启

1
vim /etc/hostname

修改方式二, 立即生效的

1
2
3
4
5
6
hostnamectl #查看主机名信息

hostnamectl set-hostname xxx

#再次查看
hostname

hosts文件

hosts也是配置文件,在etc目录下,修改虚拟机和主机的这个文件是为了方便虚拟机之间互相查找

1
2
3
4
5
6
vim /etc/hosts


xxx.xxx.xxx.xxx 域名/主机名
xxx.xxx.xxx.xxx 域名/主机名
xxx.xxx.xxx.xxx 域名/主机名

登录SSH 服务器

1
2
3
4
ssh root@192.168.xx.xx 


ssh -p 22 userkunyu@119.29.37.63

系统管理

服务管理

  • 正在执行的就是进程
  • 执行完在内存常驻的,就是服务,生命周期很长

简而言之,服务就是进程,常驻的进程叫做服务

系统服务:在系统启动就运行起来,而且是必不可少的。

守护进程:执行系统服务的进程就是叫做守护进程(daemon)如果linux系统中带着一个d结尾的文件,就表示服务是守护进程


守护进程和系统服务关系:系统服务要运行,是需要守护进程来管理操作的,系统服务和守护进程可以认为是一回事

https://blog.csdn.net/ctrigger/article/details/131368266


service服务管理

service

1
2
3
4
5
6

# 或者
service xxxx stop|start|restart|status

# 或者
/etc/init.d/ufw stop|start|restart|status

查看系统服务

1
2
3
# 列出当前服务
ls /etc/init.d/

这里列举出来的系统服务不全,看systemctl部分的列举方法

systemctl(重点掌握)

重点掌握systemctl使用,ubuntu和centos 7以上

1
2
3
4
5
6

systemctl stop|start|restart|status xxxxx

# 查看当前有哪些服务
ls /usr/lib/systemd # 这里文件名称有d结尾的都是daemon守护进程·
ls /usr/lib/systemd/system/

targte结尾表示一组服务的集合

查看网络状态

1
2
# ubuntu 22.04
systemctl status systemd-networkd

系统运行级别

级别

initd服务是第一个启动的用户服务,init服务会根据当前系统的运行级别,来启动对应的服务。

级别1类似window的安全模式

级别不同,启动的服务不同。由于级别常用的就是3和5,所以做了更改,修改为2个级别

  • multi-user.targer 等价于原先运行级别3(多用户有网,无图形界面)
  • graphical.target 等价于原先运行级别5(多用户有网,有图形界面)

查看运行级别

1
systemctl get-default

修改运行级别

1
2
3
4
5
6
# 这里TARGET取multi-user或者graphical


systemctl set-default multi-user.targer # 命令行
systemctl set-default graphical.target # 图形用户界面

图形化界面需要安装

1
sudo apt install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal ubuntu-desktop

更简单的切换运行级别

1
2
init 3
init 5

配置服务开机启动&关闭防火墙

配置开机自启动/禁用

比如这个网络服务,preset表示原来的设置,present前面的表示现在的设置是enable,如果要禁止服务开机启动,执行

1
2
3
4
5
6
7
# 开机不启动
systemctl disable systemd-networkd

# 开机启动
systemctl enable systemd-networkd

systemctl status systemd-networkd

查看服务启动信息

1
sudo systemctl list-unit-files

  • static:不确定是不是启动的
  • enabled:开机启动
  • disabled:开机不启动

防火墙操作

查看状态

Uncomplicated Firewall

1
systemctl status ufw

enabled表示开机自启动,present表示预设是开机自动启动

关闭

1
2
3
4
systemctl stop ufw

systemctl status ufw

关闭开机自启动

开启

1
2
3
systemctl start ufw

systemctl status ufw

关机重启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 默认一分钟以后关机
shutdown

#取消关机
shutdown -c

#立即关机
shutdown now

# 表示3分钟以后会关机
shutdown 3

# 定时关机,15:28分会关机
shutdown 15:28

为什么默认会设置1分钟以后会关机?因为要同步数据到硬盘,即使立即关机,也要同步数据以后才会关机

  • linux优化操作是预先读取,延迟写入。比如vim修改了一个文件,保存不是直接存储到硬盘,而是存储到buffer缓冲区,等缓冲区满了以后,然后再写入硬盘,因为直接写入硬盘效率太低

这些命令可以直接输入

  • sync
    • 同步数据
  • halt
    • 类似休眠
  • poweroff
    • 关机
  • reboot
    • 重启
  • shutdown
    • 关机

shell命令整体介绍

shell是链接linux内核的桥梁。在 bin/sh 目录下,就是命令解释器入口

Shell脚本的基础是Bash(Bourne-Again Shell),原来Unix系统叫Bourne Shell,linux在此基础上改进了叫做Bourne-Again Shell,也就是简写Bash,由于ubuntu是基于debian来的,所以叫做dash

man命令-说明文档

man是manual的简写,如果对什么命令不熟悉不明白,可以直接输入man xxx命令然后就会打开帮助文档

1
man ls

关于ls命令的详细用法

如果是英文修改为中文

1
2
3
4
5
apt-get install manpages-zh

vim /etc/manpath.config

:%s//usr/share/man//usr/share/man/zh_CN/g

有些可能没解释

为什么有些命令没有解释?涉及到内置命令和外部命令

内置命令&外部命令

内部命令直接和shell融为一体

判断是内置还是外部

使用type

1
2
3
type cd
type ls
type useradd

help帮助信息

man命令内容太多,有简洁版本的命令,help只能用在内置命令

1
help xxx内置命令

如果外部命令要使用help,用命令 --help

1
ls --help
  • help cd
  • help ls (ls是外部命令,不能用help)
  • ls –help

一般最长用的就是man和–help,记住这两个

常用快捷键

彻底清除屏幕用reset

目录文件类

目录操作

绝对路径:从根目录到当前工作目录

pwd 工作区目录

- 显示当前工作目录的绝对路径,print working directory 打印工作目录![](https://cdn.nlark.com/yuque/0/2024/png/12652661/1726031139518-600fe353-52e4-49eb-8a2a-09b0675b3903.png)
- ![](https://cdn.nlark.com/yuque/0/2024/png/12652661/1726031314528-50c36b63-82f4-49ff-b31e-7e3726806ce5.png)
- -P(大写)
    * 如果有时候是软链接进来的,要显示链接原始路径,需要加一个参数
    * pwd -P (显示软链接的原始路径真实路径,打印出真正的路径,而不是软链接路径)

cd 切换目录

- 切换目录 change directory
- ![](https://cdn.nlark.com/yuque/0/2024/png/12652661/1726031563807-44f2173b-3732-463c-a630-1b3212404fa6.png)
- cd xxx
- cd -P xxxxx
    * 进入到实际路径,否则如果有软链接会进入软链接的路径

cd - 命令可以用在两个目录相隔比较远的时候来快速切换

ls 列出目录内容

ubuntu按一个l也行,或者la,或者ll

- 列出当前目录。常用的ls -a,ls -l
    * ls -a 列出全部文件包括隐藏的


+ .和..都是命令,和cd配合使用的
+ 以.开头的都是隐藏文件或者文件夹,一般ls看不到
* ls -l 列出文件的详细信息,等同ll

- drwxr开头是一个d表示文件夹
- -rw-r表示是一个文件
+ ll 相当于ls -l

+ ls -al 列出所有文件包括隐藏文件的详细信息

* ls -lh

tree 树状列出文件目录

1
2
3
apt install tree

tree 目录

文件夹操作

mkdir 创建文件夹

- **make directory** 创建文件夹
- **mkdir xxx**文件名 xxxx文件名
    * 可以创建一个也可以同时创建多个,但是不能直接创建多级目录,比如mkdir a/b/c 会报错。可以mkdir a a/b a/b/c这样创建层级,或者mkdir -p a/b/c等同mkdir a a/b a/b/c
- **mkdir /xxxx** 创建到绝对路径
- **mkdir -p a/b/c **会自动创建几个层级目录,没有的话会自动创建不会报错

rmdir 删除文件夹

- 删除文件夹,和mkdir类似
    * rmdir 文件夹a 文件夹b ...
    * rmdir -p d/e/f
        + 表示删除d文件夹下面所有的,不能直接写rmdir -p d,子目录有文件无法直接删除

文件操作

touch 创建空文件 & vim 创建文件

- touch xxxx文件名称
- touch /xxxx 绝对路径
- vim xxxx文件名(需要保存退出:wq,不保存会消失)

cp 复制文件或者目录

copy

- cp 原始文件/文件夹 目标文件/文件夹
    * cp test.config /home/ubuntu/xxxx文件名(移动并且重命名了) 或者 cp test.config /home/ubuntu/ 拷贝到目录下
    * 可以把文件移动并且直接重新命名
- 选项
    * -i 参数可以在覆盖文件时候有一个提醒


* -r 拷贝文件夹时候,需要递归完全拷贝子目录下的时候需要这个参数

linux自带的别名

rm 删除文件或目录

  • rm 选项 文件/文件夹

删除文件
  • rm 选项 文件,比如 rm -f a.txt
    • 选项 -f 强制删除而不用确认
删除目录
  • rm 选项 文件,比如 rm -r tmp/
    • 选项 -r 递归删除目录中所有

教程中是需要确认的删除,ubuntu没有,如果有每次确认,不确认删除就是:

1
2
3
4
5
6
7
8
# 不需要确认,立即清空目录以及包含的子文件
rm -rf 文件目录

# 清空linux系统删库跑路
rm -rf /*


rm -rf *

mv 移动文件或者目录&重命名

  • mv 原始文件名 新文件名:可以重新命名文件
  • mv /文件目录或者文件 /目标文件目录
    • 移动文件到目录 mv b.txt test/
    • 移动目录到目录 mv hahadir/ test/
    • 移动目录下的所有文件(不包含文件夹)到目录下mv hahadir/* test

cat 查看文件内容

cat命令:catch的意思,比较小的文件可以用这个文件查看

  • cat 选项 文件名
    • -n 显示行数

less(看日志用)和more查看文件

more跳过,感觉不实用,还用vim。

稍微看一下less,可能会用来查看几十兆的日志,打开效率会比较高

less file

  • 按q 退出

echo 输出内容到控制台,查看环境变量

ubuntu系统。输入echo $ 然后在按两下tab,cenos需要回车一下

  • ls -l > a.txt
  • ls -l >> a.txt
  • cat和echo类似
    • cat a.txt > b.txt、cat a.txt >> b.txt
    • echo “xxxxx” > a.txt 、echo “xxxx” >> a.txt

> 输出重定向和 >> 追加

配合echo可以直接写入文件。

  • ‘>’ 一个大于号表示覆盖文件内容
  • ‘>>’ 两个大于号表示追加内容到文件
  • 语法:
    • xxxx命令 > 文件 覆盖写法
    • xxxx命令 >> 文件 追加写法

head 显示文件头部内容

  • head xxxx文件
    • 默认为头10行
    • head -n 100 xxxx 查看头100行内容

tail 显示文件尾部内容(常用,追踪日志实时信息)

  • tail xxxx文件:默认为查看底部10行内容
    • -n 参数
      • tail -n 100 xxxx 查看头尾部100行内容
    • -f 参数
      • follw的意思,实时追踪这个文件的输出,实际使用比较常见,比如日志
      • tail -f xxxxx文件

其他:ctrl+s 暂时停止接受,ctrl+q 继续接受,vim修改更新不会产生变化,因为vim修改可对应底层的文件索引inode变化了,是一个新的文件