Linux
OpenStack vs Kubernetes
关系
简单来说,Kubernetes 管理容器,OpenStack 管理虚拟机
所以两者可以配合使用:将 Kubernetes 的容器部署在 OpenStack 的虚拟机上。这样就实现了 “在虚拟机中使用虚拟机”,提升了隔离性,但降低了性能。
K8s也可以直接用在物理机集群的,所以K8s再发展下去,OpenStack地位是不是有点危险了
OpenStack是个什么东西
早期云计算就 AWS 一家独大,后来出现了开源的 OpenStack 与其竞争,国内也有像阿里云、腾讯云等。可以简单认为,OpenStack 可以将多个物理机组成一个硬件资源池,然后使用这些资源创建一堆虚拟机供用户使用。当然不仅仅是虚拟机的管理,OpenStack 还要负责这些资源的分配、网络的配置等等。
就像 SpringBoot 框架的各项功能的实现都是各种 Starter 实现的,OpenStack 也只是一个框架,其各种功能由不同的模块实现。例如对于虚拟机的创建,就可以使用 KVM、Xen 或其他的虚拟化工具实现
参考:OpenStack介绍
虚拟机 vs 容器
KVM(Kernel-based Virtual Machine),linux系统集成的开源虚拟机管理软件,可以类比为 Vmware 等。你可以用它来将多台物理机组成一个资源池,然后创建和管理虚拟机。用它创建的虚拟机会直接使用内核调用,而不是模拟内核调用,提高了虚拟机的性能
不同于虚拟化技术要完整虚拟化一台计算机,容器技术更像是操作系统层面的虚拟化,它只需要虚拟出一个操作系统环境。
LXC技术就是这种方案的一个典型代表,全称是LinuX Container,通过Linux内核的Cgroups技术和namespace技术的支撑,隔离操作系统文件、网络等资源,在原生操作系统上隔离出一个单独的空间,将应用程序置于其中运行,这个空间的形态上类似于一个容器将应用程序包含在其中,故取名容器技术。
GNOME、KDE是什么
GNOME:GNU Network Object Environment(什么是 GNU:https://blog.woyou.cool/post/2202)
KDE:Kool Desktop Environment
早期 windows 只是 DOS 下的一个软件,启动 DOS 系统后只会进入命令行环境,需手动启动 windows 才会进入桌面环境
后面又将 windows 写入内核,每次启动系统后自动打开 windows 进入桌面环境,相当于设置了开机自启动。随着 windows 与内核的耦合性不断增大,windows 逐渐成为内核的一部分,成为了 windows 系统,并在后面彻底抛弃了 DOS 实现了翻身农奴把歌唱。
若将 linux 类比早期的 DOS 系统,则 KDE 和 GNOME 则类比于两个不同的 windows 软件,直观来说,KDE风格和windows系统类似,而GNOME则更像macos一些。
故现在 linux 系统是可以切换和选择不同的桌面环境的,例如 ubuntu 默认使用 GNOME,但可以再安装 KDE,启动系统后就可以选择使用哪一个桌面环境
安装教程:https://zhuanlan.zhihu.com/p/338666316
你也可以将 KDE 和 GNOME 类比为 Unity3D 和 UE 两种游戏引擎,或者 chrome 和 firefox 两种内核的浏览器,它们的作用就是渲染各种不同的界面,但其底层实现是不同的。
早期unix或linux没有桌面环境,后来有人开发出一套GUI接口(只是对资源的调度,并不是UI的渲染),称为 X Window,任何人都可以基于它开发出自己的GUI环境。
X Window 分为三层,unix内核、X server 和 X client。
nohup 多个命令 &
问题
我需要执行多个任务(task1、task2),要求:
-
串行执行,task1执行成功后执行task2
-
后台执行,整个执行过程不能因session中断而停止
-
每个task的输出到单独的文件中
问:以下方案中,哪些是可行的:
nohup task1 > out1 && task2 > out2 &
nohup task1 > out1 & && nohup task2 > out2 &
nohup task1 > out1 && nohup task2 > out2 &
nohup task1 > out1 & nohup task2 > out2 &
结果
上述命令都无法完成要求
原因
&& 和 &
两者都可以用来分割命令,区别在于 && 只有在前一个命令执行成功(return 0)才会执行下一个命令,而 & 只是将其前面的命令放入后台执行,并立即返回
例如:
command1 && command2 && command3
# 只有 command1 执行成功后才会执行 command2,后面同理
command1 & command2 & command3
# 当程序读到第一个 & 时,会将其之前的命令放到后台执行
# 例如,读到第一个 & 时,将 command1 切割出来并放到后台执行,此时立即返回状态,继续向后读命令,又读到第二个 & 则又将 command2 切割放到后台执行并立即返回,继续往后执行命令,由于 command3 没有 &,故其只会在前台执行
command1 && command2 &
# & 的优先级比 && 高,故该代码会先整体进入后台,然后再通过 && 分割执行
&&、&、;、||
四个都可以用来分割命令,区别在于
ubuntu22启动运行脚本
早先的系统可能使用 rc.locl 或者 init.d 的方式,但这些都已经被逐步淘汰了,ubuntu16以后推荐使用注册systemd的方式
要创建一个自启动服务(脚本),分为以下三步:
-
创建shell脚本
-
向服务目录添加服务信息
-
enable服务
例如我要创建一个mytouch服务,它会自动在启动时向桌面创建一个bingo文件
创建shell脚本 /usr/local/bin/mytouch.sh
向服务目录添加服务信息,即向 /etc/systemd/system
添加一个名为 mytouch.service 的文件,内容如下:
[Unit]
After=network.target
[Service]
ExecStart=/usr/local/bin/mytouch.sh
[Install]
WantedBy=default.target
该文件相当于服务的元信息,其内容为 INI 格式,分三个部分:
-
Unit:服务的基本信息,例如描述、依赖、启动顺序等,例如After=network,target表示网络就绪后启动脚本
-
Service:服务的执行方式,例如服务启动命令、环境变量、工作目录等
-
Install:服务的安装方式,也可以用于设置启动级别、启动顺序等,wantedBy就是用于设置启动级别的,常见的有 poweroff.target(关机时)、multi-user.target(多用户模式下)、reboot.target(重启时)等
注:这里有点问题,好像unit和install的功能重复了?
这俩文件创建完后别忘了赋予执行权限,否则,脚本不会执行,并且也没有报错,你会以为哪里写的有问题。
创建该文件就已经将服务注册进systemd了,但还需要enable服务,即执行命令 systemctl enable mytouch.service
此时系统启动就会自动运行该服务脚本了,对于本脚本来说,系统启动后就自动在桌面创建一个bingo文件
当然,既然已经注册成为了服务,就可以使用systemctl进行管理,例如可以随时使用 systemctl start mytouch.service 来执行脚本
若不想使用该服务了,执行 systemctl disable mytouch.service
然后删除上述两个文件即可
注:
-
服务注册好之后,脚本内容可以随时更改
-
脚本会以root用户权限运行
参考:
https://www.yii666.com/blog/662568.html
https://www.tutorialspoint.com/run-a-script-on-startup-in-linux
获取linux实时网速
linux中的/proc是一个虚拟目录,里面都是系统在运行过程中的各种状态,例如内存使用情况,网络情况,各个进程的运行情况等等。它是一个虚拟目录,只有在系统运行起来后才有而且仅存在于内存中。有点类似于MySQL的视图。
查看当前内存的使用情况:
查看网络的使用情况:
由此可知,如果想要计算当前的网络流速,则只需要在间隔1秒前后分别得到bytes列的数据,然后相减即可。以下为一个shell脚本:
#!/bin/bashwhile truedo init_state=$(cat /proc/net/dev | grep wlp2s0) sleep 1 end_state=$(cat /proc/net/dev | grep wlp2s0) rx1=$(echo $init_state | awk '{print $2}') rx2=$(echo $end_state | awk '{print $2}') rx_speed=$(((rx2 - rx1) / 1024)) tx1=$(echo $init_state | awk '{print $10}') tx2=$(echo $end_state | awk '{print $10}') tx_speed=$(((tx2 - tx1) / 1024)) #printf "RX: $rx_speed kbps, tx: $tx_speed kbps\r" # 打印很长的空行是为了覆盖掉前面一次的打印结果。否则如果前一次打印出很长的东西,下一次又没那么长,则下一次打印的后面会有上一次打印更长的部分 # \r控制光标返回行首,echo命令会自动在文本后面加上\n换行,-n命令就是让它不加换行符,-e命令就是让它把\r之类的特殊符号作为控制符处理 echo -ne " \r" echo -ne "RX: $rx_speed kbps, tx: $tx_speed kbps\r"done
然后使用 chmod +x test.sh
再执行 ./test.sh
即可
linux定时任务
linux下可以使用 crontab 创建定时任务
怎么用
如果是最小化安装的ubuntu可能没有该服务,可以使用 sudo apt install cron
进行安装,安装后就可以使用cron或crontab
crontab的使用方式很简单,输入 crontab -e
命令,就会弹出一个vim框,然后你就可以在里面输入 crontab 格式的指令,保存退出即可。
# 每年 6 月 12 号 晚上 23 点 59 秒输出一个bingo
59 23 12 6 * echo "bingo"
注:系统会定时执行后面的命令,且以创建者的身份执行
可以使用 crontab -l
查看创建的定时任务
另一种方式是直接将定时任务添加到 /etc/crontab
文件,cron服务会每分钟读取一次该文件看看是否有需要执行的命令,只不过和上面的格式稍有不同,你需要添加一个执行命令的用户名
# 注意,该命令会以hunt的身份执行,为什么可以指定执行的用户呢?因为修改该文件需要使用root权限
59 23 12 6 * hunt echo "bingo"
语法
几分 几点 几号 几月 周几 执行什么任务
从上面看并没有设置年份,所以你的任务最起码是以年为循环执行的
那如果我要设置两个时间,但它们只有一点不同,例如分别是 3 分钟 和 5 分钟的时候执行,那该怎么办呢?
有两种方法:
-
写两个定时任务
-
使用
,
分隔符,例如3,5 * * * * task
linux的用户和组
UID和GID
linux中每个用户都有一个UID和GID,且linux只认UID,用户名只是方便用户记忆而已,用户名和UID的关系有点像域名和ip的关系。
每个用户创建后默认会创建一个与用户名同名的组,并分配一个GID。
用户的UID和GID可以在
/etc/passwd
文件中查看到:需要注意的是,密码拦全部为 X,这是历史遗留,早期密码确实存在这里,但由于对密码安全性的要求以及密码本身添加了很多属性,所以将实际密码放到了
/etc/shadow
注1:前面说,linux只认UID,也就是说,如果此时你将 /etc/passwd 中某用户的UID改掉时,他仍然可以通过用户名登录到系统(linux只认UID说的是文件,linux是一个以文件为基础的系统),但是他之前所有的文件,仍然是绑定到他之前那个UID上的,所以他无法再访问这些文件了
注2:可以看到,除了我们自己创建的用户外,还有很多其他的用户,这些用户都是系统自己用的,勿动
group的相关信息保存在
etc/group
文件中所以,要想让某个用户加入一个组,最简单的方法就是直接改 etc/group 这个文件,将该用户名添加到某个组第4列中
用户可以通过 groups 或 id 命令查看自己的组:
另:既然加入了一个组就能操作该组的文件,那么如果加入了多个组,我创建的文件是属于哪个组呢?
组也有默认组的概念,即通过groups命令得到的第一个组就是你创建文件所属的组。可以通过newgrp命令修改默认组
作用
需要注意的是,即使你将某个用户放到 adm 或 root 组下面,他仍然不能执行sudo命令,因为,所谓用户或组,指的只是对文件的 rwx 权限,只能说他现在可以操作 adm 或 root 组的文件,即文件权限符号的中间三个字符:
-rwxr-xr-x // 文件所有者权限,组成员权限,其他人权限
忘记密码?
如果是普通用户忘记密码,可以让root用户通过 passwd 命令直接修改密码而不需要输入原来的密码
如果是root忘记密码,则也有解决办法,前文说到,密码都保存在 /etc/shadow 文件中,此时只需要想办法进入该文件并将密码清空即可。进入该文件的方法有:1)使用linux本身提供的恢复模式等。2)使用类似windows的PE系统的做法,将linux的系统盘挂载到其他系统下进行读取和修改内部文件
ACL
一个文件或文件夹只能设定针对ower、一个group和其他人的权限,假如我有一个文件,我希望有些人/组可以读写,而另一些人/组只能读,那该怎么办呢?
linux提供了一套更为精细化的权限管理系统ACL,它可以针对某文件或文件夹单独对某个用户/组设置权限,用法为:
setfacl -m d:u:user_name:rwx file
(其中的 d 指递归权限,即用户进入该目录内部创建的文件或目录也具有该ACL权限)和getfacl file
sudo
前文说,用户组只是对文件访问权限的控制,而真正要想使用sudo需要专门对
/etc/sudoers
文件进行修改此时,zh这个用户就能使用sudo权限了
注1:要想使用户具有sudo权限,只需要修改这个文件即可,不需要将用户添加到特定的组
linux下目录的rwx权限
linux下的文件有rwx权限好理解,但目录的rwx权限如何理解呢?
你可以这样理解,目录也是一个文件,文件的内容就是目录中所有的文件名
当一个目录具有r权限时,你就可以ls该目录,查看该目录下有哪些文件,效果等同于cat查看一个文件的具体内容。
当一个目录具有w权限时,你就可以在该目录下创建新的文件或删除里面的文件
当一个目录具有x权限时,你就可以进入到该目录,这一点有些不好理解,当我具有r或w权限时,还不能进入目录吗?
不行的,见下方实验
甚至于此时,我就算有w权限,也无法新建或删除目录下的文件,这一点貌似有点疑惑,难道w权限必须配合x权限使用?
linux的du和df命令
du
查看文件或文件夹磁盘占用情况,类似于windows下文件属性df
查看分区占用情况,类似于查看“我的电脑”du
-
-a
表示统计所有文件和文件夹,否则只统计文件夹 -
-d num
表示统计文件夹最大深度,不指定则递归统计所有文件夹及其子文件夹。
df
df是查看分区使用情况,不指定目录就返回所有分区,指定目录则返回该目录所在分区情况
-