首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

OpenStack-Icehouse(nova-network)多节点基础环境部署

内容列表 一、组件介绍 二、系统准备 三、Controller Node部署 1.MySQL 2.Qpid 3.Glance 4.Nova 5.Horizon 四、Compute Node部署 1.Nova-Compute 2.Nova-Network 五、部署云主机 参考文档: http://docs.openstack.org/icehouse/install-guide/install/yum/openstack-install-guide-yum-icehouse.pdf ########################################################################################### 一、组件介绍 MySQL数据库:负责保存Openstack系统中的各类数据 Qpid:完成Openstack各组件间的消息交换工作 Keystone:用于租户与服务认证 Glance:负责提供创建虚拟机使用的操作系统镜像 glance-api:负责接收云系统的镜像创建、删除和镜像数据服务 glance-registry:负责云系统的镜像注册服务 Nova:(compute)管理虚拟机 nova-api:负责接收来自Nova客户端或Horizon的控制指令并完成虚拟机创建、删除等管理工作 nova-network:负责为虚拟机配置网络并分配IP地址 nova-cert:负责来自EC2接口命令的用户身份提供认证服务 nova-consoleauth、nova-novncproxy负责为来自Horizon的Web VNC管理页面提供认证与VNC服 nova-scheduler:负责决定在哪台计算节点上创建虚拟机工作 Cinder:为云中虚拟机镜像提供存储服务 Swift:对象存储,一般存储虚拟机镜像、图片、存档备份等 Telemetry(Ceilometer):提供云系统中计费功能、监控数据、云系统运行状况等 Orchestration(Heat):利用模板,定制化的实现虚拟机预配置,类似于puppet Trove:根据云中资源轻松扩展数据库资源使用 二、安装系统准备 操作系统:CentOS6.5_x86_64minimal 1.禁用NetworkManager服务 service NetworkManager stop chkconfig NetworkManager off 2.关闭selinux setenforce 0 3.关闭防火墙 service iptables stop 4.安装NTP时间同步 yum install -y ntp service ntpd start chkconfig ntpd on 5.配置Icehouse和epel网络源 yum install -y http://repos.fedorapeople.org/repos/openstack/openstack-icehouse/rdo-release-icehouse-3.noarch.rpmhttp://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 6.安装Openstack工具并更新系统 yum install -y openstack-utils openstack-selinux yum upgrade -y && reboot 7.配置网络 7.1 Controller Node 7.1.1配置管理接口 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.1.11 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=192.168.1.1 7.1.2配置hosts记录 192.168.1.11 controlle 192.168.1.31 compute1 7.2 Compute1 Node 7.2.1配置管理接口 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.1.31 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=192.168.1.1 7.2.2配置外部接口 DEVICE=eth1 TYPE=Ethernet ONBOOT="yes" BOOTPROTO="none" 7.2.3配置hosts记录 192.168.1.11 controlle 192.168.1.31 compute1 7.3重启网卡 service network restart 7.4测试网络连通性 ping -c 4 www.openstack.org ping -c 4 controller ping -c 4 compute1 三、Controller Node 1.MySQL数据库安装与配置 1.1安装Msyql yum install -y mysql mysql-server MySQL-python 1.2修改配置文件 [mysqld] bind-address= 192.168.1.11 default-storage-engine= innodb collation-server= utf8_general_ci init-connect= 'SET NAMES utf8' character-set-server= utf8 1.3重启Mysql service mysqld start chkconfig mysqld on 1.4初始化Mysql并设置密码 mysql_install_db mysql_secure_installation 2.消息中间件Qpid服务安装与配置 yum install -y qpid-cpp-server 2.1关闭身份认证 # vi /etc/qpidd.conf auth=no 2.2重启qpidd服务 service qpidd start chkconfig qpidd on 3.认证服务Keystone安装与配置 3.1安装 yum install -y openstack-keystone 3.2配置数据库 openstack-config --set /etc/keystone/keystone.conf \ database connection mysql://keystone:keystonepass@controller/keystone 3.3创建数据库并授权 # mysql -uroot -p mysql> CREATE DATABASE keystone; mysql> GRANT ALL PRIVILEGES ON keystone.* TO'keystone'@'localhost' \ IDENTIFIEDBY 'keystonepass'; mysql> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \ IDENTIFIEDBY 'keystonepass'; mysql> exit 当然,如果你觉得每次创建数据库并授权比较麻烦,可以一次做完! # vi createdb.sh CREATE DATABASE keystone; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystonepass'; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystonepass'; CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glancepass'; GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glancepass'; CREATE DATABASE nova; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'novapass'; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'novapass'; CREATE DATABASE neutron; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutronpass'; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutronpass'; CREATE DATABASE dash; GRANT ALL PRIVILEGES ON dash.* TO 'dash'@'%' IDENTIFIED BY 'dashpass'; GRANT ALL PRIVILEGES ON dash.* TO 'dash'@'localhost' IDENTIFIED BY 'dashpass'; CREATE DATABASE cinder; GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinderpass'; GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinderpass'; # mysql -uroot -p123.com < createdb.sh 3.4导入数据库 keystone-manage db_sync 3.5生成字符串秘钥并添加到配置文件 ADMIN_TOKEN=$(openssl rand -hex 10) echo $ADMIN_TOKEN openstack-config --set /etc/keystone/keystone.conf DEFAULT \ admin_token $ADMIN_TOKEN 3.6默认keystone使用PKI令牌,创建签名秘钥和证书 keystone-manage pki_setup --keystone-user keystone --keystone-group keystone chown -R keystone:keystone /etc/keystone/ssl chmod -R o-rwx /etc/keystone/ssl chown keystone.keystone /var/log/keystone/keystone.log 3.7重启服务 service openstack-keystone start chkconfig openstack-keystone on 3.8定期清理过期的令牌,提高性能 (crontab -l 2>&1 | grep -q token_flush) || \ echo '@hourly /usr/bin/keystone-manage token_flush >/var/log/keystone/keystone-tokenflush.log 2>&1' >> /var/spool/cron/root 3.9设置令牌及服务位置环境变量 export OS_SERVICE_TOKEN=$ADMIN_TOKEN export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0 3.10创建admin用户、角色和租户 #创建管理员用户 keystone user-create --name=admin --pass=admin --email=admin@example.com #创建管理员角色 keystone role-create --name=admin #为管理员创建租户 keystone tenant-create --name=admin --description="AdminTenant" #将角色添加到用户 keystone user-role-add --user=admin --tenant=admin --role=admin keystone user-role-add --user=admin --role=_member_ --tenant=admin 3.11创建service租户 keystone tenant-create --name=service --description="Service Tenant" 3.12创建keystone标识服务 keystone service-create --name=keystone --type=identity \ --description="OpenStackIdentity" 3.13创建服务端点,指定API的URL keystone endpoint-create \ --service-id=$(keystone service-list | awk '/ identity / {print$2}') \ --publicurl=http://controller:5000/v2.0\ --internalurl=http://controller:5000/v2.0\ --adminurl=http://controller:35357/v2.0 3.14取消变量 unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT 3.15测试身份认证 # keystone --os-username=admin --os-password=admin \ --os-auth-url=http://controller:35357/v2.0token-get # keystone --os-username=admin --os-password=admin \ --os-tenant-name=admin --os-auth-url=http://controller:35357/v2.0 token-get 3.16设置环境变量,也可以写在.bash_profile # vi /root/admin-openrc.sh export OS_USERNAME=admin export OS_PASSWORD=admin export OS_TENANT_NAME=admin export OS_AUTH_URL=http://controller:35357/v2.0 # source admin-openrc.sh 3.17验证是否授权成功 keystone token-get keystone user-list keystone user-role-list --user admin --tenant admin keystone --os-password admin service-list 3.18安装client通过http访问各组件客户端 yum install -y python-keystoneclient python-glanceclient python-novaclient python-swiftclientpython-neutronclient python-cinderclient 4.镜像服务Glance安装与配置 4.1安装 yum install -y openstack-glance 现在启动glance-api,要不然会可能后面启动不起来。 service openstack-glance-api start 4.2配置数据库及qpid 1 2 3 4 5 6 openstack-config-- set /etc/glance/glance-api .confdatabase\ connectionmysql: //glance :glancepass@controller /glance openstack-config-- set /etc/glance/glance-registry .confdatabase\ connectionmysql: //glance :glancepass@controller /glance openstack-config-- set /etc/glance/glance-api .confDEFAULTrpc_backendqpid openstack-config-- set /etc/glance/glance-api .confDEFAULTqpid_hostnamecontroller 4.3创建数据库 # mysql -uroot -p mysql> CREATE DATABASE glance; mysql> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \ IDENTIFIEDBY 'glancepass'; mysql> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \ IDENTIFIEDBY 'glancepass'; mysql> exit 4.4导入数据库 glance-manage db_sync 4.5创建glance用户并加入角色admin keystone user-create --name=glance --pass=glance --email=glance@example.com keystone user-role-add --user=glance --tenant=service --role=admin 4.6配置认证信息 1 2 3 4 5 6 7 8 openstack-config-- set /etc/glance/glance-api .confkeystone_authtokenauth_urihttp: //controller :5000 openstack-config-- set /etc/glance/glance-api .confkeystone_authtokenauth_hostcontroller openstack-config-- set /etc/glance/glance-api .confkeystone_authtokenauth_port35357 openstack-config-- set /etc/glance/glance-api .confkeystone_authtokenauth_protocolhttp openstack-config-- set /etc/glance/glance-api .confkeystone_authtokenadmin_tenant_nameservice openstack-config-- set /etc/glance/glance-api .confkeystone_authtokenadmin_userglance openstack-config-- set /etc/glance/glance-api .confkeystone_authtokenadmin_passwordglance openstack-config-- set /etc/glance/glance-api .confpaste_deployflavorkeystone 1 2 3 4 5 6 7 8 openstack-config-- set /etc/glance/glance-registry .confkeystone_authtokenauth_urihttp: //controller :5000 openstack-config-- set /etc/glance/glance-registry .confkeystone_authtokenauth_hostcontroller openstack-config-- set /etc/glance/glance-registry .confkeystone_authtokenauth_port35357 openstack-config-- set /etc/glance/glance-registry .confkeystone_authtokenauth_protocolhttp openstack-config-- set /etc/glance/glance-registry .confkeystone_authtokenadmin_tenant_nameservice openstack-config-- set /etc/glance/glance-registry .confkeystone_authtokenadmin_userglance openstack-config-- set /etc/glance/glance-registry .confkeystone_authtokenadmin_passwordglance openstack-config-- set /etc/glance/glance-registry .confpaste_deployflavorkeystone 4.7创建glance标识服务 keystone service-create --name=glance --type=image --description="OpenStackImage Service" 4.8创建Glance API接口URL 1 2 3 4 5 keystoneendpoint-create\ --service- id =$(keystoneservice-list| awk '/image/{print$2}' )\ --publicurl=http: //controller :9292\ --internalurl=http: //controller :9292\ --adminurl=http: //controller :9292 4.9启动glance服务 1 2 3 4 serviceopenstack-glance-apirestart serviceopenstack-glance-registrystart chkconfigopenstack-glance-apion chkconfigopenstack-glance-registryon 4.10上传测试镜像 wget http://cdn.download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img glance image-create --name "cirros-0.3.2-x86_64" --disk-format qcow2 \ --container-format bare --is-public True --progress < cirros-0.3.2-x86_64-disk.img 4.11查看上传镜像状态 # glance image-list [root@controller~]# glance image-list +--------------------------------------+---------------------+-------------+------------------+-----------+--------+ | ID | Name | Disk Format | Container Format | Size | Status | +--------------------------------------+---------------------+-------------+------------------+-----------+--------+ |de8cfa34-2657-4d9c-bc58-19fb11455cbb | cirros-0.3.2-x86_64 | qcow2 | bare | 13167616| active | +--------------------------------------+---------------------+-------------+------------------+-----------+--------+ 5.计算服务Nova API安装与配置 5.1安装 yum install -y openstack-nova-api openstack-nova-cert openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler 5.2配置数据库 openstack-config --set /etc/nova/nova.conf database \ connection mysql://nova:novapass@controller/nova 5.3配置Qpid及VNC 1 2 3 4 5 6 openstack-config-- set /etc/nova/nova .confDEFAULTrpc_backendqpid openstack-config-- set /etc/nova/nova .confDEFAULTqpid_hostnamecontroller openstack-config-- set /etc/nova/nova .confDEFAULTmy_ip192.168.1.11 openstack-config-- set /etc/nova/nova .confDEFAULTvncserver_listen192.168.1.11 openstack-config-- set /etc/nova/nova .confDEFAULTvncserver_proxyclient_address 192.168.1.11 5.4创建数据库 mysql -uroot -p mysql> CREATE DATABASE nova; mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \ IDENTIFIEDBY 'novapass'; mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \ IDENTIFIEDBY 'novapass'; mysql> exit 5.5导入数据库 nova-manage db sync 5.6创建nova用户并加入角色admin keystone user-create --name=nova --pass=nova --email=nova@example.com keystone user-role-add --user=nova --tenant=service --role=admin 5.7配置认证信息 1 2 3 4 5 6 7 8 9 openstack-config-- set /etc/nova/nova .confDEFAULTauth_strategykeystone openstack-config-- set /etc/nova/nova .confkeystone_authtoken\ auth_urihttp: //controller :5000 openstack-config-- set /etc/nova/nova .confkeystone_authtokenauth_hostcontroller openstack-config-- set /etc/nova/nova .confkeystone_authtokenauth_protocolhttp openstack-config-- set /etc/nova/nova .confkeystone_authtokenauth_port35357 openstack-config-- set /etc/nova/nova .confkeystone_authtokenadmin_usernova openstack-config-- set /etc/nova/nova .confkeystone_authtokenadmin_tenant_nameservice openstack-config-- set /etc/nova/nova .confkeystone_authtokenadmin_passwordnova 5.8创建nova服务标识 keystone service-create --name=nova --type=compute--description="OpenStackCompute" 5.9创建Nova API接口URL 1 2 3 4 5 keystoneendpoint-create\ --service- id =$(keystoneservice-list| awk '/compute/{print$2}' )\ --publicurl=http: //controller :8774 /v2/ %\(tenant_id\)s\ --internalurl=http: //controller :8774 /v2/ %\(tenant_id\)s\ --adminurl=http: //controller :8774 /v2/ %\(tenant_id\)s 5.10启动相关服务 1 2 3 4 5 6 7 8 9 10 11 12 serviceopenstack-nova-apistart serviceopenstack-nova-certstart serviceopenstack-nova-consoleauthstart serviceopenstack-nova-schedulerstart serviceopenstack-nova-conductorstart serviceopenstack-nova-novncproxystart chkconfigopenstack-nova-apion chkconfigopenstack-nova-certon chkconfigopenstack-nova-consoleauthon chkconfigopenstack-nova-scheduleron chkconfigopenstack-nova-conductoron chkconfigopenstack-nova-novncproxyon 5.11查看镜像状态 # nova image-list [root@controller~]# nova image-list +--------------------------------------+---------------------+--------+--------+ | ID | Name | Status | Server | +--------------------------------------+---------------------+--------+--------+ |de8cfa34-2657-4d9c-bc58-19fb11455cbb | cirros-0.3.2-x86_64 | ACTIVE | | +--------------------------------------+---------------------+--------+--------+ 5.11配置控制节点使用nova网络 openstack-config --set /etc/nova/nova.conf DEFAULT network_api_class nova.network.api.API openstack-config --set /etc/nova/nova.conf DEFAULT security_group_api nova 5.12重启服务 1 2 3 serviceopenstack-nova-apirestart serviceopenstack-nova-schedulerrestart serviceopenstack-nova-conductorrestart 5.13创建网络(一般创建的网络不能与宿主机在同一网段,避免冲突) # source admin-openrc.sh nova network-create admin-net --bridge br100 --multi-host T --fixed-range-v4 192.168.1.0/24 [root@controller~]# nova net-list +--------------------------------------+----------+----------------+ | ID | Label | CIDR | +--------------------------------------+----------+----------------+ |5eb05667-ed6b-4cd3-a1d1-b6cc1903ccfa | admin-net | 192.168.1.0/24 | +--------------------------------------+----------+----------------+ 6.Web页面dashboard服务安装与配置 6.1安装 yum install -y memcached python-memcached mod_wsgi openstack-dashboard 6.2配置用memcached来缓存dashboard,并设置允许外部访问与配置数据库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #vi/etc/openstack-dashboard/local_settings CACHES={ 'default' :{ 'BACKEND' : 'django.core.cache.backends.memcached.MemcachedCache' , 'LOCATION' : '127.0.0.1:11211' } } ###########configdatabases############## SESSION_ENGINE= 'django.core.cache.backends.db.DatabaseCache' DATABASES={ 'default' :{ 'ENGINE' : 'django.db.backends.mysql' , 'NAME' : 'dash' , 'USER' : 'dash' , 'PASSWORD' : 'DASH_DBPASS' , 'HOST' : '192.168.1.11' , 'default-character-set' : 'utf8' } } ALLOWED_HOSTS=[ '192.168.1.11' , 'my-desktop' ] OPENSTACK_HOST= "controller" ############可选:也可以使用redis做缓存############# 1 2 3 4 5 6 7 8 9 SESSION_ENGINE= 'django.contrib.sessions.backends.cache' CACHES={ "default" :{ "BACKEND" : "redis_cache.cache.RedisCache" , "LOCATION" : "127.0.0.1:6379:1" , "OPTIONS" :{ "CLIENT_CLASS" : "redis_cache.client.DefaultClient" , } } 6.3创建数据库 mysql -u root -p mysql> CREATE DATABASE dash; mysql> GRANT ALL PRIVILEGES ON dash.* TO 'dash'@'%'IDENTIFIED BY 'DASH_DBPASS'; mysql> GRANT ALL PRIVILEGES ON dash.* TO 'dash'@'localhost'IDENTIFIED BY 'DASH_DBPASS'; mysql> exit 6.4导入数据库 /usr/share/openstack-dashboard/manage.py syncdb 6.5启动相关服务 1 2 3 4 servicehttpdstart servicememcachedstart chkconfighttpdon chkconfigmemcachedon 6.6访问dashboard http://192.168.1.11/dashboard 四、Compute Node 1.安装MySQL-python yum install-y MySQL-python 2.计算服务Nova-Compute安装与配置 2.1安装计算服务 yum install -y openstack-nova-compute 2.2配置数据库 openstack-config --set /etc/nova/nova.conf database connection mysql://nova:novapass@controller/nova 2.3配置认证信息 1 2 3 4 5 6 7 8 openstack-config-- set /etc/nova/nova .confDEFAULTauth_strategykeystone openstack-config-- set /etc/nova/nova .confkeystone_authtokenauth_urihttp: //controller :5000 openstack-config-- set /etc/nova/nova .confkeystone_authtokenauth_hostcontroller openstack-config-- set /etc/nova/nova .confkeystone_authtokenauth_protocolhttp openstack-config-- set /etc/nova/nova .confkeystone_authtokenauth_port35357 openstack-config-- set /etc/nova/nova .confkeystone_authtokenadmin_usernova openstack-config-- set /etc/nova/nova .confkeystone_authtokenadmin_tenant_nameservice openstack-config-- set /etc/nova/nova .confkeystone_authtokenadmin_passwordnova 2.4配置Qpid openstack-config --set /etc/nova/nova.conf DEFAULT rpc_backend qpid openstack-config --set /etc/nova/nova.conf DEFAULT qpid_hostname controller 2.5配置计算服务提供远程控制台访问实例 1 2 3 4 5 openstack-config-- set /etc/nova/nova .confDEFAULTmy_ip192.168.1.31 openstack-config-- set /etc/nova/nova .confDEFAULTvnc_enabledTrue openstack-config-- set /etc/nova/nova .confDEFAULTvncserver_listen0.0.0.0 openstack-config-- set /etc/nova/nova .confDEFAULTvncserver_proxyclient_address192.168.1.31 openstack-config-- set /etc/nova/nova .confDEFAULTnovncproxy_base_urlhttp: //192 .168.1.11:6080 /vnc_auto .html 2.6如果系统不支持硬件虚拟化则配置libvirt为qemu,生产环境是kvm # egrep -c '(vmx|svm)' /proc/cpuinfo #查看是否支持虚拟化 openstack-config --set /etc/nova/nova.conf DEFAULT glance_host controller openstack-config --set /etc/nova/nova.conf libvirt virt_type qemu 2.7启动相关服务 1 2 3 4 5 6 servicelibvirtdstart servicemessagebusstart serviceopenstack-nova-computestart chkconfiglibvirtdon chkconfigmessagebuson chkconfigopenstack-nova-computeon 3.Nova-Network服务安装与配置 3.1安装 yum install -y openstack-nova-network openstack-nova-api 3.2配置FlatDHCP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 openstack-config-- set /etc/nova/nova .confDEFAULTnetwork_api_classnova.network.api.API openstack-config-- set /etc/nova/nova .confDEFAULTsecurity_group_apinova openstack-config-- set /etc/nova/nova .confDEFAULTnetwork_managernova.network.manager.FlatDHCPManager openstack-config-- set /etc/nova/nova .confDEFAULT\ firewall_drivernova.virt.libvirt.firewall.IptablesFirewallDriver openstack-config-- set /etc/nova/nova .confDEFAULTnetwork_size254 openstack-config-- set /etc/nova/nova .confDEFAULTallow_same_net_trafficFalse openstack-config-- set /etc/nova/nova .confDEFAULTmulti_hostTrue openstack-config-- set /etc/nova/nova .confDEFAULTsend_arp_for_haTrue openstack-config-- set /etc/nova/nova .confDEFAULTshare_dhcp_addressTrue openstack-config-- set /etc/nova/nova .confDEFAULTforce_dhcp_releaseTrue openstack-config-- set /etc/nova/nova .confDEFAULTflat_network_bridgebr100 openstack-config-- set /etc/nova/nova .confDEFAULTflat_interfaceeth1 openstack-config-- set /etc/nova/nova .confDEFAULTpublic_interfaceeth0 3.3启动相关服务 1 2 3 4 serviceopenstack-nova-networkstart serviceopenstack-nova-metadata-apistart chkconfigopenstack-nova-networkon chkconfigopenstack-nova-metadata-apion 3.4查看服务与连接Compute节点是否正常 [root@controller~]# nova-manage service list Binary Host Zone Status StateUpdated_At nova-consoleauthcontroller internal enabled :-) 2014-07-04 18:17:15 nova-cert controller internal enabled :-) 2014-07-04 18:17:11 nova-conductor controller internal enabled :-) 2014-07-04 18:17:15 nova-console controller internal enabled :-) 2014-07-04 18:17:11 nova-scheduler controller internal enabled :-) 2014-07-04 18:17:16 nova-compute compute1 nova enabled :-) 2014-07-04 18:17:13 nova-network compute1 internal enabled :-) 2014-07-04 18:17:13 3.5查看各组件服务状态,没启动要手动重启下 # cd /etc/init.d/; for i in $( ls openstack-* ); do service $i status; done 3.6常见故障解决之nova-api已死,pid还存在(openstack-nova-api dead but pid file exists) 故障现象:dashboard无法访问 故障分析:查看日志,tail /var/log/nova/api.log发现 2014-07-15 12:16:23.714 3046 ERROR nova.wsgi [-] Could not bind to 0.0.0.0:8775 2014-07-15 12:16:23.715 3046 CRITICAL nova [-] error: [Errno 98] Address already in use 故障解决:可以看出8775已经监听了,但为什么起不起来呢,这就不得而知了,我们可以通过kill这个进程再重启服务,即可解决! # netstat -tupln | grep 8775 tcp 0 0 0.0.0.0:8775 0.0.0.0:* LISTEN 3142/python # kill 3142 # service openstack-nova-api start 五、创建云主机 1.1创建控制台无密码登陆虚拟机密钥 # ssh-keygen (一直回车) # nova keypair-add --pub-key ~/.ssh/id_rsa.pub admin-key 1.2查看上传的密钥对 # nova keypair-list 1.3查看创建主机类型,也就是要分配主机资源模板 # nova flavor-list [root@controller~]# nova flavor-list +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | ID |Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs |RXTX_Factor | Is_Public | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | 1| m1.tiny | 512 | 1 | 0 | | 1 | 1.0 | True | | 2| m1.small | 2048 | 20 | 0 | | 1 | 1.0 | True | | 3| m1.medium | 4096 | 40 | 0 | | 2 | 1.0 | True | | 4| m1.large | 8192 | 80 | 0 | | 4 | 1.0 | True | | 5| m1.xlarge | 16384 | 160 | 0 | | 8 | 1.0 | True | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ 1.3设置default默认访问规则,允许ping和22访问 # nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0 # nova secgroup-add-rule default tcp 22 22 0.0.0.0/0 1.4创建虚拟机 # nova boot --flavor m1.tiny --image cirros-0.3.2-x86_64 --nic net-id=ADMIN_NET_ID \ --security-group default --key-name admin-key cirros 1.5查看云主机状态 [root@controller~]# nova list +---------------+--------+--------+------------+-------------+----------------------+ | ID | Name | Status | Task State |Power State | Networks | +---------------+--------+--------+------------+-------------+----------------------+ |096123ba-dacf-4d9a-bfe7-c90901cb3d14| crrios | ACTIVE | - | Running| admin-net=192.168.1.2 | +---------------+--------+--------+------------+-------------+----------------------+ 1.6登陆Horizon控制台查看云主机 CentOS6.5磁盘镜像下载地址: http://repos.fedorapeople.org/repos/openstack/guest-images/centos-6.5-20140117.0.x86_64.qcow2 以上基本的Openstack I版部署完毕,接触不久,有什么问题,可以一起交流,有时间会部署块存储Cinder、对象存储Swift、Neutron等,到时候会发布博客与大家分享。 刚接触的朋友会遇到各种各样的问题,也是很正常的,因为组件较多,逻辑架构比较复杂,如果部署的是Neutron网络,会更容易出错,为了避免低级的错误发生,在看网上教程时候先多去揣摩每次要执行命令的目的,多动手部署几次,一次不行两次,相信20次以上,Openstack你已经有很深的认识了。

