分类 linux 下的文章

xenserver平台,centos7的vm,在更新完5.14内核后重启会提示如下错误:

[ OK ] Reached target Basic System.
dracut-initqueue[227]: Warning: Counld not boot.
dracut-initqueue[227]: Warning: /dev/mapper/centos-root does not exist
dracut-initqueue[227]: Warning: /dev/centos/root does not exist
dracut-initqueue[227]: Warning: /dev/centos/swap does not exist
             Starting Dracut Emergency Shell ...
Warning: /dev/mapper/centos-root does not exist
Warning: /dev/centos/root does not exist
Warning: /dev/centos/swap does not exist 

但是,在5.12之前的内核是没有问题的,这是因为在新的内核里xen平台的两个模块没有加入到启动镜像里,重新生成一下启动镜像即可。

cd /boot/
dracut -v -f -H -k /usr/lib/modules/5.15.11-1.el8.elrepo.x86_64/ --add-drivers "xen-blkfront xen-netfront dm-mod" initramfs-5.15.11-1.el8.elrepo.x86_64.img 5.15.11-1.el8.elrepo.x86_64

注意:更新内核后,网卡名称会变成espXX这样的名字,如果之前是用ethX这样命名网卡,那就需要添加net.ifnames=0 biosdevname=0参数,否则,这两个参数就不需要添加。在GRUB_CMDLINE_LINUX=后面添加 net.ifnames=0 biosdevname=0
修改后的应该如下

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"

一、安装FreeRadius
以CentOS7.9为例,用yum安装

yum install freeradius freeradius-utils -y
systemctl enable radiusd
systemctl start radiusd

需要放开防火墙的1812和1813的udp端口,这里有个坑,启动radiusd的时候可能会报错,可以用radius -X来启动调试模式看一下错误信息,如果提示:

Failed reading certificate file "/etc/raddb/certs/server.pem" 
Permission denied

这个是因为radius的编译脚本有点小bug,导致/etc/raddb/certs/目录下的一些文件权限600设的不够,改成644权限就可以了。
修改/etc/raddb/clents.conf,在client localhost上面添加

client all_client {
    ipaddr = 0.0.0.0/0
    secret = secret2021
    require_message_authenticator = no
}

secret是共享密钥。
二、安装daloRadius和配置FreeRadius
1.安装MariaDB不再赘述,创建radius数据库

mysql>create database radius;
mysql>grant all on radius.* to radius@localhost identified by "radpass"; 
mysql>exit;

2.导入radius表

mysql -u root radius < /etc/raddb/mods-config/sql/main/mysql/scheama.sql

共导入了7个表,分别是:
radcheck 用户检查信息表
radreply 用户回复信息表
radgroupcheck 用户组检查信息表
radgroupreply 用户组检查信息表
radusergroup 用户和组关系表
radacct 计费情况表
radpostauth 认证后处理信息,可以包括认证请求成功和拒绝的记录。
3.建立组信息:(在此新建组名称为H3C)

insert into `radgroupreply` (`id`, `groupname`, `attribute`, `op`, `value`) values('1','H3C','Huawei-Exec-Privilege',':=','3');
insert into `radgroupreply` (`id`, `groupname`, `attribute`, `op`, `value`) values('2','H3C','Service-Type',':=','Login');
insert into `radgroupreply` (`id`, `groupname`, `attribute`, `op`, `value`) values('3','H3C','Login-Service',':=','Telnet');

注意,老版本的H3C交换机的reply属性是Huawei-Exec-Privilege,新版本的已经变更为Exec_Privilege,参见https://www.h3c.com/cn/d_201708/1023166_30005_0.htm#_Ref224994526
4.建立用户信息:(在此新建用户名为test,密码为testpwd)

insert into radcheck (username,attribute,op,value) values ('test','Cleartext-Password',':=','testpwd');

5.将用户加入组中:

insert into radusergroup (username,groupname) values ('test','H3C'); 

6.修改 FreeRADIUS中的mysql 认证配置

cd /etc/raddb/mods-enabled
ln -s ../mods-available/sql

7.修改 FreeRADIUS中的mysql 配置文件
该配置文件位于/etc/raddb/mods-available目录,名称为sql
可以通过vi来修改,命令如下:

vi /etc/raddb/mods-available/sql

