前言
与linux的爱恨情仇
一、linux初认识
1.计算机系统
1.1计算机发展相关
计算机的发展可以追溯到古代,例如中国的算盘,但真正的计算机出现是在20世纪初期。第一台电子计算机是1946年诞生的ENIAC,由于其规模庞大、构造复杂、耗电大等缺点,因此不适合个人使用。1960年代,IBM推出了大型计算机,用于商业和科学计算。1970年代,个人计算机的出现改变了计算机的历史,它可以轻松地放在桌面上,成为了家庭和办公室的必备设备。随着计算机技术的不断进步,计算机已经广泛应用于各个领域,例如工业控制、通信、医疗、教育、金融等。
电子管时代:第一代计算机(1945-1957)
晶体管时代:第二代计算机(1958-1964)
集成电路时代:第三代计算机(1965-1970)
大规模集成电路时代:第四代计算机(1972-至今)
量子计算机/生物计算机:第五代计算机(可能己经开始了)
1. 2计算机硬件和软件
1.2.1硬件
硬件设备,大体上分三类:服务器,网络设备和存储设备
服务器硬件组成
CPU:Central Processing Unit,即中央处理器。由控制器和运算器构成,是整个计算机系统中重要的部分
CPU 指令集分类:
CISC:Complex Instruction Set Computer,复杂指令集
RISC:Reduced Instruction Set Computer,精减指令集
电脑端:x86-CISC
移动端(手机):arm-RISC
内存:CPU对外部存储中程序与数据进行高速运算时存放程序指令、数据
和中间结果的临时存储器,物理实质就是一组具备数据输入输出和数据存储功能的高速集成电路;是CPU能直接寻址的存储空间,由半导体器件制成
·内存速度快,价格高,断电后数据丢失
·外存(硬盘,U盘,软盘,光盘)速度慢,价格相对低廉,断电后数据可以保存
硬盘:计算机用于永久存储数据和程序的设备。
硬盘分类:
机械硬盘HDD(Hard Disk Drive)
固态硬盘SSD(Solid State Drives )
电脑的各个设备部件之间的延时从高到底的排列,依次是机械硬盘、固态硬盘、内存、CPU
CPU最快,一个时钟周期是0.3纳秒,内存访问需要120纳秒,固态硬盘访问需要50-150 微秒,传统硬盘访问需要1-10毫秒, 网络访问最慢,都是几十毫秒。
存储器越往上速度越快,但是价格越来越贵, 越往下速度越慢,但是价格越来越便宜。正是由于计算机各个部件的速度不同,容量不同,价格不同,导致了计算机系统/编程中的各种问题以及相应的解决方案
容易混淆的几个概念:
并发
需要多个程序“同时”运行,我们要把CPU的时间进行很小的分片,让各个程序在CPU上快速轮转,造成一种多个程序同时在运行的假象,即并发。
并行
不同的程序或任务独占一颗cpu
缓存(是cpu为了更好的读取数据)
需要持久化的数据要保存到硬盘中,硬盘支持不了大量的并发访问,把最常访问的热点数据放到CPU的缓存中, 其实CPU也确实就是这么做的,但是CPU的L1, L2, L3级缓存实在是太小,把热点数据放到速度稍慢的内存中,应用程序的缓存就出现了。
缓存数据和数据库数据怎么保持一致性?缓存如果崩溃了该怎么处理?数据在一台机器的内存放不下了,要分布到多个机器上,怎么搞分布式啊,用什么算法?
缓冲(为了更快的写数据)
1.2.2计算机软件
计算机软件包括操作系统、应用软件等
应用软件:用于实现具体功能的软件,例如办公软件、图像处理软件、游戏等。
1.2.2.1 操作系统
操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
1.2.2.1.1主要功能:
硬件驱动、进程管理、内存管理 、网络管理、安全管理、文件管理
1.2.2.1.2OS分类:
服务器OS:RHEL,CentOS,Rocky,Ubuntu,Windows Server,AIX
桌面OS:Windows 10,Mac OS,Fedora
移动设备OS:Andriod,IOS,AliOS,HarmonyOS
1.2.2.1.3操作系统相关概念
接口:操作系统通过接口的方式,建立了用户与计算机硬件的沟通方式。用户通过调用操作系统的接口来使用计算机的各种计算服务。
操作系统一般会提供两个重要的接口,来满足用户的一些一般性的使用需求:
命令行:实际是一个叫shell的终端程序提供的功能,该程序底层的实质还是调用一些操作系统提供的函数
窗口界面:通过图形窗口程序接收来自操作系统的消息,比如:鼠标、键盘动作,进而做出一些响应
API
Application Programming Interface,应用程序编程接口,API定义了源代码和库之间的接口,因此同样的源代码可以在支持这个API的任何系统中编译
API 应用程序接口是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。
POSIX
Portable Operating System Interface 可移植的操作系统接口
IEEE在操作系统上定义的一系列API标准
POSIX兼容的程序可在其它POSIX操作系统编译执行
(把常用的函数、接口在不同的操作系统和平台上统一)
用户和内核空间
用户空间: User space
用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃,内核也不受影响
只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(system call),才能向内核发出指 令
内核空间: Kernel space
是 Linux 内核的运行空间
可以执行任意命令,调用系统的一切资源
str = "www.magedu.com" x = 100 #用户空间
file.write(str) #切换到内核空间
y = x + 200 #用户空间 #切换回用户空间
说明:第一行和第二行都是简单的赋值运算,在 User space 执行。第三行需要写入文件,就要切换到 Kernel space,因为用户不能直接写文件,必须通过内核安排。第四行又是赋值运算,就切换回 Userspace
编程语言
低级语言:计算机能理解的语言,二进制
机器语言: 0和1
汇编语言:和机器语言一一对应,与硬件相关的特有代码、驱动程序开发
高级语言:人类语言实现,比如,英文,中文
java , python ,go , php ,Objective-C ,C#,易语言(中文),应用级程序开发
C 语言,系统级应用、驱动程序
1.2.2.1.4各种操作系统
服务器三大操作系统
Windows
Linux:GNU/Linux
Unix: 1969年 Ken Thompson
1.2.2.2Linux操作系统
Linux操作系统:
完整的类UNIX操作系统
Linux内核+ GNU工具=Linux/GNU
如: CentOS , Ubuntu ,Android
Linux的内核版本组成
主版本号、 次版本号、 末版本号、 打包版本号 、 厂商版本
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/376207706f0ca2ed8e99aab995255cef.png)
1.3 linux安装
安装VMware、Rocky8.6、Ubuntu 22.04
链接: link
二、linux基础入门
linux基础
用户类型
root 超级用户:高权限
普通(非特权 )用户:权限有限
设置主机名
#临时生效
hostname NAME
#持久生效 ,支持CentOS7和Ubuntu18.04以上版本
hostnamectl set-hostname NAME
登陆提示
登录前提示:/etc/issue
登录后提示:/etc/motd
cxn@ubuntu2204:~$ cat /etc/issue
Ubuntu 22.04 LTS \n \l
关机重启
帮助命令
type:区分内部外部命令
内部命令:help command
外部命令:
COMMAND --help|-h
man COMMAND
#man[选项...] [章节] 手册页 ...
man passwd #默认打开第一章帮助
man 5 passwd #指定第五章帮助
man 9 passwd #总共9个章节,中间的数字不能超过9,如果要找的章节里面没有对应的内容,则会提示没有
man 10 passwd #总共9个章节,中间的数字不能超过9,如果是数字大于9,则直接定位到最小的章
man -a passwd #打开所有帮助
man -f passwd #显示passwd 相关的章节,相当于whatis passwd
man -k passwd #在man手册中搜索所有与passwd相关的内容,使用whatis数据库
man -w ls #显示ls的man 文件路径
man -aw passwd #显示所有跟passwd有关的man文件路径
man -w 5 passwd #显示第5章的passwd的man文件路径
root@ubuntu2204:~# whatis passwd
passwd (5) - the password file
passwd (1ssl) - OpenSSL application commands
passwd (1) - change user password
root@ubuntu2204:~# man 5 passwd
---------------------------------------
cxn@ubuntu2204:~$ man -w ls
/usr/share/man/man1/ls.1.gz
cxn@ubuntu2204:~$ man ls
cxn@ubuntu2204:~$
cxn@ubuntu2204:~$ man /usr/share/man/man1/ls.1.gz
三、 文件管理和IO重定向
文件系统目录结构
文件类型及颜色标识
文件操作命令
路径:pwd
绝对路径和相对路径
基名: basename,只取文件名而不要路径
目录名: dirname,只取路径,不要文件名
更改目录:cd [-L|[-P [-e]] [-@]] [dir]
列出目录内容:ls [OPTION]… [FILE]…
查看文件状态 stat
确定文件内容:file [options] …
文件通配符模式 wildcard pattern
预定义的字符类
创建空文件:touch
复制文件和目录:
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
移动和重命名文件:mv rename (可以批量修改文件名)
删除:rm
显示目录树 tree
创建目录 mkdir
删除空目录 rmdir
文件元数据和节点表结构
IO 重定向和管道
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标
标准输出和错误重新定向
COMMAND OPERATOR FILE|DEVICE
#覆盖操作符,如果文件存在,会被覆盖
> #把STDOUT重定向到文件
1> #同上
2> #把STDERR重定向到文件
&> #把标准输出和错误都重定向
>& #和上面功能一样,建议使用上面方式
#追加操作符,在原有文件的基础上追加内容
>> #追加标准输出重定向至文件
1>> #同上
2>> #追加标准错误重定向至文件
标准输入重定向
tr
管道
使用管道,要求前一个命令必须支持标准输出,后一个命令必须支持标准输入;
COMMAND1|COMMAND2|COMMAND3|…
用户权限和文件权限
Linux安全模型
通过3A(认证、授权、审计)实现资源分配,登陆成功后系统会自动分配一个令牌token,包含用户标识和组成员等信息。
1、用户:linux中每个用户是通过UID来唯一标识的
1、管理员:root,0
2、普通用户:1-60000自动分配
系统用户:(centos6之前)1-499,(centos7)1-999
登录用户:(centos6之前)500+,(centos7)1000+
2、用户组:linux中可以将一个或多个用户加入用户组中,用户组是通过GID来唯一标识的
1、管理员组:root,0
2、普通组:
系统组:(centos6之前)1-499,(centos7)1-999
普通组:(centos6之前)500+,(centos7)1000+
3、用户和组之间的关系
1、用户和主要组:用户必须属于一个组且只有一个主组,默认创建用户时会自动创建一个与创建用户同名的组,作为用户的主要组,由于此组只有一个用户,即又称为私有组。
2、用户的附加组:一个用户可以属于零个或多个附属组。
4、linux安全上下文:运行中的程序,即进程,以进程发起者的身份运行,进程所能访问资源的权限取决于进程的运行者身份
Linux常见的权限,属性及ACL
r–(4)读 -w- 2)执行 --x (1)写
用户在系统的存储文件
文件 含义 包含内容
/ etc / passwd 用户信息文件 用户名称:用户密码:uid:gid:说明:家目录:默认shell
/ etc / group 用户组信息文件 组的名字:组的密码:组的id:组的成员
/ etc / shadows 用户认证信息文件 用户名称:密码(sha512非对称加密)
/ home / username 用户家目录(用户建立所属目录)
/etc /sudoers 权力下放文件
用户的建立
命令 含义
useradd 用户名 创建用户
useradd -u 111 用户名 创建用户的同时指定用户uid
useradd -g 21 用户名 创建用户且指定用户初始组id,“21用户组必须是存在的”
useradd -G 21 用户名 创建用户且指定用户附加组id,“21用户组必须是存在的”
useradd -c “hello”用户名 创建用户且指定用户说明为“hello”
useradd -d /home/lee 用户名 创建用户且指定用户家目录为/home/lee
useradd -s /bin/sh 用户名 创建用户且指定用户的默认shell
用户信息的更改
用户信息的直接修改:不用删除原用户,在已有用户上修改用户信息
命令 含义
usermod -l 新用户名 原用户名 更改用户名称
usermod -u 6666 用户名 更改用户uid
usermod -g 21 用户名 更改用户初始组信息
usermod -G 21 用户名 更改用户附加组信息
usermod -aG 72 用户名 添加用户的附加组
usermod -G “” 用户名 删除所有附加组信息
usermod -c “hello” 用户名 更改用户说明为“hello”
usermod -d /home/lee 用户名 更改用户家目录的指向
usermod -md /home/lee 用户名 更改用户家目录的指向和家目录的名字
usermod -s /bin/sh 用户名 更改用户的默认shell
usermod -L 用户名 冻结用户
usermod -U 用户名 解锁用户
修改文件所有者
chown 用户名 文件名
user : 新的文件拥有者的使用者 ID
group : 新的文件拥有者的使用者组(group)
-c : 显示更改的部分的信息
-f : 忽略错误信息
-h :修复符号链接
-v : 显示详细的处理信息
-R : 处理指定目录以及其子目录下的所有文件
–help : 显示辅助说明
–version : 显示版本
vim的几种模式及常见的操作
1)如何打开文件。并在打开文件(命令模式)之后如何退出文件。
vi nn.txt :q
2)打开文件(命令模式)之后,进入插入模式。并在插入模式中如何回到打开文件的状态(命令模式),并在命令模式之后如何退出文件。
vi nn.txt
i
esc
:wq
3)打开文件(命令模式)之后,进入插入模式,编写一段话,“马哥出品,必属精品”, 之后从插入模式中如何回到打开文件的状态(命令模式),并在命令模式之后如何退出文件。
4)使用cat命令验证文件内容,是刚刚自己写的内容。
5)(可选),命令模式下,光标在单词,句子上进行前后,上下跳转。行复制粘贴。行删除。
复制yy 粘贴p
dd光标所在行删除