优秀的个人博客,低调大师

雷池 WAF 离线安装搭建全流程指南(2025 年最新版)

一、环境要求与准备工作 系统要求 操作系统:Debian12+(推荐大版本一致,如内网使用debian12,在线主机也需debian系列) CPU架构:x86_64,需支持SSSE3指令集(可通过 lscpu | grep ssse3 验证) 最小配置:1核CPU/1GB内存/5GB磁盘空间(高流量场景需扩容) 软件依赖 Docker 20.10.14+ Docker Compose 2.0.0+ 若离线环境需提前准备以下文件: Docker RPM包及本地YUM源(含createrepo工具生成) 雷池镜像包( image.tar.gz ) compose.yaml 编排脚本 二、在线环境生成离线包(联网主机操作) 在可联网设备上操作 # 创建离线包目录 2mkdir docker-offline && cd docker-offline 3 4# 安装必要工具 5sudo apt-get update && sudo apt-get install -y curl gnupg 6 7# 添加DockerGPG密钥 8curl -fsSL http://mirrors.volces.com/docker/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 9 10# 配置Docker镜像源 11echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] http://mirrors.volces.com/docker/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 12 13# 更新软件源 14sudo apt-get update 15 16# 下载docker全家桶及核心依赖(--download-only确保仅下载) 17sudo apt-get download \ 18 docker-ce \ 19 docker-ce-cli \ 20 containerd.io \ 21 docker-buildx-plugin \ 22 docker-compose-plugin \ 23 ca-certificates \ 24 libltdl7 \ 25 libseccomp2 \ 26 iptables \ 27 libdevmapper1.02.1 28 29# 收集所有deb包 30cp /var/cache/apt/archives/*.deb . 31 32# 确保没有遗漏的依赖,可以通过apt-cache depends命令检查每个包的依赖关系 33for pkg in docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; do 34 echo "Checking dependencies for $pkg" 35 apt-cache depends $pkg | grep "Depends" | sed "s/Depends: //" | xargs -I % sudo apt-get download % 36done 37 38# 校验文件完整性(可选) 39md5sum *.deb > checksum.md5 40 41# 输出收集到的.deb包列表以供确认 42echo "Collected .deb packages:" 43ls -lh *.deb 打包压缩离线包目录 1tar -cvf docker-offline.tar.gz docker-offline/ 三、离线环境部署(内网主机操作) 1.文件传输将打包好的docker-offline目录通过物理介质拷贝到目标服务器的/tmp目录,然后执行命令解压 tar -xvf docker-offline.tar.gz -C /tmp 2.安装Docker环境 1 cd /tmp/docker-offline 2 3 # 按依赖顺序安装 4 sudo dpkg -i /tmp/docker-offline/ca-certificates*.deb 5 sudo dpkg -i /tmp/docker-offline/lib*.deb 6 sudo dpkg -i containerd.io*.deb 7 sudo dpkg -i docker-ce-cli*.deb 8 sudo dpkg -i docker-ce*.deb 9 sudo dpkg -i docker-buildx-plugin_*.deb docker-compose-plugin_*.deb 10 sudo dpkg -i *.deb 3.服务管理 1 # 配置守护进程 2 sudo mkdir -p /etc/docker 3 sudo tee /etc/docker/daemon.json <<-'EOF' 4 { 5 "registry-mirrors": ["https://registry-docker.cdnmirror.top"] 6 } 7 EOF 8 9 # 启动服务 10 sudo systemctl enable docker 11 12 sudo systemctl start docker 13 14 # 验证版本 15 sudo docker --version 4.增强配置 1.用户权限配置 1# 添加当前用户到docker组 2sudo usermod -aG docker $USER 3 4# 立即生效需要重新登录 5newgrp docker || true 2.镜像预加载(可选) # 在在线环境提前拉取并打包镜像 docker pull ubuntu:22.04 docker save ubuntu:22.04 > ubuntu.tar # 在离线环境加载 sudo docker load -i ubuntu.tar 5.下载雷池镜像与安装启动服务 创建雷池目录 mkdir -p /data/safeline && cd /data/safeline 下载雷池社区版镜像包 cd /data/safeline 2wget https://demo.waf-ce.chaitin.cn/image.tar.gz 下载compose编排脚本 cd /data/safeline 2wget https://waf-ce.chaitin.cn/release/latest/compose.yaml 加载雷池社区版镜像包 cat image.tar.gz | gzip -d | docker load 配置环境变量 cat > .env <<EOF 2SAFELINE_DIR=/data/safeline 3IMAGE_TAG=latest 4MGT_PORT=9443 5POSTGRES_PASSWORD=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 32) 6SUBNET_PREFIX=172.22.222 7IMAGE_PREFIX=swr.cn-east-3.myhuaweicloud.com/chaitin-safeline 8ARCH_SUFFIX= 9RELEASE= 10REGION= 11EOF 启动雷池服务 docker compose up -d 四、配置与验证 初始化控制台 访问 https://<服务器IP>:9443 ,首次登录需执行命令获取随机密码。 docker exec safeline-mgt resetadmin 添加防护站点 上游服务器配置 :根据业务架构选择(如反向代理至Nginx或直接指向应用服务器)。 证书管理 :上传SSL证书至控制台,支持HTTP自动跳转HTTPS。 防护测试 1 # 模拟攻击验证拦截效果 2 curl "http://<域名>/?id=1%20AND%201=1" # SQL注入测试 3 curl "http://<域名>/?html=<script>alert(1)</script>" # XSS测试 五、常见问题与优化 启动报错处理 unknown shorthand flag: 'd' in -d :升级Docker Compose至2.0+。 镜像加载失败:检查镜像完整性,重新导出加载。 性能调优 资源限制 :通过 docker-compose.yaml 调整容器内存与CPU配额。 日志管理 :挂载外部目录持久化日志,避免磁盘占满。 升级与迁移 离线升级 :替换镜像包后执行 docker compose down && docker compose up -d 。 跨服务器迁移 :备份 /data/safeline 目录,复制至新主机按相同步骤启动。 六、总结 本文基于雷池社区实践整合了雷池WAF离线部署的最优路径,覆盖环境准备、离线包生成、服务配置及故障排查全流程。通过语义分析引擎与轻量级设计,雷池社区版可有效防御OWASP Top 10攻击,适合内网及无外网环境的业务防护。建议定期关注官方更新,结合业务流量调整防护策略。

