目标

使用 VirtualBox 最小安装 CentOS7.x 并配置网络、环境变量等…

VM 不支持 64 位系统问题

三种情况:

  1. 开启了 hyper-v,在 控制面板-启用或关闭 Windows 功能 中取消勾选,重启。
  2. 未开启虚拟化,进入 BIOS 进行设置。
  3. 管理员 cmd 输入 bcdedit 查看 hypervisorlaunchtype,使用命令 bcdedit /set hypervisorlaunchtype off 将其设为 off 并重启。

配置网络

均采用 NAT 方式。

使用 VMware

VMware虚拟机三种网络模式详解与配置 - 知乎 (zhihu.com)

配置虚拟网卡 VMnet8,其作用是供虚拟机和主机通信。

在 VM “虚拟网络编辑器”中配置 NAT 模式,需要同 VMnet8 在相同网段。配置静态 IP 的话,可以将 使用本地DHCP服务器xxx 选项取消。

在虚拟机中配置静态 IP:vi /etc/sysconfig/network-scripts/ifcfg-ens33,配置完后重启网络服务 service network restart

ping 一下主机和外网,主机 ping 不通的话需要配置一下 windows 的防火墙,允许 ICMP 报文通过。 ping 不通外网的话,重启下 VMnet8 适配器。

关闭网火墙与自启:

systemctl stop firewalld.service
systemctl disable firewalld.service

修改主机名和 hosts:分别在 etc/ 下的 hostnamehosts 进行配置。

使用 VirtualBox

区别在于虚拟机内网卡名称不同,除了配置 NAT 网卡,主机要 ping 通虚拟机的话,需要额外配置 Host 网卡,或者是 NAT 网卡的端口转发。

在虚拟机全局配置中,新增一个 NAT 网卡,配置一个网段;

在虚拟机实例的配置中启用该 NAT 网卡;

修改虚拟机实例内的网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 ,并重启 service network restart

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
# 配置为静态
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=10a082aa-82b3-42d1-9469-81e280073af6
DEVICE=enp0s3
# 启动时生效
ONBOOT=yes
 
# 前面配置的网段内写一个即可
IPADDR=192.168.100.100
# VirtualBox 此处默认网络号.1
GATEWAY=192.168.100.1
DNS1=8.8.8.8

这时虚拟机实例应该已经可以 ping 通外网,但主机无法 ping 通虚拟机,有两个办法:

方法 a. 配置 Host 网卡,与配置 NAT 网卡步骤相同,需要将 ifcfg-enp0s3 复制一份出来,改名为 Host 网卡在虚拟机实例中的名称 (通过 ip addr 命令查看),注意还要修改 NAMEUUIDDEVICE 这几项。

# enp0s8 Host 网卡配置
# ...
NAME=enp0s8
UUID=10a082aa-82b3-42d1-9469-81e280073af8
DEVICE=enp0s8
ONBOOT=yes
 
IPADDR=192.168.56.101
GATEWAY=192.168.56.1
DNS1=8.8.8.8

此时主机应当可以通过 Host 网卡 ping 通虚拟机实例,但这有些麻烦,看下面的方法 b:

方法 b. 如图所示配置 NAT 端口转发,接下来就可以使用 127.0.0.1 + 主机端口 登录虚拟机实例:

软件安装

工具

yum update && yum upgrade -y
yum install -y net-tools
yum install -y rsync
yum install -y vim
# 安装额外软件仓库epel-release
yum install -y epel-release

安装 JRE 配置环境变量

环境变量

以 CentOS7.x 安装 JRE 举例:

注意:

 
# 上传并解压 jre 到 /opt/module
tar -zxvf server-jre-8u202-linux-x64.tar.gz -C /opt/module/
 
# 1.可以添加到 /etc/profile 最后面
vim /etc/profile
# 观察该文件最后的脚本
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done
# 作用是让 /etc/profile.d/ 下以.sh结尾的文件中配置的环境变量生效
 
# 2.故也可以在该文件夹下创建 xxx.sh 配置环境变量
vim /etc/profile.d/my_env.sh
# 添加:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin
# 生效一下
source /etc/profile
 