找到driver = “rlm_sql_null”这一行,修改为driver = “rlm_sql_mysql”,找到dialect = "sqlite"改成dialect = "mysql",在这行下面的Connection info修改radius的mysql登录信息,取消前面的行注释,然后保存并退出。
8.安装daloRADIUS和nginx、php不再赘述,注意:php需要gd库和php-pear(php74-php-pear)

yum install php74-php-pear
php74-pear install db
php74-pear channel-update pear.php.net

9.导入daloRADIUS的数据库
注意:/home/daloradius/为假设你的daloradius的安装目录

cd /home/daloradius/contrib/db
mysql -uradius -pradpass radius < ./mysql-daloradius.sql
mysql -u root -p radius < fr2-mysql-daloradius-and-freeradius.sql

10.设置daloRADIUS的数据库连接
具体操作可以查看INSTALL文档。
11.nginx配置不再赘述
配置完成后,通过浏览器就可以访问daloRADIUS的管理界面,第一次登录的用户是administrator,密码是radius。如果生产环境使用的话一定要修改以下密码,这个用户的信息在表operators里面。
三、配置H3C交换机
1.首先通过console口登录交换机,执行以下命令

radius scheme yourname
primary authentication 172.20.68.225
primary accounting 172.20.68.225
key authentication cipher $c$3$kbh9Ex7mC6yftMzlDevC1EYKiOvNO7vxhWsN
key accounting cipher $c$3$HbzbEM/xUnYjN/IgTvmGYI5rfSzavhjf5nQj
user-name-format without-domain
quit

domain yourname
authentication default radius-scheme yourname
authorization default radius-scheme yourname
accounting default radius-scheme yourname
quit

domain default enable yourname

注意:key部分,是radius的共享密钥,在radius服务器的/etc/raddb/clients.conf里有配置。
2.开启ssh或telnet不赘述,但是,不需要再添加local-user了
以上完成后,就可以开始测试了,如果有问题,可以先关闭radius服务,在radius的调试模式下进行。

radiusd -X

在调试模式下,可以看到详细的连接情况和错误信息
注意:华为华三交换机一定要在radreply表添加以下信息才能登录并获取最高权限

id    username    attribute    op    value
1    test    Huawei-Exec-Privilege    :=    3
2    test    Service-Type    :=    Login
3    test    Login-Service    :=    Telnet

四、一些常见的错误
1.daloradius提示Unknown column ‘acctupdatetime’ in ‘field list’错误,并且无法连接vpn、无法查看在线用户
查看日志显示如下信息

rlm_sql_mysql: MySQL error ‘Unknown column ‘acctupdatetime’ in ‘field list”

解决方法如下:
删除radacct表 并重新建立

mysql -u radius -p

输入密码
在sql中执行如下语句

use radius;
DROP TABLE radacct;
CREATE TABLE radacct (
  radacctid bigint(21) NOT NULL auto_increment,
  acctsessionid varchar(64) NOT NULL default '',
  acctuniqueid varchar(32) NOT NULL default '',
  username varchar(64) NOT NULL default '',
  groupname varchar(64) NOT NULL default '',
  realm varchar(64) default '',
  nasipaddress varchar(15) NOT NULL default '',
  nasportid varchar(15) default NULL,
  nasporttype varchar(32) default NULL,
  acctstarttime datetime NULL default NULL,
  acctupdatetime datetime NULL default NULL,
  acctstoptime datetime NULL default NULL,
  acctinterval int(12) default NULL,
  acctsessiontime int(12) unsigned default NULL,
  acctauthentic varchar(32) default NULL,
  connectinfo_start varchar(50) default NULL,
  connectinfo_stop varchar(50) default NULL,
  acctinputoctets bigint(20) default NULL,
  acctoutputoctets bigint(20) default NULL,
  calledstationid varchar(50) NOT NULL default '',
  callingstationid varchar(50) NOT NULL default '',
  acctterminatecause varchar(32) NOT NULL default '',
  servicetype varchar(32) default NULL,
  framedprotocol varchar(32) default NULL,
  framedipaddress varchar(15) NOT NULL default '',
  PRIMARY KEY (radacctid),
  UNIQUE KEY acctuniqueid (acctuniqueid),
  KEY username (username),
  KEY framedipaddress (framedipaddress),
  KEY acctsessionid (acctsessionid),
  KEY acctsessiontime (acctsessiontime),
  KEY acctstarttime (acctstarttime),
  KEY acctinterval (acctinterval),
  KEY acctstoptime (acctstoptime),
  KEY nasipaddress (nasipaddress)
) ENGINE = INNODB;