优秀的个人博客,低调大师

Ollama 介绍,搭建本地 AI 大模型 deepseek,并使用 Web 界面调用

Ollama 是一个基于 Go 语言的本地大语言模型运行框架,类 Docker 产品(支持 list,pull,push,run 等命令),事实上它保留了 Docker 的操作习惯,支持上传大语言模型仓库 (有 deepseek、llama 2,mistral,qwen 等模型,你也可以自定义模型上传)。 在管理模型的同时,它还提供了一些 Api 接口,让你能够像调用 OpenAI 提供的接口那样进行交互。 一、下载安装 Ollama Ollama 支持多平台部署,你可以在官网,选择适合的安装包。 下载地址:https://ollama.com 运行之后,访问 localhost:11434,查看是否正常运行: 二、AI 模型管理 ollama 安装之后,其同时还是一个命令,与模型交互就是通过命令来进行的。 ollama list:显示模型列表。 ollama show:显示模型的信息 ollama pull:拉取模型 ollama push:推送模型 ollama cp:拷贝一个模型 ollama rm:删除一个模型 ollama run:运行一个模型 官方提供了一个模型仓库,https://ollama.com/library, 你可以搜索你想要的模型。 官方建议:应该至少有 8 GB 可用 RAM 来运行 7 B 型号,16 GB 来运行 13 B 型号,32 GB 来运行 33 B 型号。 在这里我选择下载目前最火的开源 deepseek-r1 模型来做演示。模型地址为:https://ollama.com/library/deepseek-r1,因我的电脑有 32G,所以选择了 14b 的模型来调试。 ollama run deepseek-r1:14b 执行命令,如果本地没有该模型,则会先下载模型再运行。首次运行启动可能略慢。 三、简单交互 模型运行之后,会默认进入到交互状态,你可以按下Ctrl + D退出交互,但此时模型并不会退出,仍旧可以正常通过 Api 接口交互。 终端交互示例: 接口请求参考官方文档的介绍API 文档,下边是简单的示例: curl http://localhost:11434/api/generate -d "{\"model\":\"deepseek-r1:14b\", \"prompt\":\"介绍下JeecgBoot是什么项目\", \"stream\": false}" 接口请求支持 stream 模式,上边这个请求响应 10s 左右,如果使用 stream 模式,体验会提升不少。 四、通过 Web 界面调用大模型 这里介绍几个 UI 框架可以直接与 ollama 大模型对接。 项目一 :ollama-webui-lite 项目地址:https://github.com/ollama-webui/ollama-webui-lite 此项目是 open-webui 的简化版,注意需:node >= 16。 git clone https://github.com/ollama-webui/ollama-webui-lite.git cd ollama-webui-lite yarn yarn dev 运行之后,你可以对连接信息进行设置,默认是连接本机的http://localhost:11434/api,如果你也是本机部署,那就不用更改。然后界面选择启动的模型,就可以对话了。 项目二 :lobe-chat 项目地址:https://github.com/lobehub/lobe-chat 这是一个集成多种模型能力的对话聊天 UI,部署简单,界面酷炫。 Docker 部署命令: docker run -itd --name=lobechat -p 3210:3210 registry.cn-hangzhou.aliyuncs.com/jeecgdocker/lobe-chat 如果你是本地 ollama 部署,启动之后,就可以在 web 界面进行交互了。 目前最新版还不支持 deepseek v3,可以先用其他大模型测试下

