ubuntu 安装
本课程使用 ubuntu 系统。
ubuntu 官网 - download。
上面会显示有两个版本,每年 ubuntu 发布两个版本,LTS 是长期维护版,所以相对会较稳定。
介绍
Linux 发行版本
不管什么版本,内核都是一样的。
- RPM based,如 red hat,centos7.
- dpkg based,如 ubuntu,debian。
- gentoo,基于源代码编译。
linux from scratch 网站可以帮助我们以源代码的方式写一个自己的操作系统。
live CD
在光盘上的操作系统。比如电脑操作系统崩溃了,我们想把数据拷出来再重装,但是操作系统都崩了怎么用啊。这时就可以用到这种光盘,插进去拷贝。
学习方法
放弃 GUI,使用 CLI。
查询资源:
- linux 自带:/usr/share/doc 目录下。
- TLDP
- CLDP,该项目已终止。
入手准备
软件准备
apt-get
apt-get update //先查看一下服务器上软件的最新版本
和 windows 不同,不是一开始创建的用户就是 admin 的,linux 创建的账户只给你必要的权限。更多权限需要申请。
sudo apt-get update # sudo: 执行此语句的时候,临时把用户设置为 root
sudo apt-get upgrade # 根据之前获取的最新版本,更新软件
一种报错的解决方案:【已解决】Could not get lock /var/lib/dpkg/lock-frontend_could not get lock /var/lib/dpkg/lock-frontend. it_Bungehurst的博客-CSDN博客。
不过前提肯定也是:你当前的用户可以有 Sudo 权限。(super user do)
镜像源
前面 apt-get 的时候我们可知,是通过 http://cn.archive.ubuntu.com/ubuntu 网站获取的最新软件。可能这个网站不适合自己的系统,我们可以更换源。
nano /etc/apt/sources.list
,nano 是编辑器,源在 sources.list 文件中。
jammy 是不同 ubuntu 版本各自的一个代号。
可以百度搜索一些镜像网站替换,一般这类网站是支持大部分版本的。
该文件是只读的,需要 sudo 权限。改好后 write out。
改完后一定重新 update 一下!
软件安装包清除
存放于 /var/cache/apt 下。
archives 文件夹下可见有很多 deb 文件。du -sh .
可以查看大小。
sudo apt-get clean
清除下载的所有软件包。
安装文件
sudo apt-get install 软件名
查看需要安装的软件包名字: apt-cache search 软件名
。
可以通过正则表达式限定搜索结果,如 search "^mysql"
即只在包名或包描述行首出现 mysql 的软件包。
dpkg 相比 apt-get ,就只下载 deb 包,不会安装软件,也不会连带把关联的依赖软件也下载。
dpkg -l
查看当前安装了哪些包。
dpkg -L 软件包名
查看某一特定包的安装信息。
卸载文件
sudo apt-get remove [--purge] 软件名
,purge 是把其配置文件也删掉。
当然也可以手动 dpkg -L rm 删掉里面的所有内容,但是这样删不掉 apt-get 里的数据库信息,也就是说 apt-get 里还是记载了这个软件的而实际上已经删除掉了,对应不上。所以不建议这样使用。
WSL
相比 VMWare 创建一整个虚拟机,windows 支持 WSL 软件把我们的 win 系统模拟成 linux 系统。
在 windows 功能中打开 linux 项,在应用商店中安装 ubuntu,重启后打开 ubuntu 就是新的页面。
我们还可以在 windows terminal 中找到 ubuntu。在设置-启动配置文件中可以设置打开时默认就打开 ubuntu。
相比较 VMWare 还是有好处的,比如可以拍摄快照紧急恢复。
登录
Unix 其实是多用户操作系统,每个用户使用 ID PWD 登录。
登录
首先确认自己的机器与某台 Unix 相连(ssh),或者自己的机器本身就是 Unix,通过控制台登录。允许别人远端登录的服务器需要执行 openssh server
。以前用的是 telnet 和 telnetd,但是这种传输数据方式是补码,不安全。
为了保证安全,账号密码错误之后不会告知具体是账号错了还是密码错了,而且核对账号密码还有一定的延迟时间。
黑马课程使用 finalshell 连接到 VMware 里的 linux 系统,跨越了 vmware 使用会方便很多。
查看 linux 系统的 ifconfig 中的 ens33 inet 项,利用这个 ip 地址实现远程连接。需要先在 linux 中安装 ssh 相关内容。
退出
logout 或 exit 或 ^d.
关机
关机重启需要权限。
shutdown -h now
或 halt
或 init 0
.
重启
reboot
或 init 6
.
修改密码
passwd
Shell
一个到 linux 操作系统的界面,便于我们运行程序。操作系统内核是一个球心,Shell 则是外层的一层球壳(nb)。我们通过 shell 发送指令。
shell 配置在 /etc/passwd 下,每条记录的最后一个字段。使用 more 查看该文件可以看到其信息:
用户名:密码(x 代表有密码):userId:groupId:desc:家目录(该用户初次登录时处于哪个目录):该用户使用的 shell
。
不同 shell 支持的命令不同,是否支持命令行编辑(如上下键,快捷键),是否支持历史记录(history
, !编号
, !!
),配置文件的设置,环境变量,命令行提示符(prompt string),编程方式等都有不同。现在常用的是 bash。
还有基于文字的图形化 shell,和图形化 shell。
入门
结构
树形结构,没有诸多盘符,所有文件在根目录 / 下。
windows 层级关系用 \ 表示,linux 层级关系还是 / 符号。
命令基础
命令通用语法:command [-option] [parameter]
,options 表示参数细节,parameter 表示具体执行目标。
如 ls -l /home
,就是以列表形式列出 home 下所有文件。
ls:平铺形式列出当前文件夹下所有文件。
- options -a: 列出所有文件包括隐藏文件。
- options -l:每个文件一行,一列表形式展现,并且还会展现每个文件的详细信息(如创建日期)。
- options -a -l 或 -al 或 -la:同时应用 -a -l。
- options -h:必须和 -l 一起使用。在以列表形式列出全部文件的前提下,每个文件的文件大小缩写(K M G)。
- parameter:要列出的目录路径,默认为当前工作目录。
打开系统时默认用户目录为当前工作目录。linux 里是 /home/usrname, windows 里是 c:\user\usrname
pwd:查看当前目录。
cd:进入特定目录。
- parameter 特定目录地址:进入该路径。 / 开头是绝对路径,没有是相对路径。
- parameter .:表示当前路径。如
cd ./home
。 - parameter … :向上一级路径。
- parameter ~:进入当前用户的 home 路径。
mkdir:创建目录。必须加参数,表示路径。
- options -p:如果父路径不存在,是否也新建父路径。-p 表示新建。
- parameter 特定目录地址:要创建的目录及其地址。
创建文件夹需要权限。因此一定在 home 内创建,在外面创建无法成功。 后面详细介绍权限管控。
touch:创建文件。参数必填,无选项。
ls -l 开头是 - 号的是文件,没有 - 号的是文件夹。
cat:查看文件。参数必填,是要查看的文件的路径和文件名;无选项。
more:同 cat,但是是以分页的方式查询的。空格翻页,more 退出。
cp:复制文件,参数1 2必填。
- options [-r]:如果复制的是文件夹使用,代表递归。
- parameters 路径1:要复制的文件或文件夹。
- parameters 路径2:要复制到的目标文件夹。
mv:移动文件。
-
parameters 路径1:要移动的文件或文件夹。
-
parameters 路径2:要移动到的目标文件夹。如果只写路径,表示移动到该路径下;如果再加文件名,表示移动到该路径下并重命名。
rm:删除文件。
- options -r:用于文件夹删除。
- options -f:强制删除,不会弹出提示信息。root 用户会弹。
- parameters 文件1 文件2 文件n:要删除的文件。
* 是通配符,如 *test
代表以 test 结尾的任何内容。
这里学到了一个小技巧,我的 root 密码不是默认的12334556,但是通过 sudo su
的方式居然登录成功了。
which:查找指令。
上面学到的指令都是以二进制文件形式存放在 linux 中,类似 .exe 文件。我们可以通过 which 查找这些指令。
- parameters 指令名。如
which ls
find:查找文件。
find dirName -name fileName
可以基于通配符 *
模糊查询。
find dirName -size +|-n[K|M|G]
查找大于|小于 n K|M|GB 的文件。
grep:查找文件中符合字符串或 regex条件的行。
grep [-n] 关键字 文件路径
-n 表示是否显示行号。
关键字因为可能有特殊字符,建议用双引号包裹。
wc:统计文件中的行数,单词数量等信息。
wc [-c -m -l -w] fileName
-c:统计 bytes 数量。
-m:统计字符数量。
-l:统计行数。
-w:统计单词数。
管道符 |:管道符左边的结果作为右边的输入。 options 输入或 parameters 输入都可以。
cat abc.txt | grep abc1
.
grep 的文件路径可以由管道符输入。比如上例为:查找 abc.txt 中的内容 abc1.
或者如 ls -l | grep abc
,只查看名称带 abc 的文件的详细信息。
ls -l | wc -l
统计文件数。
echo :输出。如 echo 'hello world'
,然后就会输出 hello world。
如果加反引号 ` 输出,其中的内容会以命令形式执行而不是普通字符。如 echo `pwd` .
重定向符 >:把左侧内容覆盖写入右侧。如 echo 'hello world' > abc.txt
,就把 abc.txt 的内容覆盖为这一行:hello world 了。
>> :在末尾追加写入。
tail :查看文件尾部内容。
- options [-f]:表示持续跟踪,会实时更新。
- options [-num] :表示查看末尾的行数,默认10行
- parameters 文件路径。
vi 编辑器
linux 中最经典的文本编辑器。
vim 兼容 vi,还可以编辑 shell 程序,可以通过颜色辨别语法正确性。
有三种模式:
命令模式 command mode :所按的键都是命令。不能编辑文本。
输入模式 insert mode :可编辑文本的模式。
底线命令模式 last line mode : 以 : 开始,通常用于保存、退出文件。
vi 文件路径
.文件已存在则打开,不存在则新建。最下面一行显示了是 new file 还是 open file。
按 i 进入输入模式。按 : 进入底线命令模式。两种模式都是按 esc 回到命令模式。
命令模式有一些快捷指令,如 yy 复制当前行,p粘贴,dd 删除,u 撤销。
底线模式 w 保存写入,q 退出当前文件。q! 强制退出。
set nu:显示行号。
set paste:设置粘贴模式。开启后,输入模式下粘贴的内容会原封不动地粘贴。
用户
root
Linux 中权限最大的用户。我们注册的那个账户不是 root 用户,权限不足,比如不能在根目录下新建文件。
每个用户只有在自己的 home 下有最大权限,其他地方只有只读、执行权限,无修改权限。
可以通过 su [-] root
(好像默认密码 1234556,但是我的不是,不知道是新版本的问题还是设置虚拟机时没注意)或 sudo su [-] [root]
登录,默认切换到 root 用户,可换用户名。我们已经知道可以通过 sudo 命令临时获取权限。
exit
或 ctrl+d 返回上一个用户。普通用户切换用户需要密码,root 切换不用。
sudo
root 并不安全,还是 sudo 执行单条指令较为安全。当然用户需要有 sudo 权限才可以使用。
sudoers 文件编辑
每隔一段时间使用 sudo 命令就需要重新输入密码。可以配置使得不用手动输入吗?
有个 sudoers 文件,存放于 etc/sudoers 下。可以直接通过 sudo visudo
编辑。
打开后还是通过 nano 编辑器编辑。但区别在于,修改的内容不会直接修改在原文件中,而是先保存在 tmp 文件中。
然后系统会检测 sudoers 文件的语法,语法错误会问你是否保存,或重新修改。一定不要保存错误的修改!!! 因为如果 sudoers 文件出错了,以后就使用不了 sudo 命令了,而且想再修改 sudoers 文件也要用到 sudo 命令,也改不了了。
添加一句:
%adm ALL=(ALL)NOPASSWD:ALL
,adm 是用户名。意为 adm 组里的所有用户使用 sudo 的时候都不需要密码,而且对于任何指令都是如此。
用户和用户组
linux 中可以配置用户,配置用户组,每个用户可以在多个组里。
可以针对某一用户设置权限,也可以针对用户组。
用户
useradd [-g -d] userName
-g:指定所在组。不指定会自动创建同名组并加入。如果已经存在同名组,必须加 -g。
-d:指定用户 home 路径,不指定自动在 /home/userName 下。
userdel [-r] userName
-r:删除 home 目录。
id [userName]
查看用户,默认看自己。
用户组
groupadd groupName
groupdel groupName
usermod -aG userName groupName
使用 getent passwd
或者查看 /etc/passwd 内容,逐行显示:
用户名:密码(x 代表有密码):userId:groupId:desc:家目录(该用户初次登录时处于哪个目录):该用户使用的 shell
。
getent group
查看组信息。
权限
ls -l
文件列表也可以查看权限。
第一列:文件的权限控制信息。
第三列:所属用户。
第四列:所属用户组。
文件权限控制信息10位,分别的意义:
软链接之后再展开说~
r:读。w:写(增、删、改名文件夹,在文件夹中创建文件)。x:执行(cd 此文件夹)。
chmod 改权限
chmod [-R] 权限 文件或文件夹
-R 表示对文件夹内所有子内容都应用这个权限。
权限形如 u=rwx, g=rx, o=x
。
当一个文件权限为 rwxrwxrwx 时,这个文件在 ls -l
中会以红色显示。
快捷修改权限方法:
比如我们想把一个文件设置为 rwx rx x,即二进制 7 5 1,chmod 715 test.txt
.
chown 改权限控制
直接把一个文件或文件夹改主人。
chown [-R] [user]:[userGroup] 文件或文件夹
,-R 同样表示迭代。
chown usr test.txt
chown :usrGroup test.txt
不过,普通用户没有权限执行这条指令,只有 root 用户可以执行。
实用操作
快捷键
输错了命令,或程序想提前停止,可以按下 ctrl+c 强行停止。
ctrl+d 可以退出当前账户登录,或退出当前程序专属页面。
history
查看历史输入的命令。
! 可以自动匹配最近一次输入的,匹配前缀的内容。如输入 !p
,最近一次输入的 p 开头的命令是 python
,就会执行 python
。
不过这个从下往上匹配并不那么方便。如果找远一点的历史记录,可以 ctrl+r ,类似我们平时使用的 ctrl+f。
光标移动:ctrl+a 是 home,ctrl+e 是 end,ctrl+← 是光标向左跳一个单词,ctrl+→ 是向右跳一个单词。
ctrl+l 或 clear 清屏。
软件安装
安装包,如 windows 常用下载 .exe 文件或 .msi 文件,点击安装。mac 常用 dmg pkg 文件。
linux 是 rpm, deb 文件,centos 通过 yum 安装,ubuntu 通过 apt 安装。
yum
yum [-y] [install | remove |search] fileName
-y:无序确认,直接安装。
yum 需要联网,需要 root 或 sudo 权限。
apt
apt [-y] [install | remove |search] fileName
systemctl
linux 很多软件使用 systemctl 启动,停止,开机自启。
systemctl start | stop| status | enable | disable 服务名
enable disable 用于调整是否开机自启。
服务例如:
-
NetworkManager 主网络服务
-
network 副网络服务
-
firewalld 防火墙
-
sshd, ssh 服务(finalshell 用于远程控制 linux 的服务)
status 有 active 和 inactive。
很多系统或第三方软件是自动继承到 systemctl 中的。不过也有很多没有,后面再说对于这类软件要如何处理。
软链接
把文件、文件夹链接到其他位置,类似 windows 的快捷方式。
ln -s 被链接的文件或文件夹 要链接到的目的地
日期和时区
date [-d] [+格式化字符串]
如 date "+%H-%M-%S"
-d 可以进行日期计算,如:
date -d "-1hour" "+%H-%M-%S"
,在当前时间基础上-1.
修改时区
先删掉现在的时区文件。
rm -f /etc/localtime
然后从时区文件中挑选上海,创建软链接。
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntp 自动校准系统时间
首先 ntp 程序需要安装。
然后 systemctl start ntpd system enable ntpd
ntpd 会自动联网帮我们校准时间。
这里好像 ubuntu 系统启动 ntp 服务需要输入的是 ntp?还是说,这是新版 ntp 的设定?反正我执行的代码是systemctl start ntp
手动更新时间:ntpdate -u ntp.aliyun.com
(ntpdate 好像也要更新)
网络传输
IP
IP 地址是每台联网的计算机独有用于标志自己,与其他计算机通信使用的。
有 V4 和 V6 两个版本,V6 不常用。
IP 地址是四个 0~255 的数字的组合。可以通过 ifconfig 查看(查看不了需要安装 net-tools),主网卡:ens33 中的 inet 选项即为 IPV4 地址。lo 网卡是本地回环的网卡,virbr0 是虚拟机专用的网卡。
127.0.0.1:代指本机。
0.0.0.0:代指本机;或在端口绑定中确定绑定关系;或在一些 IP 限制中表示全部 IP 地址放行。
主机
除了 IP 地址,每台计算机有一个自己的名字,叫主机名。linux 输入 hostname
查看。
可以通过 hostnamectl set-hostname newName
来修改当前主机名,需要重新登陆 finalshell 才能查看。
域名解析
我们知道一般我们访问网站是通过更方便记忆的域名(如 www.baidu.com )来访问的。
域名和 IP 之间通过 DNS 系统映射。先查看本地 DNS 库是否有记录要访问的域名,如果没有再联网到 DNS 公开服务器寻找该地址。
windows 本地域名存储文件在:C:\Windows\System32\drivers\etc\hosts
,linux 在 /etc/hosts
当我们在 windows 本地设置了 linux IP 地址和域名的映射,通过 finalshell 连接时就可以不用输入 IP 地址,而是输入主机名即可。
配置固定 IP 地址
linux 的 IP 地址是通过 DHCP 动态获取的,这样我们配置的域名映射随着更新就无法应用了,需要频繁更改。
VMWare WorkStation -编辑-虚拟网络适配器-VMnet8,子网设置为 192.168.88.0,子网掩码为 255.255.255.0,NAT 设置中为 192.168.88.2
这里 ubuntu 系统不太一样,是在 /etc/network/interfaces
中配置。
而我们如果使用的是桌面版 ubuntu,也不是在这里配置。参考这篇文章:Ubuntu Server20.04 静态ip配置(netplan)_Brady-wdh的博客-CSDN博客
ethernets: ens33: # 配置的网卡名称,可以使用ifconfig -a查看本机的网卡 dhcp4: no # 关闭动态IP设置,因为要设置固定IP addresses: [192.168.88.130/24] # 要设置为的固定IP,后面的24为子网掩码的位数 gateway4: 192.168.88.2 # 要设置的网关地址 nameservers: addresses: [192.168.88.2,8.8.8.8] # 要设置的DNS地址 ———————————————— 版权声明:本文为CSDN博主「Brady-wdh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_45949008/article/details/118862854
最后 systemctl restart network
,netplan 是: netplan generate
为渲染器生成所需配置,netplan apply
为渲染器应用配置。
之后, ifconfig 就一直是 192.168.88.130 固定不再改变。
ping
通过 ping 测试服务器是否可连通。
ping [-c num] IPAddress
,-c 是限定 ping 几次,如果不限定则无限检查。
这里我们可以先在 vim /etc/resolv.conf
中添加 nameserver 8.8.8.8
,这是一个 Google 提供的免费 DNS服务器 的IP地址,应该能解决如 baidu 等域名的映射。
如果无法 ping 通:显示 unreachable.
wget
非交互式下载工具。
wget [-b] url
,-b 是后台下载,并把下载信息保存到当前工作目录下的 wget-log 文件中。可以通过 tail -f 持续跟踪。
curl
发送 http 请求,可获取信息或下载文件。
curl [-O] url
-O:下载文件。
比如 curl cip.cc
,该网站会告诉我们本机的公网 IP 地址。
端口
物理端口:可见,如 USB 接口。
虚拟端口:计算机内部端口,不可见,操作系统用于和外部交互。
IP 地址是一个小区地址,程序是住户,进程就是门牌号用于找到各个用户。
linux 使用 nmap 指令查看指定主机对外暴露端口情况。
nmap 被查看的 IP
22:ssh 端口。finalshell 远程连接会使用。
netstat:查看端口占用情况。
netstat -anp | grep portNo
进程管理
为了方便管理,操作系统给运行中的程序分配进程 ID。
ps [-e -f]
查看进程信息。
-e:查看全部进程。
-f:查看全部信息。
-
PPID:父进程 ID。
-
C:CPU 占用率。
-
STIME:启动时间。
-
TTY:启动此进程的终端序号,?表示不是终端启动的。
-
TIME:累计使用 CPU 的时间。
-
CMD:启动命令或路径。
关闭进程:kill [-9] PID
,-9 强制关闭。不强制关闭的话,只是发送关闭请求,并不一定关闭。比如 tail 收到 kill 命令后会自行 terminated,但强制关闭就是被 killed 了。
主机状态监控
查看系统资源占用
top 命令,5s 一刷新,类似任务管理器。
查看磁盘使用情况
df [-h]
,-h 是以 KMG 单位显示。
查看磁盘速率
iostat [-x] [num1] [num2]
,-x 显示更多信息,num1 刷新间隔,num2 刷新次数。
查看网络状况
sar,该指令比较复杂。因此应对网络统计,我们只记一个固定的语法:
sar -n DEV num1 num2
,-n 指查看网络,DEV 只查看网络接口。num1 刷新间隔,num2 刷新次数。
环境变量
我们知道指令就是一个个可执行程序,which 可以查到。
但是为什么指令不用跳转到特定目录下就能执行?像 windows 一样,得益于环境变量。
环境变量是一种键值对型结构,记录了系统运行中需要的一系列关键信息。可以使用 env
指令查看。
其中的 PATH 中存储了一系列指令搜索路径。
环境变量开头加 $ 符号,可以获取环境变量的值。可以和 echo 结合使用。如:echo ${PATH}ABC
.
如此,我们可以把自己的程序添加到环境变量中,或把程序放到 PATH 路径下。
设置环境变量 临时生效:export virableName virableValue
针对当前用户 永久生效:~/bashrc 文件中。
针对所有用户 永久生效:/etc/profile 中。
可以通过 source 配置文件
或重启 finalshell 立刻生效。
配置 PATH :echo PATH
, export PATH=$PATH:路径
,或者把后面这句话添加到用户或系统环境变量中。
这里先写 $PATH: ,是为了和之前的 PATH 值做拼接,一定不能忽略这一步。
finalshell 传输文件
右键文件就可以把文件从虚拟机下载到本地。用哪个账号登录,看到的就是哪个账号可以看到的内容。
上传:本地文件直接拖拽到 finalshell 中。
或者下载 lrzsz 指令。下载:sz 文件
;上传:rz
,随机就会自动弹出文件框供选择。
不过上传大文件 拖拽效率 > rz 。
压缩 解压
tar:简单组装文件,大小上压缩前后无大区别。
tar.gz:使用了压缩算法,大大缩小。
tar [-c -v -x -z -C -f]
可以解压或压缩。
-c:压缩。
-v:显示进度。
-v:解压。
-z:加了是 gzip 模式,不加是 tarball 模式。
-C:解压目的地。
-f:指代被创造/解压的文件。
指令可以合起来写,不过-z 必须在开头,-f 必须在最后。如 tar -zcvf 1.tar.gz 1.txt 2.txt 3.txt
-C 要单独写。 tar -zxvf test.tar.gz -C /home/jingqing
zip 是压缩,可以加 -r 代表递归处理文件夹。zip -r test.zip /test 1.txt
unzip 解压 zip 文件,-d 指定地址类似 -C。unzip test.zip -d /home/jingqing