说明:
1. 开卷,把代码和命令敲出来,能跑通,贴进来即可
2.不会写的题可以不写,但尽量写一下哪里不懂
一:用sed 命令修改/etc/fstab文件,删除文件中的空行,注释行,并保留文件备份(7分)
答案写这里:
sed -i.bak '/^$/d;/^#/d' /etc/fstab
二: 用 find 命令查找出 /var/ 目录中大于1M且以db结尾的文件(7分)
答案写这里:
find /var/ -type f -size +1M -name "*db"
三: 先判断当前主机是否安装了nginx包,如果没安装,则执行命令安装,如果己安装,则执行命令卸载,用短路运算实现(rocky8.6)(7分)
答案写这里:
rpm -q nginx &> /dev/null && yum remove -y nginx || yum install -y nginx
四:请用 rpm 命令列出 nginx 包中所有的配置文件(7分)
答案写这里:
rpm -qc nginx
五: 新增一块20G的硬盘,分三个区,大小分别是3GB,4GB,5GB,将这三个分区做成物理卷,然后创建卷组,在该卷组上创建一个6GB的逻辑卷,挂载至/log/ 目录下,再将该逻辑卷扩容至10GB,请写出实现步骤,文件系统不限(7分)
答案写这里:
第一步:初始化新的硬盘
执行 `lsblk` 或 `fdisk -l` 命令来完成。
第二步:划分分区
使用 fdisk 分割硬盘
执行命令 `fdisk /dev/sdb`
在 `fdisk` 的交互界面中:
- 输入 `n` 来创建新分区。
- 输入 `p` 选择主分区。
- 输入分区大小,例如对于第一个 3GB 分区,输入默认起始点,然后输入 `+3G`。
- 对于第二个 4GB 分区,重复以上步骤,输入 `+4G`。
- 对于第三个 5GB 分区,再次重复步骤,这次不需要指定大小,直接按回车使用剩余空间。
- 输入 `w` 保存并退出。
第三步:格式化分区
3. **格式化分区**:使用 `mkfs` 命令来格式化这些分区。我们这里使用 ext4 文件系统为例。
执行命令 `mkfs.ext4 /dev/sdb1`
第四步:创建物理卷
执行命令 `pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3`
第五步:创建卷组
执行命令 `vgcreate myvg /dev/sdb1 /dev/sdb2 /dev/sdb3`
第六步:创建逻辑卷
执行命令 `lvcreate -L 6G -n loglv myvg`
第七步:格式化逻辑卷
执行命令 `mkfs.ext4 /dev/myvg/loglv`
第八步:挂载逻辑卷
执行命令 `mkdir -p /log`
`mount /dev/myvg/loglv /log`
第九步:扩展逻辑卷
执行命令 `lvextend -L +4G /dev/myvg/loglv`
第十步:调整文件系统大小
执行命令 `resize2fs /dev/myvg/loglv`
六:根据下列命令执行结果,写出你能读出来的信息(7分)
```bash
[mage@rocky86 ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─rl-root 253:0 0 70G 0 lvm /
├─rl-swap 253:1 0 2G 0 lvm [SWAP]
└─rl-home 253:2 0 127G 0 lvm /home
答案写这里:
磁盘设备信息:
sda: 这是系统的主要硬盘,具有主次设备号 8:0,大小为 200G,并且是一个非可移动的磁盘(RM 标志为 0)。
分区信息:
sda1: 这是 sda 磁盘的第一个分区,大小为 1G,被用作 /boot 目录的挂载点。
sda2: 这是 sda 磁盘的第二个分区,大小为 199G,它本身没有直接挂载,但包含了后续的 LVM 卷组。
LVM (Logical Volume Manager) 信息:
rl-root, rl-swap, rl-home: 这些是由 sda2 分区创建的逻辑卷,属于同一卷组。它们分别用于挂载根目录 /、交换分区 [SWAP] 和 /home 目录。
rl-root: 大小为 70G,挂载在 / 目录下。
rl-swap: 大小为 2G,用作交换空间。
rl-home: 大小为 127G,挂载在 /home 目录下。
类型标识:
disk: 表示设备是一个磁盘。
part: 表示设备是一个分区。
lvm: 表示设备是一个 LVM 逻辑卷。
读写属性:
RO 标志为 0 表示设备是可以读写的,而非只读。
挂载点:
挂载点列出了每个分区或逻辑卷在系统中的挂载位置。
七: 请配置一块网卡,IP地址是 10.0.0.110,子网掩码是24位,网关是 10.0.0.2,DNS分别是 10.0.0.2 和 114.114.114.114,请写出配置文件内容,另外,写一个脚本,配置成别名,该别名对 root用户永久生效,要求传入网卡设备名可以让修改后的内容重载生效。(8分)
答案写这里:
网卡配置文件内容
# 网卡配置文件内容
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.110
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=10.0.0.2
DNS2=114.114.114.114
脚本
#!/bin/bash
# 检查参数是否提供
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <device>"
exit 1
fi
# 设备名
DEVICE=$1
# 配置文件路径
CONF_FILE="/etc/sysconfig/network-scripts/ifcfg-$DEVICE:0"
# 写入别名配置
echo "TYPE=Ethernet" > $CONF_FILE
echo "BOOTPROTO=none" >> $CONF_FILE
echo "DEFROUTE=no" >> $CONF_FILE
echo "IPV4_FAILURE_FATAL=no" >> $CONF_FILE
echo "NAME=$DEVICE:0" >> $CONF_FILE
echo "UUID=<your-unique-uuid>" >> $CONF_FILE
echo "DEVICE=$DEVICE:0" >> $CONF_FILE
echo "ONBOOT=yes" >> $CONF_FILE
echo "IPADDR=10.0.0.110" >> $CONF_FILE # 注意这里的 IP 地址需要更改
echo "NETMASK=255.255.255.0" >> $CONF_FILE
echo "GATEWAY=" >> $CONF_FILE
echo "DNS1=10.0.0.2" >> $CONF_FILE
echo "DNS2=114.114.114.114" >> $CONF_FILE
# 重载网络设置
systemctl restart network
#保存以上内容为脚本,脚本命名为network_reload.sh
#创建一个别名写入到root的.bashrc文件中
[root@blog-web ~]# echo "alias modnet='bash /root/network_reload.sh'" >> /root/.bashrc
#加载
[root@blog-web ~]# source .bashrc
八: 请描述一下一个网络请求从一台设备到另一台设备的具体过程(10分)
答案写这里:
应用程序(如Web浏览器)发起请求,例如发送一个HTTP GET请求。
请求被封装成TCP段或UDP数据报。
TCP段或UDP数据报被封装在网络层的IP数据包中。IP协议添加源IP地址和目的IP地址。路由器使用IP地址进行数据包的路由决策,将数据包从源设备转发到目的地。
IP数据包被封装在链路层的数据帧中。添加源MAC地址和目的MAC地址。如果目的地址是广播地址或多播地址,或者如果设备不知道目的MAC地址,它将广播ARP请求来查找目的设备的MAC地址。
数据帧被转换为比特流,通过物理介质(如以太网线、光纤或无线信号)发送。
目的设备的应用层准备响应,经过相同的逆向封装过程,最终通过物理层发送回源设备。
九:当执行shell脚本时,可向shell脚本传参,请说明 $0, $#,$@,$* 这几个参数的含义(10分)
答案写这里:
$0
变量包含的是脚本本身的名称。
$#
变量包含了传递给脚本的参数个数。$@ 和 $* 都是用来引用所有传递给脚本的参数,但它们在某些情况下表现不同。
当在双引号内使用时,"$@" 将每个参数视为单独的字符串,即使参数中包含空格或其他特殊字符。这意味着 "$@" 在传递给其他命令或函数时,会保持参数的完整性,每个参数都会被视为独立的实体。
相比之下,"$*" 在双引号内使用时,将所有参数合并为一个字符串,中间用空格分隔。如果某个参数中包含空格,那么 "$*" 会将它视为字符串的一部分,而不是独立的参数。
十: 写一个脚本,计算出100以内能被3整除的数之和,以及能被4整除的数之后,然后再输出这两个数字(10分)
答案写这里:
#!/bin/bash
# 初始化计数器
sum_div_by_3=0
sum_div_by_4=0
# 循环遍历从 1 到 100 的数字
for (( i=1; i<=100; i++ ))
do
# 检查数字是否能被 3 整除
if [ $((i % 3)) -eq 0 ]; then
sum_div_by_3=$((sum_div_by_3 + i))
fi
# 检查数字是否能被 4 整除
if [ $((i % 4)) -eq 0 ]; then
sum_div_by_4=$((sum_div_by_4 + i))
fi
done
# 输出结果
echo "Sum of numbers divisible by 3: $sum_div_by_3"
echo "Sum of numbers divisible by 4: $sum_div_by_4"
十一:写一个脚本,打印输出8行8列的国际象棋棋盘,使用红黄两色(10分)
答案写这里:
#!/bin/bash
# ANSI color codes
RED="\E[41m"
YELLOW="\E[43m"
RESET="\E[0m"
# Function to print a single square of the chessboard
print_square() {
if (( ($1 + $2) % 2 == 0 )); then
echo -ne "${YELLOW} ${RESET}"
else
echo -ne "${RED} ${RESET}"
fi
}
# Print the chessboard
for ((row=0; row<8; row++)); do
for ((col=0; col<8; col++)); do
print_square $row $col
done
echo # Newline for the next row
done
十二:写一个脚本,生成10个随机数放到一个数组中,再将该数组中的元素从小大到排序进行输出(10分)
答案写这里:
#!/bin/bash
# 创建一个空数组来存储随机数
random_numbers=()
# 循环10次来生成随机数
for i in {1..10}; do
# 生成一个随机数并添加到数组中
random_numbers+=($((RANDOM % 100 + 1)))
done
# 输出原始的随机数数组
echo "Original array: ${random_numbers[@]}"
# 将数组中的数字排序
sorted_numbers=($(printf '%s\n' "${random_numbers[@]}" | sort -n))
# 输出排序后的数组
echo "Sorted array: ${sorted_numbers[@]}"