唠唠闲话

p.s. 这几篇博客我其实想找机会整理起来,按一定的逻辑重新梳理。但仔细一想,这上边花时间是要掂量的。

而且,我发现,我们做某个事情的动机,往往只在特定时候会很强烈,借助这个强烈的感觉会事半功倍。而当前也一样,就借着我们强烈的事情来推进吧。


言归正传,本篇我们要讲什么呢?

动机:最近教学楼停电整修,服务器断电导致 boot 损坏,开机异常。尝试了重新安装 grub 以及 boot-repair 等方案,都没有效果。而且这些方案的实践调试通常也要花很多时间。那么,有没有简单粗暴的处理方式呢。

嗯,没错,提前备份。

本篇是作为亡羊补牢的教程。在 grub 无法修复,但系统盘还能读取的情况下。我们在新盘上重装系统,并把一些环境还原回来。本篇就是记录相关的信息的。

系统盘制作和重装系统可以参考 『服务器硬盘维护 | 学习笔记』 这一篇。

本篇主要内容:

  1. rsync 还原主要数据
  2. 重新挂载 home 目录,还原指定用户,并保持 pid
  3. 个人便好的一键设置。

另外,这篇不完全是教程性质,也因为实验室缘故,这里操作更多是特定于实验室的情况。写在博客上,更多是方便个人记录,如果同步到其他平台会再修改。

因此,这里也有一些杂记。

TODO list

查看硬盘信息

查看硬盘信息,当前是在实验室台式上操作,把硬盘拿出来了:

1
2
3
4
5
6
> bash getdevices.sh
| 硬盘设备 | 类型 | 容量 | 使用时间 | 逻辑卷 | 挂载目录 |
|--------------|--------|--------|---------------------|----------------|----------------|
| /dev/sda | 机械 | 931.5G | 27959 h (3.19 年) | None | /cdrom |
| /dev/sdb | 固态 | 3.6T | 31 h (0 年) | None | /target |
| /dev/sdc | 固态 | 3.6T | 24650 h (2.81 年) | None | MOUNTPOINT |

可以看到 /dev/sdb 是一个新盘,也就是我们刚重装的硬盘。/dev/sdc 是旧系统盘。

脚本 getdevices.sh 见附录。

然后是查看 lsblk 看挂载信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 2.7G 1 loop /rofs
loop1 7:1 0 4K 1 loop /snap/bare/5
loop2 7:2 0 74.2M 1 loop /snap/core22/1122
loop3 7:3 0 497M 1 loop /snap/gnome-42-2204/141
loop4 7:4 0 266.6M 1 loop /snap/firefox/3836
loop5 7:5 0 91.7M 1 loop /snap/gtk-common-themes/1535
loop6 7:6 0 452K 1 loop /snap/snapd-desktop-integration/83
loop7 7:7 0 40.4M 1 loop /snap/snapd/20671
loop8 7:8 0 12.3M 1 loop /snap/snap-store/959
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 18.6G 0 part /cdrom
└─sda2 8:2 0 912.9G 0 part
sdb 8:16 0 3.6T 0 disk
├─sdb1 8:17 0 512M 0 part
└─sdb2 8:18 0 3.6T 0 part
sdc 8:32 0 3.6T 0 disk
├─sdc1 8:33 0 1M 0 part
├─sdc2 8:34 0 513M 0 part
└─sdc3 8:35 0 3.6T 0 part

查看 uuid 信息

1
2
3
4
> blkid
/dev/sda1: LABEL="M-MM-uM-VM-AM-:M-j" UUID="1D18-2535" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="6259861b-01"
/dev/sdb1: UUID="9B0E-CBFB" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="8879cdab-e646-4979-8e23-33b855abf63c"
/dev/sdc2: UUID="31F3-1A09" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="8216e8a7-0003-4e3b-83fb-89837d7203fa"

这是刚重装的系统。测试前,先重启一下,确保重装正常,能正常开机,然后再来进行数据拷贝。

chroot 挂载

设置挂载目录:

1
2
3
MOUNT_PATH=/mnt/ubuntu
mkdir -p $MOUNT_PATH
mkdir -p $MOUNT_PATH/backup

挂载系统盘和旧盘:

1
2
sudo mount /dev/sdb2 $MOUNT_PATH
sudo mount /dev/sdc3 $MOUNT_PATH/backup

需要挂载系统文件系统和伪终端,才能正常执行 apt 等命令。

1
2
3
4
5
sudo mount /dev --bind $MOUNT_PATH/dev
sudo mount /dev/pts --bind $MOUNT_PATH/dev/pts
sudo mount /proc --bind $MOUNT_PATH/proc
sudo mount /sys --bind $MOUNT_PATH/sys
sudo mount /run --bind $MOUNT_PATH/run

这里 --bind 将一个目录"绑定"到另一个目录,一边的改动立即反映到另一边。

进入系统:

1
sudo chroot $MOUNT_PATH

在执行所有操作后,我们按顺序需要取消挂载,通常和挂载顺序相反,避免目录层级问题:

1
2
3
4
5
6
7
8
# MOUNT_PATH=/mnt/ubuntu
sudo umount $MOUNT_PATH/run
sudo umount $MOUNT_PATH/sys
sudo umount $MOUNT_PATH/proc
sudo umount $MOUNT_PATH/dev/pts
sudo umount $MOUNT_PATH/dev
sudo umount $MOUNT_PATH/backup
sudo umount $MOUNT_PATH

除了 chroot 挂载,也可以直接把硬盘安装到服务器,在服务器里挂载。

文件备份

备份文件:

1
2
3
4
5
6
7
8
9
10
BACKUP_DIR=$HOME/workspace/backup/map
mkdir -p $BACKUP_DIR

MOUNT_PATH=/mnt/ubuntu
# 备份 EFI 分区
sudo ddrescue -f /dev/sdb1 $BACKUP_DIR/map-efi.img
# 备份 root 文件
# sudo mount /dev/sdb2 $MOUNT_PATH
sudo rsync -a $MOUNT_PATH/boot $BACKUP_DIR/map-boot
# sudo umount $MOUNT_PATH

下次如果 efi 错误,直接还原覆盖 /dev/sdb1 以及 boot 文件夹。

目录还原

根据需要,还原重要的目录:

1
2
3
4
5
6
7
8
rsync -a /backup/srv/ /srv
rsync -a /backup/root/.ssh /root/
# unviersal_rc
# host
# fstab
# /etc/docker/ http
# /etc/systemd/system
# /etc/netplan

初始化系统配置(参考个人博客):

1
2
3
4
5
6
7
8
9
10
11
12
# 查看配置
sudo update-pciids
lspci | grep -i vga

# 安装驱动
sudo ubuntu-drivers autoinstall

# 安装 cuda -- 根据系统版本和架构选择
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo gdebi cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-9

若干 APT 环境依赖

https://www.wzhecnu.cn/2021/08/20/server/02-ubuntu-basicapp/

修改 ssh 配置(手动)。

批量创建用户

主要文件位置:

/etc/passwd - 用户基本信息(用户名、uid、gid、home目录、shell等)
/etc/group - 组信息(组名、gid、组成员等)
/etc/shadow - 用户密码信息(加密密码、密码策略等)

done

个人用户配置

  • shell - aliases
  • conda

其他配置

  1. 安装驱动。