Ubuntu22.04上安装最新的OpenJDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 系统更新
sudo apt update

# 检查可用的OpenJDK版本
sudo apt search openjdk

# Ubuntu上最新的LTS版本
sudo apt install -y openjdk-17-jdk

# 安装完后检查JAVA版本
java -version

# 如果有多个JAVA版本共存可以配置默认选用哪个
sudo update-alternatives --config java

# 配置环境变量,添加如下设置
vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

# 检查环境变量
source /etc/profile
echo $JAVA_HOME

AWS Ubuntu EC2实例 EBS硬盘缩容

现有EC2实例: 60G / Ubuntu24.04 / 实例名为ec2-big

目标: 缩小磁盘到20G

在ec2-big上面直接在线缩小:失败

1
2
3
4
# resize2fs /dev/xvda1 20G
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
resize2fs: On-line shrinking not supported

解决方法

在同一个可用区内,创建一个和现有系统版本接近(最好是完全一样,便于后续引导)的实例ec2-small,磁盘大小:20G。
ec2-small关机,并从控制台分离卷,并挂载到ec2-big,设备号为/dev/sdb。
在ec2-big下执行如下操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看挂载设备/分区号 (AWS默认1为根分区,15为启动分区)
lsblk
# 创建数据转移目录
mkdir /small-boot
mkdir /small-data
mount /dev/sdb15 /small-boot
mount /dev/sdb1 /small-data

# 备份ec2-small的引导文件。
cp /small-data/boot/grub/grub.cfg /tmp/grub.cfg-data

# 删除ec2-small的数据文件,从ec2-big同步所有文件。
rm -rf /small-data/*
rsync -ax / /small-data/

# 恢复引导文件到
cp /tmp/grub.cfg-data /small-data/boot/grub/grub.cfg

# 检查引导文件的UUID和实际分区是否匹配。
blkid | grep -i sdb15
grep PARTUUID /small-data/boot/grub/grub.cfg
grep PARTUUID /small-boot/EFI/ubuntu/grub.cfg

# ec2-big关机,分离容量小的磁盘(sdb),重新挂载回ec2-small,设备号为/dev/sda。启动ec2-small,确认可以启动

Ubuntu zfs文件系统挂载swap报错:swapon: /swapfile: skipping - it appears to have holes.

Ubuntu22.04系统之下,用传统的方式【mkswap ,swapon】时报错:swapon: /swapfile: skipping - it appears to have holes.。
这是因为 ZFS 文件系统默认使用 稀疏(sparse)文件,而 Linux 内核的 swapon 命令不支持稀疏文件。
稀疏文件在磁盘上没有连续的分配,包含“空洞”(holes),而 ZFS 会根据需要动态分配存储。
由于交换文件要求物理磁盘空间必须是连续的,所以无法直接使用稀疏文件作为交换空间。
可以在ubuntu系统上的zpool创建swap,解决此问题。命令如下

1
2
3
4
5
6
7
8
9
10
11
12
# zpool list
明确存储所用的pool,一般是rpool:存储根文件系统和用户数据
# zfs create -V 【swap的大小(单位:G)】G rpool/swap
# mkswap /dev/zvol/rpool/swap
Setting up swapspace version 1, size = 6 GiB (6442450688 bytes)
no label, UUID=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
记录此处返回的UUID,编辑自动加载文件时使用
# swapon /dev/zvol/rpool/swap
# free -h
# vi /etc/fstab
使用刚才得到UUID配置自动加载
UUID=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx none swap sw 0 0

补充

如何删除zfs create创建的数据集

1
2
3
zfs destroy <pool>/<dataset>
例如:
zfs destroy rpool/swap

Python 监视特定文件夹下的文件变化

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 监视特定文件夹下的文件变化
import os
import time

from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer

# 设定对象文件夹和文件名规则
monitoring_directory = 'D:\\tmp'
target_pattern = '*.*'

# 继承PatternMatchingEventHandler
class FileEventHandler(PatternMatchingEventHandler):
def __init__(self, patterns):
super(FileEventHandler, self).__init__(patterns=patterns)

# 文件创建
def on_created(self, event):
file_path = event.src_path
file_name = os.path.basename(file_path)
print(f'新文件 : {file_name}')

# 文件修改
def on_modified(self, event):
file_path = event.src_path
file_name = os.path.basename(file_path)
print(f'文件修改 : {file_name} ')

# 文件删除
def on_deleted(self, event):
file_path = event.src_path
file_name = os.path.basename(file_path)
print(f'文件删除 : {file_name} ')

# 文件移动
def on_moved(self, event):
file_path = event.src_path
file_name = os.path.basename(file_path)
file_path_new = event.dest_path
file_name_new = os.path.basename(file_path_new)

print(f'文件移动 : {file_name} -> {file_name_new} ')

if __name__ == "__main__":
event_handler = FileEventHandler([target_pattern])
observer = Observer()
observer.schedule(event_handler, monitoring_directory, recursive=True)
observer.start()

try:
while True:
time.sleep(0.1)
except KeyboardInterrupt:
observer.stop()
observer.join()

ESXi手动设置固定MAC地址报错:00:50:56:XX:YY:ZZ is not a valid static Ethernet address. It conflicts with VMware reserved MACs for other usage.

迁移完ESXi虚拟机后,想要保留之前的MAC地址,手动编辑虚拟机设置保存时报错:00:50:56:XX:YY:ZZ is not a valid static Ethernet address. It conflicts with VMware reserved MACs for other usage.

VMware官方解释说固定IP许可范围是:00:50:56:00:00:00 – 00:50:56:3F:FF:FF,或者不以VMware OUI(00:50:56)开头的地址。

其实可以通过手动ESXi的SSH连接修改虚拟机配置文件(.vmx)来达到目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
cd /vmfs/volumes/[datastore名]/[虚拟机名]
cp -p [虚拟机名].vmx [虚拟机名].vmx.bak.20241012
vi [虚拟机名].vmx

# 单网卡默认nic为ethernet0,根据需要修改
# 添加如下配置
ethernet0.checkMACAddress = "false"
ethernet0.addressType = "static"
ethernet0.Address = "00:50:56:XX:XX:XX"
# 删除下面的配置
ethernet0.generatedAddress = "00:50:56:XX:YY:ZZ"

# 保存vmx配置,启动虚拟机即可确认

Ubuntu(>=22.04)修改默认的dash为bash,避免某些脚本出现unexpected operator错误

Ubuntu 22.04之后将dash作为了默认脚本。Dash 旨在遵循 POSIX 标准,因此它不包含许多 Bash 特有的扩展和功能,这使得许多 Bashisms(Bash 特有的语法和功能)是不支持的。

某些旧脚本执行会报错【unexpected operator】,在不方便修改脚本的情况下,可以考虑把Ubuntu的默认dash修改为bash。

1
2
3
4
5
6
7
# 方法1: 安装有 dialog 软件包,即有交互窗口的情况下
sudo dpkg-reconfigure dash
选择No回车

# 方法2: 没有软件窗口交互情况下,新建到bash的链接
sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh
  • 测试平台: Ubuntu 24.04