优秀的个人博客,低调大师

图文结合丨Prometheus+Grafana+GreatSQL性能监控系统搭建指南(上)

一、环境介绍 本文环境,以及本文所采用数据库为GreatSQL 8.0.32-24 $ cat /etc/system-release Red Hat Enterprise Linux Server release 7.9 (Maipo) $ uname -a Linux gip 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux $ ldd --version ldd (GNU libc) 2.17 二、手动安装 0.简单介绍 Prometheus Server : 用于收集和存储时间序列数据。 Client Library : 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当Prometheus server 来 pull 时,直接返回实时状态的 metrics。 Push Gateway : 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的metrics,对于机器层面的 metrices,需要使用 node exporter。 Exporters : 用于暴露已有的第三方服务的 metrics 给 Prometheus。 Alertmanager : 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接收方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。 网上介绍很多这里就不再过多介绍了 1.安装Prometheus 官网下载最新二进制安装包➥ https://prometheus.io/download/ 可以看到有很多的版本,这里选择LTS的版本,LTS在软件版本中通常表示Long Term Support,即长期支持版本,对于Prometheus来说,LTS版本表示这个版本会获得更长期的支持和维护,而非LTS版本则更新频繁,新特性来得快,但稳定性和支持周期较短,所以在追求稳定的生产环境中,建议优先考虑使用LTS长期支持版本。 这里选择二进制软件包prometheus-2.45.0.linux-amd64.tar.gz $ mkdir /usr/local/prometheus $ cd /usr/local/prometheus $ wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz 下载完成后,用sha256sum校验一下安装包,没问题的话解压即可 $ sha256sum prometheus-2.45.0.linux-amd64.tar.gz 1c7f489a3cc919c1ed0df2ae673a280309dc4a3eaa6ee3411e7d1f4bdec4d4c5 $ tar xvf prometheus-2.45.0.linux-amd64.tar.gz 建议使用systemctld来管理守护进程Prometheus服务 若文件路径或名字和本文不同记得修改 $ vi /lib/systemd/system/prometheus.service [Unit] Description=Prometheus server Documentation=https://prometheus.io/docs/introduction/overview/ After=network-online.target [Service] Type=simple User=root Group=root Restart=on-abnormal ExecStart=/usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus \ --config.file=/usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml \ --storage.tsdb.path=/usr/local/prometheus/prometheus-2.45.0.linux-amd64/data \ --storage.tsdb.retention.time=60d \ --web.enable-lifecycle [Install] WantedBy=multi-user.target 使用$ ./prometheus -h 就可以看到帮助信息 通知systemd重新加载配置文件 $ systemctl daemon-reload 以下为相关systemd命令 $ systemctl enable prometheus.service # 设置为开机自启动 $ systemctl disable prometheus.service # 如果不想设置为开机自启动,可以关闭 $ systemctl start prometheus.service # 开启服务 $ systemctl status prometheus.service # 查看状态 $ systemctl restart prometheus.service # 重启服务 $ systemctl stop prometheus.service # 停止服务 启动Prometheus server,并查看是否启动成功active (running) $ systemctl start prometheus.service $ systemctl status prometheus.service ● prometheus.service - Prometheus server Loaded: loaded (/usr/lib/systemd/system/prometheus.service; disabled; vendor preset: disabled) Active: active (running) since 三 2023-09-06 16:14:34 CST; 2s ago Docs: https://prometheus.io/docs/introduction/overview/ Main PID: 21472 (prometheus) CGroup: /system.slice/prometheus.service └─21472 /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus --config.file=/usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml --storage.tsdb.path=/usr/local/pr... #下方省略 若启动失败可自行排查 $ journalctl -u prometheus.service -f 访问地址: 名称 地址 prometheus http://172.17.137.104:9090/ 监控指标 http://172.17.137.104:9090/metrics 界面如下: 安装完成Prometheus,接下来安装Alertmanager 2.安装Alertmanager 官网下载➥ https://prometheus.io/download/ 这里我们选择alertmanager-0.26.0.linux-amd64.tar.gz $ cd /usr/local/prometheus $ wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz 下载完成后,用sha256sum校验一下安装包,没问题的话解压即可 $ sha256sum alertmanager-0.26.0.linux-amd64.tar.gz abd73e2ee6bf67d3888699660abbecba7b076bf1f9459a3a8999d493b149ffa6 $ tar xvf alertmanager-0.26.0.linux-amd64.tar.gz 建议使用Systemd来管理守护进程Alertmanager服务 若文件路径或名字,和下方示例不同记得修改 $ vi /lib/systemd/system/alertmanager.service [Unit] Description=Alert Manager Wants=network-online.target After=network-online.target [Service] Type=simple User=root Group=root Restart=always ExecStart=/usr/local/prometheus/alertmanager-0.26.0.linux-amd64/alertmanager \ --config.file=/usr/local/prometheus/alertmanager-0.26.0.linux-amd64/alertmanager.yml \ --storage.path=/usr/local/prometheus/alertmanager-0.26.0.linux-amd64/data [Install] WantedBy=multi-user.target 通知systemd重新加载配置文件 $ systemctl daemon-reload 启动alertmanager.service $ systemctl start alertmanager.service 若启动失败可自行排查journalctl -u alertmanager.service -f 访问地址 应用名称 地址 Alertmanager http://172.17.137.104:9093/ Alertmanager界面如下 添加Prometheus配置 因为我们安装了Alertmanager,所以需要添加到Prometheus里面 $ vi /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml 把# - alertmanager:9093修改为localhost:9093 因为我们是装在同一个机器上,所以是localhost,若安装不在同一个机器上请修改为正确IP地址 # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: - localhost:9093 <--修改这里,注意缩进 注意!yml文件是有缩进格式的,修改时不要打乱原有格式 在rule_files:添加- "alert.yml",前面缩进只需保留两格! # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - "alert.yml" <--添加这里,注意缩进2格即可 # - "first_rules.yml" # - "second_rules.yml" 增加触发器配置文件 编辑新文件alert.yml添加以下内容,注意格式缩进 $ vi /usr/local/prometheus/prometheus-2.45.0.linux-amd64/alert.yml groups: - name: Prometheus alert rules: # 任何实例超过30s无法联系的情况发出告警 - alert: 服务告警 expr: up == 0 for: 30s labels: severity: critical annotations: instance: "{{ $labels.instance }}" description: "{{ $labels.job }} 服务已关闭" 检查一下配置文件,与下方一致即为成功 $ cd /usr/local/prometheus/prometheus-2.45.0.linux-amd64 $ ./promtool check config prometheus.yml Checking prometheus.yml SUCCESS: 1 rule files found SUCCESS: prometheus.yml is valid prometheus config file syntax Checking alert.yml SUCCESS: 1 rules found 接下来重启一下Prometheus或重新加载配置文件 $ systemctl restart prometheus # 二选一即可 $ curl -X POST http://localhost:9090/-/reload 再次访问http://172.17.137.104:9093/,并检查Status,确认没有问题 3.安装Grafana 官网下载Grafana➥https://grafana.com/grafana/download 进入官网后选择Linux,下方会展示出安装方式,这里选择二进制的方式安装 $ wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.1.linux-amd64.tar.gz $ tar -zxvf grafana-enterprise-10.1.1.linux-amd64.tar.gz 创建 Systemd 服务 $ vi /lib/systemd/system/grafana-server.service [Unit] Description=Grafana server Documentation=https://doce.grafana.org [Service] Type=simple User=root Group=root Restart=on-abnormal ExecStart=/usr/local/prometheus/grafana-10.1.1/bin/grafana-server \ --config=/usr/local/prometheus/grafana-10.1.1/conf/defaults.ini \ --homepath=/usr/local/prometheus/grafana-10.1.1 [Install] WantedBy=multi-user.target 通知 Systemd 重新加载配置文件 $ systemctl daemon-reload 启动grafana-server.service $ systemctl start grafana-server.service 若启动失败可自行排查journalctl -u grafana-server.service -f 访问地址 应用名称 地址 Grafana http://172.17.137.104:3000/ 没问题安装成功! 4.安装node_exporter 下载node_exporter➥ https://prometheus.io/download/ 下拉网页找到node_exporter选择对应文件名下载即可 $ wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz #验证一下是否下载完整 $ sha256sum node_exporter-1.6.1.linux-amd64.tar.gz $ tar -xvf node_exporter-1.6.1.linux-amd64.tar.gz 创建 Systemd 服务 $ vi /lib/systemd/system/node_exporter.service [Unit] Description=node_exporter Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=root Group=root Restart=on-abnormal ExecStart=/usr/local/prometheus/node_exporter-1.6.1.linux-amd64/node_exporter [Install] WantedBy=multi-user.target 通知 Systemd 重新加载配置文件 $ systemctl daemon-reload 启动alertmanager.service $ systemctl start node_exporter.service 若启动失败可自行排查journalctl -u node_exporter.service -f node_exporter访问地址: 应用名称 地址 node_exporter http://172.17.137.104:9100/metrics 添加Prometheus配置 安装完成后还需要添加Prometheus配置,为避免大家打错,这里采用追加写入 $ cat >> /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml <<"EOF" # 在scrape_configs这行下面添加配置 - job_name: "node-exporter" scrape_interval: 15s static_configs: - targets: ["localhost:9100"] labels: instance: prometheus服务器 EOF 重载Prometheus配置 $ curl -X POST http://localhost:9090/-/reload Prometheus web上检查一下 http://172.17.137.104:9090/,点击Status->Targets 可以看到有node_exporter,以及可以检查下我们配置的触发器Alerts->勾选Inactive 至此,通过二进制安装Prometheus就到此完成! 三、使用Grafana 1. 添加Prometheus数据源 我们可以进入Grafana对监控的内容做一个图形的展示,登入http://172.17.137.104:3000/ 输入默认用户名admin,默认密码admin,之后会提示你修改密码,然后就成功登入Grafana 进入后添加Prometheus的数据源,在Connections里有Data sources,总之找到Data sources即可 点击Add data source选择Prometheus,进入配置 在红框处填写Prometheus地址,因为本文部署在本机,所以是localhost,填写完成后滑动页面到最下方,点击Save & test保存和测试 2.导入Grafana仪表盘 下载Grafana仪表盘➥https://grafana.com/grafana/dashboards/ 红框框起来的就是我们需要下载的Node Exporter Full,如果首页没有展示的话,可以直接搜索 点击进去,选择Copy ID to clipboard复制ID 进入http://172.17.137.104:3000/到Grafana上,选择Dashboards,点击New 选择Import 在红框处粘贴刚刚复制的,其实也就是1860,接着点击LOAD加载 可以修改一下名字,在选择下Prometheus点击Import导入即可 这样就完成了Grafana对Prometheus数据的展示 四、监控GreatSQL 不建议采用GreatSQL的root用户监控,因为root的权限非常大,所以我们进入GreatSQL先创建一个用于监控的用户 greatsql> CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'GreatSQL@666'; greatsql> GRANT PROCESS,REPLICATION CLIENT,SELECT ON *.* TO 'exporter'@'localhost'; 接下来需要安装mysqld_exporter,本文依旧采用二进制方式安装 在[点击此处下载https://prometheus.io/download/中找到mysqld_exporter,下载即可 $ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz #验证一下是否下载完整 $ sha256sum mysqld_exporter-0.15.0.linux-amd64.tar.gz $ tar -xvf mysqld_exporter-0.15.0.linux-amd64.tar.gz 创建一个连接数据库的文件.mysqld_exporter.cnf $ vi /usr/local/prometheus/mysqld_exporter-0.15.0.linux-amd64/.mysqld_exporter.cnf #填入以下内容即可 [client] user=exporter password=GreatSQL@666 host=localhost port=3306 创建 Systemd 服务 $ vi /lib/systemd/system/mysqld_exporter.service [Unit] Description=Prometheus GreatSQL After=network.target [Service] Type=simple User=root Group=root Restart=always ExecStart=/usr/local/prometheus/mysqld_exporter-0.15.0.linux-amd64/mysqld_exporter \ --config.my-cnf=/usr/local/prometheus/mysqld_exporter-0.15.0.linux-amd64/.mysqld_exporter.cnf \ --collect.global_status \ --collect.auto_increment.columns \ --collect.info_schema.processlist \ --collect.binlog_size \ --collect.info_schema.tablestats \ --collect.global_variables \ --collect.info_schema.innodb_metrics \ --collect.info_schema.query_response_time \ --collect.info_schema.userstats \ --collect.info_schema.tables \ --collect.perf_schema.tablelocks \ --collect.perf_schema.file_events \ --collect.perf_schema.eventswaits \ --collect.perf_schema.indexiowaits \ --collect.perf_schema.tableiowaits \ --collect.slave_status \ --collect.perf_schema.replication_group_members \ --collect.perf_schema.replication_group_member_stats \ --web.listen-address=0.0.0.0:9104 [Install] WantedBy=multi-user.target 通知 Systemd 重新加载配置文件 $ systemctl daemon-reload 启动alertmanager.service $ systemctl start mysqld_exporter.service 若启动失败可自行排查journalctl -u mysqld_exporter.service -f 访问一下看看能否成功http://172.17.137.104:9104 1.添加Prometheus配置 安装完成后还需要添加Prometheus配置,为避免大家打错,这里采用追加写入 $ cat >> /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml <<"EOF" # mysqld-exporter配置 - job_name: "mysqld-exporter" static_configs: - targets: ["localhost:9104"] labels: instance: prometheus服务器 EOF 重载Prometheus配置 $ curl -X POST http://localhost:9090/-/reload Prometheus web上检查一下 http://172.17.137.104:9090/,点击Status->Targets 2.增加触发器配置文件 编辑prometheus.yml在rule_files:添加- "alert.yml",前面缩进只需保留两格! $ vi /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - "alert.yml" - "rules/*.yml" <-添加这里,注意缩进2格即可 # - "first_rules.yml" # - "second_rules.yml" 表示把rules文件夹下的所有yml文件都导入进来 $ mkdir /usr/local/prometheus/prometheus-2.45.0.linux-amd64/rules $ vi /usr/local/prometheus/prometheus-2.45.0.linux-amd64/rules/mysqld.yml groups: - name: GreatSQL rules: # 任何实例超过30s无法联系的情况发出告警 - alert: GreatSQLDown expr: mysql_up == 0 for: 30s labels: severity: critical annotations: summary: "GreatSQL Down,实例:{{ $labels.instance }}" description: "连接不上GreatSQL了,当前状态为:{{ $value }}" 类似的告警信息都可以自行编写 检查一下配置文件,出现SUCCESS: prometheus.yml is valid prometheus config file syntax即为成功 $ cd /usr/local/prometheus/prometheus-2.45.0.linux-amd64 $ ./promtool check config prometheus.yml Checking prometheus.yml SUCCESS: 2 rule files found SUCCESS: prometheus.yml is valid prometheus config file syntax Checking alert.yml SUCCESS: 1 rules found Checking rules/mysqld.yml SUCCESS: 1 rules found 接下来重启一下 Prometheus 或重新加载配置文件 $ systemctl restart prometheus # 二选一即可 $ curl -X POST http://localhost:9090/-/reload 再次访问http://172.17.137.104:9093/,并检查Status,确认没有问题 3.导入Grafana仪表盘 展示 Prometheus 从 mysql_exporter 收集到的数据,添加仪表盘ID7362 修改名称后点击Import即可 可以看到页面中已经展示了许多内容,例如GreatSQL数据库运行的时间,QPS值,InnoDB Buffer Pool Size,Buffer Poll of Total RAM等 这里Buffer Poll of Total RAM值有些低,说明设置的InnoDB buffer pool大小不对,应该设置约占用总内存的50%到75%,这样可以合理利用内存,提高缓存命中率。 来简单看几个监控项目的意义和内容 MySQL Connections,监控GreatSQL的连接数,有最大连接数及最大使用连接数 MySQL Client Thread Activity,监控GreatSQL的活动线程数,有连接线程数(Threads Connected)和运行线程数(Threads Running) MySQL Table Locks,监控GreatSQL的表锁,我们可以看到GreatSQL从存储引擎请求了多少表级锁。在InnoDB的情况下,很多时候锁实际上可能是行锁,因为它只在少数特定情况下使用表级锁。比较“立即锁定”和“等待锁定”最有用。如果等待的锁数正在上升,则表示存在锁争用。否则,锁立即上升和下降是正常活动。 来查看下QPS是如何监控的,鼠标移动到内容的右上角,会出现三个点,点击Edit,进入编辑 可以看到如下内容 这段监控规则中使用了rate()和irate()函数来计算GreatSQL queries状态计数器的速率。 mysql_global_status_queries{instance="$host"} 表示提取实例$host的queries全局状态计数器。 rate()函数计算该计数器在$interval时间段内的每秒速率。 irate()函数计算该计数器在最近5分钟的每个瞬时速率。 或运算符表示取这两者中的较大值。 如果觉得你想监控的内容没有你想要的,可以点击右上角Add,点击Visualization添加监控内容 例如我想添加一个group_replication_flow_control_countMGR累计触发流控的次数,在Select metric中搜索想监控的状态, label标签 Label filters用于过滤和选择时间序列数据。它可以针对特定的标签值来选择显示哪些时间序列。 例如instance="192.168.1.1:9090"表示只选择instance标签值为"192.168.1.1:9090"的时间序列。 可以在Grafana的面板中使用Label filters字段来指定过滤条件,其作用主要包括: 选择特定实例的数据:如instance="A" 只看实例A的数据 查看特定模式匹配的实例:如instance=~"10\\.8\\..*"选取符合模式的实例 查看某个状态的序列:state="200" 只看状态码为200的 组合多个标签进行过滤: instance=~"1\\d\\.8\\..*",state!="500" 也可以直接输入PromQL进行各种复杂过滤 Operations Operations选项允许对查询结果进行各种操作,常用的操作及含义如下: Rate:计算计数器的增长速率,常用于计数器指标的速率转换,如QPS。 Delta:计算时间序列的增量变化值。 Derivative:计算时间序列的一阶导数,表示瞬时变化率。 Integral:对时间序列求积分,计算面积图。 Aggregation:对结果series做聚合,如平均,最大最小值等。 Transform:进行数学变换,如log等。 Aliasing:结果串进行重命名。 Group by:分组归类。 我们可以选中Metric后,在Operations下拉列表中选择所需要的计算操作。这些操作无需修改PromQL查询语句,在结果集上进行,可以方便地衍生出新的时间序列。例如可以将 COUNTER 计数器转换为 QPS 速率等。这为Grafana提供了灵活的统计和分析能力。 添加完成参数后点击Apply应用即可,回到界面上就可以看到刚刚添加的监控项了 记得要对整个仪表盘也保存,点击右上角图标如下所示,保存即可 也可以对表的情况进行监控,只需导入仪表盘ID9625 至此,通过Prometheus监控GreatSQL到此结束,下部文章将介绍如何使用告警功能 使用Prometheus并不太好监控GreatSQL的MGR,推荐还是使用PMM来监控 欢迎阅读《使用PMM图形化监控MySQL MGR动态》https://mp.weixin.qq.com/s/8v94kxczl5m0MFcp_Dm87w 相关文章: 技术分享 | Prometheus+Grafana监控MySQL浅析➥https://mp.weixin.qq.com/s/Y8YHE7_oBPIfceV8HVywtw Prometheus+Grafana+钉钉部署一个单机的MySQL监控告警系统➥https://mp.weixin.qq.com/s/vck-uD2mmZSQ-RvzU9b0ug Enjoy GreatSQL :) 关于 GreatSQL GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。 相关链接: GreatSQL社区 Gitee GitHub Bilibili GreatSQL社区: 社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html 社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html (对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~) 技术交流群: 微信&QQ群: QQ群:533341697 微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。