systemctl restart radiusd

先到Nginx的官网去下载最新的源码到/usr/loacal/src/目录

wget http://nginx.org/download/nginx-1.23.1.tar.gz

解压后编译

tar -zxf nginx-1.23.1.tar.gz
cd nginx-1.23.1

注意:
这里需要修改openssl的编译配置,否则编译的时候会报错

vi auto/lib/openssl/conf

把这里

    CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
    CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
    CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
    CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"

修改成

    CORE_INCS="$CORE_INCS $OPENSSL/include"
    CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
    CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
    CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"

如果需要隐藏nginx的版本,需要修改两个文件

vi src/core/nginx.h
vi src/http/ngx_http_header_filter_module.c

然后开始编译

make

编译完成后,停止nginx服务,开始安装,安装完了再启动nginx服务

systemctl stop nginx
make install
systemctl start nginx

顺利的话,以上就完成了nginx的升级,然后修改nginx的配置文件,开启TLSv1.3

vi /etc/nginx/nginx.conf

在http段添加

ssl_protocols TLSv1.2 TLSv1.3;

同时,启用HSTS,继续添加

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options "DENY";

修改完配置后重启nginx服务

systemctl restart nginx

无法通过yum直接升级,只能下载源码编译升级,不过,好在编译比较容易。
下面简述一下步骤。
首先到openssl官网下载源码到/usr/local/src/

cd /usr/local/src/
wget https://www.openssl.org/source/openssl-1.1.1s.tar.gz

解压后编译

tar -zxf openssl-1.1.1s.tar.gz
cd openssl-1.1.1s
./config --prefix=/usr/local/openssl
make && make install

编译完成后备份旧版

rm -f /usr/bin/openssl.old
rm -rf /usr/lib64/openssl.old
rm -f /usr/lib64/openssl.old
rm -f /usr/lib64/libssl.so.old
rm -f /usr/include/openssl
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/lib64/openssl /usr/lib64/openssl.old
mv /usr/lib64/libssl.so /usr/lib64/libssl.so.old
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
ln -s /usr/local/openssl/lib/libssl.so /usr/lib64/libssl.so
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v

完成了,检查一下版本

openssl version

一、前期概述
典型的BS架构应用,搭在Ctrix XenServer7.5的平台上,项目共有4台物理机做虚拟化平台,没有做pool,都是独立服务器,共同连接一个光纤存储。在虚拟化平台上开了若干个应用服务器,一个文件服务器,应用前端用负载均衡设备做分发,文件服务器的数据盘挂载在光纤存储上。
二、故障
故障发生在虚拟化平台上,4台虚拟化平台中的一台机器主板损坏,导致其与光纤存储的连接中断,由于给文件服务器的数据盘划分了1.8T的空间,单个存储的LUN为16T,管理员对文件服务器做了多次快照,导致该存储上的虚拟磁盘较多。正好赶上服务器主板损坏,造成了存储上的虚拟磁盘混乱,具体表现为:在其他三台服务器上重新扫描该存储失败,提示:SM has thrown a generic python exception,只有一台可以正常扫描。因为事发紧急,没有及时处理该问题,更换服务器主板后,重新上线,仍然无法连接该存储。经过2周左右,唯一可以正常连接存储的那台服务器也无法连接了,存储与服务器彻底断开了。忘记该存储SR后重新创建,提示错误。
lun-unplug.png
三、解决方案
网上找到了https://blog.51cto.com/zhangyu/1184910 这篇文章,找到了解决问题的思路。
ssh到xenserver的主机上,查看pv、vg、lv,该16T的磁盘都可以看到,但是所在vg没有激活,所在vg的lv很多,其中有几个inflate_开始的lv,看起来比较奇怪。删除这些异常的lv后,应该就可以了。

vgchange -ay VG_XenStorage-0c405034-a99e-68d8-523e-c061097b7d3f --config global{metadata_read_only=0}

激活该vg,这时候就可以对该vg的lv进行操作了

lvremove /dev/VG_XenStorage-0c405034-a99e-68d8-523e-c061097b7d3f/inflate_* --config global{metadata_read_only=0}

删除这些异常的lv后再重新创建SR,就可以顺利通过了。
操作完成后,重启一下所有xenserver服务器,就可以全部正常挂载了。