以下内容部分是上课讲过的,另一部分我自行补充的 (^v^)
Linux
关掉防火墙和SELinux
1 2 3 4 5 6
| systemctl disable firewalld && systemctl stop firewalld
setenforce 0
sed -i "s|SELINUX=enforcing|SELINUX=disabled|g" /etc/selinux/config
|
LVM扩容
1 2 3 4 5 6 7 8 9
| pvcreate /dev/sdc pvs vgs vgextend centos /dev/sdc lvs lvextend centos/root /dev/sdc xfs_growfs /dev/mapper/centos-root
lsblk -ip
|
RAID 磁盘阵列
各RAID级别
RAID(冗余磁盘阵列)
是将多个硬盘组合成一个逻辑磁盘,从而提高数据存储的效率和可靠性。常见的 RAID 等级有以下几种:
RAID 0
:又称条带化,将数据分块后交替写入多个物理磁盘,以达到提高数据读写性能的目的。但该模式没有冗余备份,一旦任意一块硬盘出现故障,整个 RAID 0 即失效,所有数据都无法恢复。
RAID 1
:又称镜像,使用两块相同的硬盘存储相同的数据,实现数据冗余备份。当其中一块硬盘损坏时,另一块硬盘可以继续工作,并且可以从备份中恢复数据。但是相比单个硬盘,RAID 1 存储容量只有单个硬盘的一半。
RAID 5
:使用三块或更多的硬盘,其中一个硬盘用于存储校验信息,其余硬盘存储数据。在发生某个硬盘损坏时,可以通过校验信息进行数据恢复。RAID 5 除了具备数据冗余功能之外,还可以提高数据读取速度。但是在写入数据时,需要进行额外的校验计算,因此写入效率相对较低。
RAID 6
:和 RAID 5 类似,不同点在于使用两个硬盘来存储校验信息,可以容忍两块硬盘的故障。RAID 6 模式虽然提供更高的可靠性,但是需要额外的存储空间用于存储冗余信息,因此存储容量和效率都要比 RAID 5 稍低。
RAID 10
:又称为 RAID 1+0 或镜像条带化,将多个 RAID 1 组成一个 RAID 0 阵列。即先进行数据的镜像备份(RAID 1),再利用这些镜像数据来进行条带化(RAID 0)。RAID 10 同时具备了数据冗余和读写速度的优势,但是需要至少四块硬盘才能实现。
总之,使用哪种 RAID 等级取决于应用场景,在性能、容错能力、存储成本、存储容量、读写速度等方面需要做出权衡。
软件RAID5
1 2 3 4 5 6 7 8
| fdisk /dev/sdb mdadm --create /dev/md0 --auto=yes --level=5 --raid-devices=3 /dev/sdb{5,6,7}
mkdir /data01 mkfs.xfs /dev/md0 mount /dev/md0 /data01 echo "/dev/md0 /data01 xfs defaults 0 0" >> /etc/fstab
|
corntab 计划任务
语法
1 2
| crontab [ -u user ] file crontab [ -u user ] { -l | -r | -e }
|
1 2 3 4 5 6 7 8
| * * * * * - - - - - | | | | | | | | | +----- 星期中星期几 (0 - 6) (星期天 为0) | | | +---------- 月份 (1 - 12) | | +--------------- 一个月中的第几天 (1 - 31) | +-------------------- 小时 (0 - 23) +------------------------- 分钟 (0 - 59)
|
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 0 */2 * * * /sbin/service httpd restart 意思是每两个小时重启一次apache
50 7 * * * /sbin/service sshd start 意思是每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop 意思是每天22:50关闭ssh服务
0 0 1,15 * * fsck /home 每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup 每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; 每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令
|
每天0点进行数据库全库备份
备份脚本,/root/bak.sh
1 2
| #!/bin/bash mysqldump -uUsername -pPassw0rd --all-database > /mysql_bak/mysql_bak_all_$(date +%F).sql
|
corntab 设置脚本/root/corn-set.sh
1 2 3
| #!/bin/bash echo "00 00 * * * /root/bak.sh" > /root/cornfile corntab -u root /root/cornfile
|
Linux 路由转发
1 2 3
| route add -net 192.168.40.0 netmask 255.255.255.0 gw 192.168.30.1 route add -net 192.168.30.0 netmask 255.255.255.0 gw 192.168.40.1
|
进程、端口查看
进程号获取
有以下两种方法,每一个程序跑起来后系统都会分配一个进程号,所以还可以用来查看某个程序是否以及启动
1 2 3
| pidof process_name
ps -ef | grep -v grep | grep process_name | awk '{print $2}' | xargs
|
查看某个端口是否存在
直接用netstat
1
| netstat -tulnp | grep port_number
|
新工具:nc
, 应该称之为netcat
,下面只看看3306
端口是否存在
1 2 3 4 5 6
| nc -vz 127.0.0.1 3306
Connection to 127.0.0.1 3306 port [tcp/mysql] succeeded!
|
服务启动、关闭、检查状态 等
1 2 3 4 5 6
| systemctl enable xxx systemctl start xxx systemctl stop xxx systemctl restart xxx systemctl disable xxx systemctl status xxx
|
shell script
Linux三剑客
Linux三剑客是指grep、awk和sed这三个命令,它们常用于文本处理和数据分析等领域。以下是它们的常用方法:
grep:用于在文件中查找指定的字符串,常用选项有-i(忽略大小写)、-c(只显示匹配行数)、-v(反向查找)、r(递归搜索)等。
例如,在当前目录下查找包含”hello”字符串的文件:
awk:用于处理文本文件中的数据,可以按照某些规则对文本进行格式化、提取和统计等操作。常用选项有-F(指定分隔符)、-f(从文件读取脚本)、-v(定义变量)等。
例如,统计文件中每一列的和:
1
| >awk '{sum += $1} END {print sum}' file.txt
|
sed:用于对文本进行替换、插入、删除等操作。常用选项有-i(直接修改文件)、-e(执行多个编辑命令)、-n(不输出模式空间内容)等。
例如,在文件中将“Hello”替换为“Hi”:
1
| >sed -i 's/Hello/Hi/g' file.txt
|
以上是Linux三剑客的常用方法,它们在文本处理和数据分析等领域非常实用,也是Linux系统管理员和开发人员必备的工具之一。
更多用法,见其他脚本,不知道参数,请问那个男人man awk
egrep -v ‘^(#|$)’ /etc/keystone/keystone.conf_bak_2023-05-01 > /etc/keystone/keystone.conf
这里面 '^(#|$)'
,^
表示反选, #
表示注释行, $
表示空行
EOF处理文件内容
直接覆盖
1 2 3 4 5 6
| cat >/root/test<<-EOF 123 EOF
cat /root/test 123
|
文件追加内容
1 2 3 4 5 6 7
| cat >>/root/test<<-EOF 456 EOF
cat /root/test 123 456
|
shell脚本中 >>
是追加 >
是覆盖源文件
ntp 时间同步
server 192.168.200.10
client 192.168.200.20
ntp服务器
1 2 3 4 5
| #!/bin/bash yum -y install ntp sed -i "s|#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap|restrict 192.168.200.0 mask 255.255.255.0 nomodify notrap|g" /etc/ntp.conf
systemctl enable ntpd && systemctl start ntpd && systemctl status ntpd
|
ntp客户端
1 2 3 4 5 6 7 8
| #!/bin/bash yum -y install ntp sed -i '/^server/s/^/#/' /etc/ntp.conf
sed -i "/^#server/i server 192.168.200.10 iburst" /etc/ntp.conf
systemctl enable ntpd && systemctl start ntpd && systemctl status ntpd
|
KVM
依赖包
1 2 3 4 5
| yum -y install qemu* libvirt* virt* yum -y install bridge-utils
|
网桥配置
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
| #!/bin/bash yum -y install bridge-utils
IPADDR=$(ifconfig ens33 | awk '{if (NR==2) print $2}') NETMASK=$(ifconfig ens33 | awk '{if (NR==2) print $4}') GATEWAY=$(route -n | awk '{if (NR==3) print $2}') DNS1=$(egrep -v '^(#|$)' /etc/resolv.conf | awk '{if(NR==1) print $2}')
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33_bak_$(date +%F) sed -i "s|BOOTPROTO=dhcp|BOOTPROTO=none|g" /etc/sysconfig/network-scripts/ifcfg-ens33 echo "BRIDGE=br0" >> /etc/sysconfig/network-scripts/ifcfg-ens33 cat >/etc/sysconfig/network-scripts/ifcfg-br0<<-EOF TYPE=Bridge BOOTPROTO=static NAME=br0 DEVICE=br0 ONBOOT=yes IPADDR=${IPADDR} NETMASK=${NETMASK} GATEWAY=${GATEWAY} DNS1=${DNS1} EOF
systemctl restart network ping -c 1 ${GATEWAY}
|
docker
docker install 脚本
前提是关掉防火墙,SELinux
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #!/bin/bash yum remove docker docker-client docker-client-latest docker-common \ docker-latest docker-latest-logrotate \ docker-logrotate docker-engine yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo yum clean all && yum makecache fast yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin if [ "$?" != "0" ];then echo "Docker Install Error." exit 1 fi
[ ! -d /etc/docker ] && mkdir /etc/docker more <<EOF >/etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror.c.163.com"] } EOF
systemctl enable docker && systemctl start docker
|
拉取镜像
1
| docker pull mariadb:latest
|
列出镜像
批量删除容器
1
| docker rm $(docker ps -a | awk '{if (NR>1) print $1}' | xargs)
|
- 这条命令
$()
里面的会先执行;
docker ps -a
会不管容器的死活,都列出来;
- 得到的输出通过管道符
|
作为后面awk
的输入
'{if (NR>1) print $1}'
中 NR
为 awk
代表行号的变量,相应的NF
作为列号,这里表示是输出行号大于1
的第一列,目的是去掉docker ps -a
无用的输出只留下CONTAINER ID
xargs
是将awk
的输出由一列转换成一行
$()
内命令执行完成后,此时这个没名字的隐形变量,便有了值
docker rm
的后面此时可以理解为写了一堆容器ID ,也就是docker rm
这个命令要删除的容器
后台启动容器,然后进入容器
我自己的本地docker, shell是zsh, 提示符➜ ~是我自己设的,不要奇怪
以golang
容器为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| ➜ ~ docker run -itd golang Unable to find image 'golang:latest' locally latest: Pulling from library/golang 0e29546d541c: Already exists 9b829c73b52b: Already exists cb5b7ae36172: Already exists 6494e4811622: Already exists 6e1d20a8313e: Pull complete 593823f101dc: Pull complete 1b4aae56cdbe: Pull complete Digest: sha256:c72fa9afc50b3303e8044cf28fb358b48032a548e1825819420fd40155a131cb Status: Downloaded newer image for golang:latest 4c7826ffa37754cdb78289820932e00c23c4bc6299ee744cb826ed857c6c88dd
➜ ~ docker exec -it $(docker ps | grep golang | awk '{print $1}') /bin/bash root@4c7826ffa377:/go# ls bin src root@4c7826ffa377:/go# ls / bin dev go lib media opt root sbin sys usr boot etc home lib64 mnt proc run srv tmp var root@4c7826ffa377:/go# exit
|
保存容器镜像,导入本地镜像
1 2 3 4 5 6 7 8 9 10 11 12 13
| ➜ ~ docker save -o golang.tar golang:latest
➜ ~ docker rmi golang:latest Untagged: golang:latest Untagged: golang@sha256:c72fa9afc50b3303e8044cf28fb358b48032a548e1825819420fd40155a131cb Deleted: sha256:276895edf9673267f47528e8a99401f2d2947f6c9c00490f773d5ed8f559bef2 Deleted: sha256:f9925574d34663c6f0f2135512cd1e7b94490279982657a6a40fb0693ce9df41 Deleted: sha256:5ba934ce54ed16893dd8cae2c36bdcc25f9cb1a4d51dba9cbedda4b4f1bbf53f Deleted: sha256:3a9da346a75c7c4cdacacd945f87d73b964a07007c4e5e8f9435c367176ceeb9
➜ ~ docker import golang.tar sha256:49be9fd5efe6db218e87809ccd1bd7022bf90e9e26673ef517d6f7fa4d1a497d
|
mysql
用户操作
创建用户
先解释一下,openstack,创建数据库的操作, 下面是我综合实验写的sql脚本
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 27 28 29 30 31 32 33
| SET GLOBAL validate_password_policy=0; SET GLOBAL validate_password_length=4; FLUSH PRIVILEGES; # 这里临时修改了密码强度限制,长度限制,再重启后,会失效,但对这种一次性的很合适
CREATE DATABASE keystone; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'Ccu2023'; # 创建数据库就不说了,这里建了两个用户 'keystone' ,允许本地访问(localhost)、远程访问(%),密码都是Ccu2023 ,然后给了这个用户完整的全部的用于操作keystone数据库的权限,以下同理
CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'Ccu2023';
CREATE DATABASE placement; GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'Ccu2023';
CREATE DATABASE nova_api; CREATE DATABASE nova; CREATE DATABASE nova_cell0; GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'Ccu2023';
CREATE DATABASE neutron; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'Ccu2023'; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'Ccu2023';
FLUSH PRIVILEGES;
|
那么正常创建用户,赋予权限该当如何?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| mysql -u root -p
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
GRANT SELECT, INSERT ON mydatabase.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;
|
删除所有用户除了root用户:
1 2
| mysql -u root -p mysql> DELETE FROM mysql.user WHERE user != 'root';
|
删除所有用户包括root用户(危险):
1
| mysql> DELETE FROM mysql.user WHERE 1;
|
备份操作
1 2 3 4 5
|
mysqldump -uUsername -pPassw0rd dbname > /mysql_bak/mysql_bak_dbname_$(date +%F).sql mysqldump -uUsername -pPassw0rd --all-database > /mysql_bak/mysql_bak_all_$(date +%F).sql mysqldump -uUsername -pPassw0rd --database db1 db2 > /mysql_bak/mysql_bak_dbs_$(date +%F).sql
|
直接导入已存在的sql文件到数据库
直接连接数据库mysql/mariadb
1
| mysql -uroot -p'password' -e "source xxx.sql;"
|
宿主机使用容器内数据库
1 2 3
| #!/bin/bash CONTAINER_ID=$(docker ps | grep mariadb:latest | awk '{print $1}') docker exec -itd ${CONTAINER_ID} mysql -uroot -p'Ccu2023' -e "source xxx.sql;"
|
openstack
rabbitmq-server 消息队列
安装, 启动
1 2
| yum -y install rabbitmq-server systemctl enable rabbitmq-server && systemctl start rabbitmq-server && systemctl status rabbitmq-server
|
添加用户
1
| rabbitmqctl add_user username password
|
赋予用户管理权限
1
| rabbitmqctl set_permissions username ".*" ".*" ".*"
|
opensatck *** create
创建用户
1 2
| openstack user create --domain default --password-prompt glance
|
角色添加到用户和项目
1 2
| openstack role add --project service --user glance admin
|
创建域
1 2
| openstack domain create --description "An Example Domain" example
|
创建项目
1 2
| openstack project create --domain default --description "Service Project" service
|
创建服务和API端点
1 2 3 4
| openstack service create --name glance --description "OpenStack Image" image openstack endpoint create --region RegionOne image public http://controller:9292 openstack endpoint create --region RegionOne image internal http://controller:9292 openstack endpoint create --region RegionOne image admin http://controller:9292
|
openstack 查询
查询所有用户:
查询所有角色:
查询所有域:
查询所有虚拟机实例:
查询所有网络:
查询所有镜像:
查询指定虚拟机实例的详细信息:
1
| openstack server show <instance name or id>
|
查询指定网络的详细信息:
1
| openstack network show <network name or id>
|
最小安装,理论
最小化安装所能涉及到的端口以及服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 基础服务 22 ssh 3306 mysql/mariadb 5672 25672 rabbitmq 11211 memcached
keystone 35357 admin 5000 user
glance 9191 glance-registry 9292 glance-api
neutron 9696 neutron
nova 6080 nova novncproxy 8774 8775 nova-api
cinder # 上课没讲到 8776 cinder-api
|
认证服务keystone
初始化密钥
1 2
| keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
|
填充数据库,看日志
1 2
| /bin/sh -c "keystone-manage db_sync" keystone tail -f /var/log/keystone/keystone.log
|
keystone bootstarp
vi bootstarp.sh
1 2 3 4 5 6
| #!/bin/bash keystone-manage bootstrap --bootstrap-password Ccu2023 \ --bootstrap-admin-url http://controller:5000/v3/ \ --bootstrap-internal-url http://controller:5000/v3/ \ --bootstrap-public-url http://controller:5000/v3/ \ --bootstrap-region-id RegionOne
|
1 2
| chmod +x bootstarp.sh source bootstarp.sh
|
admin-openrc.sh
vi admin-openrc.sh
1 2 3 4 5 6 7 8
| #!/bin/bash export OS_USERNAME=admin export OS_PASSWORD=Ccu2023 export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_AUTH_URL=http://controller:5000/v3 export OS_IDENTITY_API_VERSION=3
|
1 2 3
| chmod +x admin-openrc.sh source admin-openrc.sh
|
镜像服务glance
填充数据库
1
| /bin/sh -c "glance-manage db_sync" glance
|
放置服务placement
填充数据库
1
| /bin/sh -c "placement-manage db sync" placement
|
验证服务
1 2 3
| systemctl restart httpd placement-status upgrade check
|
计算服务nova
填充数据库
1 2 3 4 5 6 7
| /bin/sh -c "nova-manage api_db sync" nova /bin/sh -c "nova-manage cell_v2 map_cell0" nova /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" no va /bin/sh -c "nova-manage db sync" nova /bin/sh -c "nova-manage cell_v2 list_cells" nova
|
网络服务neuton
填充数据库
1 2 3 4
| ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \ --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
|
面板 dashboard