优秀的个人博客,低调大师

在元宇宙中搭建语聊房,设计思路和实现方法分享

目标 1. 制定目标 不妨大家想一下这个场景: 你走进一个咖啡厅,看到了一个美女或者帅哥,想要一个微信号,方便后续发展。 那我们要怎么做呢? 走到对方跟前,小声对他说:“你好,你长的很像我的前女友(前男友),可以加下你的微信吗?”。 对方有可能悄声的说,“我扫你”。 你这个时候你就需要把你的二维码展示给他。 当你们恋爱成功,求婚的时候,可能要找一个更加浪漫的环境,并且你们的对话希望给更多人看到、听到。 通过这个上面场景的想象,我们可以简单的确定一些基本的要素 可以更改的场景 (咖啡厅和求婚现场) 自主塑造形象功能(毕竟外貌是一见钟情的原点) 单聊 (要微信号不能一次要一群人得呀。不然可能被当成流氓给打得哟) 文件共享 (把自己得二维码展示给对方,让对方加好友) 群聊、群视频 (把求婚现场给其他用户看) 2. 拆解目标 为了满足上面提到得要求,我们需要以下功能: 支持unity的方便接入。毕竟unity是一个非常好的3D引擎,如果可以方便接入得话,在后续得场景创建和人物创造上都可以有更大的扩展空间 1 vs 1的视频,或者 1 vs 多的直播模式。可以满足单聊和群聊的需求 同步本地播放的本地视频或者远端视频给其他用户。可以满足共享二维码的需求。 3. 效果预览 如果要完整的实现一个完整的项目会花费比较多的时间,而我发现目前声网的 Demo 会提供简单的人物模型和素材,但是他们开放度较高,开发者可以根据需要使用自己定制化的模型素材,为了实现上述提到的需求,我只做了一些微小的修改,就满足了我们的需求。本次主要看下效果,为后续在生产环境中落地做一些技术上的储备。 以下是在demo上调整后显示出来的效果。 这是用unity来实现的一个咖啡厅的样子 这是一个服装店,我们可以给人物进行换装,这个也是由unity来实现的。 以上两个的接入都非常的方便,我们可以很好的对接unity,如果需要的话,后续有自己的unity场景也可以快速接入。 这个是我自己测试的1 vs 1的视频测试效果 这个是我自己测试的将本地视频分享给对方的一个效果 想象一下,是不是可以和你的对象一起看剧了呢? 简单实现 以上效果都是基于声网的sdk来实现的,如果你也想进行尝试或者使用,可以继续查看我的接入过程和中间遇到的问题以及解决方案。 1. 账号准备 我们既然使用了声网的sdk,那注册一个声网的账号做一些声网的账号配置也很合理吧。 注册账号 完成实名 创建项目 配置项目 然后进入详细配置 生成token,并将appid、证书、token复制保存。 注意!!!这里很重要,一定要看仔细,项目中会使用到! 至此,账号的准备已经完成了。 2. 配置项目 demo源码 通过声网官网客服,申请元宇宙 SDK、Unity工程文件、开发指南,同时申请开通使用权限,详情可访问 shengwang.cn 将sdk解压并配置到项目中 一定要注意目录,如果自己的项目中不存在当前的目录要自己创建 配置id一般情况下,这个文件是不会上传到远程仓库的,写到这里也主要是安全考虑。将在后台中申请的appid、证书,复制后粘贴到/Android/local.properties里面,如下: 配置channel 将在后台生成token的时候,填写的channel给写到类中,如下 配置项目权限 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <!-- 对于 Android 12.0 及以上设备,还需要添加如下权限: --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> 注意: Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA 需要动态申请权限,否则无法正常完成视频功能。 sdk本身是不会去申请权限的,所以需要我们自己在合适的位置帮sdk申请好权限。 混淆配置 咖啡厅 做形象 服装店 这里是直接使用了声网给的效果,如果自己项目需要的话,可以去自己去调整。 其中换装和捏脸都需要unity上的一些修改和native与unity的通信。整个可以参考换装和捏脸 3. 视频1vs1 前面已经完成了整体项目的构建。并且已经把unity内容跑起来了,那么接下来我们看下,如果要实现 1vs1的视频要怎么处理。为了方便处理,我单独写了一个页面来处理视频1vs1,效果如下: 视频聊天 这个流程图,建议大家多看几遍,在我们遇到问题的时候,这个图会给我们启发,帮助我们解决问题。 详细流程: 1. 创建RtcEngine对象 该对象管理了整个的视频等场景,是一个非常核心的对象。 try { RtcEngineConfig config = new RtcEngineConfig(); config.mContext = getBaseContext(); config.mAppId = appId; config.mEventHandler = mRtcEventHandler; config.mAudioScenario = Constants.AudioScenario.getValue(Constants.AudioScenario.DEFAULT); mRtcEngine = RtcEngine.create(config); } catch (Exception e) { throw new RuntimeException("Check the error."); } 2. 创建RtcEngine属性 // 视频默认禁用,你需要调用 enableVideo 启用视频流。 mRtcEngine.enableVideo(); // 录音默认禁用,你需要调用 enableAudio 启用录音。 mRtcEngine.enableAudio(); // 开启本地视频预览。 mRtcEngine.startPreview(); 3. 将本地摄像头内容显示到local_video_view_container上 FrameLayout container = findViewById(R.id.local_video_view_container); // 创建一个 SurfaceView 对象,并将其作为 FrameLayout 的子对象。 SurfaceView surfaceView = new SurfaceView (getBaseContext()); container.addView(surfaceView); // 将 SurfaceView 对象传入声网,以渲染本地视频。 mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, KeyCenter.RTC_UID)); 4. 设置当前的模式 ChannelMediaOptions options = new ChannelMediaOptions(); // 将用户角色设置为 BROADCASTER。 options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER; // 视频通话场景下,设置频道场景为 BROADCASTING。 options.channelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING; 其中clientRoleType有两种,如果是CLIENT_ROLE_BROADCASTER就是可以播和收,如果是CLIENT_ROLE_AUDIENCE就只能收看,当前就成了主播模式。 5. 加入频道 // 使用临时 Token 加入频道。 // 你需要自行指定用户 ID,并确保其在频道内的唯一性。 int res = mRtcEngine.joinChannel(token, channelName, KeyCenter.RTC_UID, options); if (res != 0) { // Usually happens with invalid parameters // Error code description can be found at: // en: https://docs.agora.io/en/Voice/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_i_rtc_engine_event_handler_1_1_error_code.html // cn: https://docs.agora.io/cn/Voice/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_i_rtc_engine_event_handler_1_1_error_code.html Log.e("video","join err:"+RtcEngine.getErrorDescription(Math.abs(res))); } joinChannel方法有返回值,可以看到我们加入频道是否成功了,如果不成功的话,我们可以看下错误原因,并对照解决;如果成功了,就可以观察IRtcEngineEventHandler对象的回调方法,重点关注下 onError(int err) 和onJoinChannelSuccess(String channel, int uid, int elapsed) 如果收到 onJoinChannelSuccess方法的回调,我们就可以关注 onUserJoined(int uid, int elapsed) 方法,我们可以在这个方法里开始显示远端内容。 6. 显示远端内容 @Override // 监听频道内的远端主播,获取主播的 uid 信息。 public void onUserJoined(int uid, int elapsed) { Log.e(TAG, "onUserJoined->" + uid); runOnUiThread(new Runnable() { @Override public void run() { // 从 onUserJoined 回调获取 uid 后,调用 setupRemoteVideo,设置远端视频视图。 setupRemoteVideo(uid); } }); } private void setupRemoteVideo(int uid) { FrameLayout container = findViewById(R.id.remote_video_view_container); SurfaceView surfaceView = new SurfaceView (getBaseContext()); surfaceView.setZOrderMediaOverlay(true); container.addView(surfaceView); mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, uid)); } 最终,远端的视频会显示在 remote_video_view_container 上。 4. 将本地播放的视频显示给远端用户 同步本地播放给远端 将本地视频怎么同步给远端的用户呢?其实从本质上来讲,将本地摄像头和将本地播放的视频给远端用户看,对远端用户都是一样的,不一样的是本地用户给远端用户的数据源是哪个。一个是摄像头,一个是播放器。 设置本地video的时候做下修改 FrameLayout container = findViewById(R.id.local_video_view_container); // 创建一个 SurfaceView 对象,并将其作为 FrameLayout 的子对象。 SurfaceView surfaceView = new SurfaceView (getBaseContext()); container.addView(surfaceView); // 将 SurfaceView 对象传入声网,以渲染本地视频。 VideoCanvas videoCanvas = new VideoCanvas(surfaceView, Constants.RENDER_MODE_HIDDEN, Constants.VIDEO_MIRROR_MODE_AUTO, Constants.VIDEO_SOURCE_MEDIA_PLAYER, mediaPlayer.getMediaPlayerId(), KeyCenter.RTC_UID); mRtcEngine.setupLocalVideo(videoCanvas); 在int res = mRtcEngine.joinChannel(token, channelName, KeyCenter.RTC_UID, options);是0的时候,调用如下方法: int res = mRtcEngine.joinChannel(token, channelName, KeyCenter.RTC_UID, options); if (res != 0) { // Usually happens with invalid parameters // Error code description can be found at: // en: https://docs.agora.io/en/Voice/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_i_rtc_engine_event_handler_1_1_error_code.html // cn: https://docs.agora.io/cn/Voice/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_i_rtc_engine_event_handler_1_1_error_code.html Log.e("video","join err:"+RtcEngine.getErrorDescription(Math.abs(res))); }else { mediaPlayer = mRtcEngine.createMediaPlayer(); mediaPlayer.registerPlayerObserver(this); mediaPlayer.open(MetaChatConstants.VIDEO_URL, 0); } 3.监听onPlayerStateChanged回调并在state是PLAYER_STATE_OPEN_COMPLETED的时候执行play方法,代码如下: public void onPlayerStateChanged(io.agora.mediaplayer.Constants.MediaPlayerState state, io.agora.mediaplayer.Constants.MediaPlayerError error) { if(state == io.agora.mediaplayer.Constants.MediaPlayerState.PLAYER_STATE_OPEN_COMPLETED){ mediaPlayer.play(); } } 至此,就完成了功能上的使用。 其它功能 除了上面提到的功能外,声网还提供了一些其他的功能,在需要的时候可以直接使用,或者少量修改就可以用的。 比如说空间音效功能,该功能基于声学原理,模拟声音在不同空间环境中的传播、反射、吸收效果。可以为用户提供旅游中路人聊天声、海浪声、风声等,让用户更沉浸式体验 再比如说实时共赏影音功能。该功能可以几乎无延时的实现,远程观影、听歌等功能。甚至可以实现k歌的能力。 更多的功能期待大家一起发掘! 参考资料 注册声网账号 声网官网 SDK下载 快速开始 - 实现音视频通话 媒体播放器

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册