# 验证
java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
指向原始笔记的链接

source 命令失效

ls -l /bin/sh
# 输出 /bin/sh -> dash
# 可以看到 sh 被链接到了 dash
# 干掉,链接到 bash
sudo rm /bin/sh
sudo ln -s /bin/bash /bin/sh
指向原始笔记的链接

其他

添加用户并配置权限

# 添加用户
useradd me
passwd me
 
# 配置me具有root权限
# 以后me用户执行sudo时,就不需要输入密码了
vim /etc/sudoers
# 在 %wheel ALL=(ALL) ALL 下面添加
me ALL=(ALL) NOPASSWD:ALL

配置密钥登录

配置密钥登录

目的:便于本地与服务器、服务器与服务器之间建立链接,免去密码输入过程。
方法:要实现 A 能免密登陆 B,需要将 A 的公钥发送给 B,让 B 保存在 .ssh/authorized_keys 中。

# 生成密钥
ssh-keygen -t rsa
# 位于用户家目录下的隐藏文件夹 .ssh/ 下
ls ~ -al 
# 在 A 中执行该命令将 A 的公钥复制到 B 的 authorized_keys 中,需要输入一次密码,后续链接将不需要密码
ssh-copy-id user@hostB
 
# 宿主机是 Windows,则手动 copy 生成的公钥到 authorized_keys 下
指向原始笔记的链接

Shell 脚本配置

Bash 配置

source 命令失效

ls -l /bin/sh
# 输出 /bin/sh -> dash
# 可以看到 sh 被链接到了 dash
# 干掉,链接到 bash
sudo rm /bin/sh
sudo ln -s /bin/bash /bin/sh

scp

scp:用于在本机与服务器,远程服务器与服务器之间 复制 文件。

# 命令:scp -r 源文件或目录 目标地址
# 参数:-r 表示递归
# 举例:
    # 本机 --> 服务器A
    scp -r path/file  user@hostA:path/
    # 本机 <-- 服务器A
    scp -r user@hostA:path/file  path/
    # 服务器A --> 服务器B
    scp -r user@hostA:path/file  user@hostB:path/

rsync

用于 同步 文件。

# 如果没有安装
yum install -y rsync
# rsync -av 源文件或目录 目标地址
# 参数:-a 归档拷贝;-v verbose
# 举例:
	# 同步本地和服务器A的module文件夹
	rsync -av module/ user@hostA:/opt/module/

xsync

编写脚本,便于多个服务器同步文件

#!/bin/bash
 
#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Arguement!
  exit;
fi
 
#2. 遍历集群所有机器
for host in centos101 centos102 centos103
do
  # 如果是本机则跳过
  if [ $HOSTNAME == $host ]
  then
    continue
  fi
  echo ==================== $host ====================
  #3. 遍历所有目录,挨个发送
  for file in $@
  do
    #4. 判断文件是否存在
    if [ -e $file ]
    then
      #5. 获取父目录
      pdir=$(cd -P $(dirname $file); pwd)
      #6. 获取当前文件的名称
      fname=$(basename $file)
      ssh $host "mkdir -p $pdir"
      rsync -av $pdir/$fname $host:$pdir
    else
      echo $file does not exists!
    fi
  done
done

xcall

#!/bin/bash
 
# 指令
cmd=$*
# 判断指令是否为空
if (( #$cmd -eq # ))
then 
	echo "command can not be null !"
	exit
fi
 
# 获取当前登录用户
user=`whoami`
 
# 遍历执行发送指令
for host in centos101  centos102 centos103
do
  echo ------ $host ------
  ssh $user@$host $cmd
done
 
echo ------ end ------
# 将脚本放到 ~/bin 中以方便全局调用
# 修改权限
chmod +x xsync
chmod +x xcall
指向原始笔记的链接

克隆虚拟机

关机 shutdown -h now,然后将这台虚拟机实例 centos00 作为模板机,另外克隆出几台实例方便后续操作,需要配置主机名称、网络等。