在已安装的系统上使用 LVM 将 Ubuntu 20.04 服务器从单分区转换为多分区的完整指南

在已安装的系统上使用 LVM 将 Ubuntu 20.04 服务器从单分区转换为多分区的完整指南

标题是我的要求。我读了几个小时,找到了将 /home 移动到分区和将 /tmp 移动到分区的教程。但没有一个教程可以将所有推荐的目录转换为 Ubuntu Server 的分区。一个教程很接近,但忽略了将数据从先前目录复制到新分区的明显必要步骤。

无论如何,经过很多小时,我仍然没有找到一个涵盖我常见情况的教程。

情况:
我在生产服务器和测试服务器(分别为 vps 和 virtualbox)上安装了 Ubuntu Server,并做了一些工作。在阅读服务器强化教程时,我意识到出于资源管理和安全原因,最好将 /boot /home /swapfile /tmp /usr 和 var... /opt? 全部放在单独的分区上。

创建上述分区的正确方法是使用 LVM

但是,没有一个教程讨论/推荐分区大小(按比例,因为显然不同的系统有不同的可用磁盘空间,我的是 80GB / )

此外,有些教程提到了必要的更改/etc/fstab,有些则没有。

nodev,noexec,nosuid我的目标是将 80GB 的单个分区设置转换为多个分区,然后使用以下方法保护分区免受常见攻击和漏洞利用:/etc/fstab

我可以花几天时间在 virtualbox 中测试和失败不同的配置...或者一些英俊和/或美丽的“Ubuntu 服务器分区大师“可以发布一个易于遵循的(中级用户目标受众)权威指南正如我上面所描述的,并成为互联网名人,因为许多在 vps 上托管自己的项目的用户将永远爱你和崇拜你。:-)

更新
我最初没有发布主服务器强化指南,因为我不想让这篇文章成为对这个人非常详尽的工作的“辩论”。然而,事后看来,我认为这对那些想要回答这篇文章的人来说是有帮助的,让他们看到我试图实现的实际安全优势。

https://linoxide.com/ultimate-guide-secure-ubuntu/

答案1

我认为通常将内容分成不同的文件系统不会帮助/提高安全性。如果有人在系统运行时闯入系统,无论如何一切都会挂载,将所有内容放在一个文件系统中没有任何逻辑上的区别。你学习的材料给出了哪些理由?

话虽如此,帮助提高性能(这些挂载点下有不同的文件系统或不同的硬件)并缩短灾难恢复所需的时间(例如,如果只有保存 /var 的 SSD 冒烟,则只需恢复该备份,其余部分保持运行)。

您询问的是建议的分区大小:

  • 15-20 GB就/足够了。我从来不需要更多空间来运行服务器(运行 Web 服务器 + 邮件服务器)。
  • swap我通常会将其放在与 RAM 大小相同的卷/分区上 - 只是为了使挂起到磁盘可以工作。人们过去推荐 2xRAM 大小,但对于当今的 RAM 大小,当您遇到需要大量交换的情况时,您无论如何都会遇到麻烦。您会从大幅减速中注意到这一点,然后您应该快速增加可用 RAM。
  • /boot只需要 500 MB,这为 8 个以上的内核+initrd 版本提供了空间。确保apt autoremove经常运行,以便在内核升级后保持精简。
  • 我会保留/usr/opt作为目录/,只是看不到将它们移动到自己的文件系统有什么好处。
  • 正如所述本强化指南,为 创建一个单独的卷/tmp确实很有意义,因为它允许您使该全球可写目录更加受限 - 无论是在它可以使用的总可用空间中有多少空间,还是可以对存储在那里的文件执行哪些操作。指南建议在挂载文件系统时使用 nodev、nosuid 和 noexec 选项。指南仅提供“一次性使用”的挂载命令。将其转换为 /etc/fstab 中的一行意味着您将 放入nodev,nosuid,noexec挂载专用 /tmp 卷的行的第 4 列(选项)中/tmp
  • 剩下的就是/home/var- 这通常是“重要”的东西。在我的服务器上/home几乎是空的,但/var包含 public_html、日志、数据库等。因此,我将它/home作为目录保存在 上/,但/var肯定有自己的卷,并且备份最频繁。完成上述操作后,将所有剩余空间留给它。

然后你问如何进行转变:

  • 在正在运行的系统中,一切正常/,连接新磁盘(VDI 文件,...),使用 pvcreate、lvcreate 准备它,然后准备您选择的文件系统(例如 mkfs.ext4)。
  • 然后在 /mnt 下创建临时挂载点,例如 /mnt/newroot、/mnt/newvar 等,并将文件系统挂载在那里。
  • 然后对每个文件系统使用rsync -xaP <source>/ <destination>/。'-x' 选项将阻止 rsync 跨越文件系统边界,即,如果您这样做,rsync -xaP / /mnt/newroot/它也不会复制 /var、/home 甚至所有挂载在 /mnt 下的新文件系统。'-a' 将确保权限等将在未经修改的情况下被接管,而 '-P' 显示进度。有关详细信息,请参阅man rsync

完成之后,编辑/mnt/newroot/etc/fstab并确保在适当的挂载点列出所有文件系统。如果您已经做到了这一点,那么这应该不会太难(因为您选择了所有 /dev/mapper/... 名称、文件系统等)。

您还必须使用 grub-install 和 update-grub 来使新磁盘可启动,但我不太确定具体步骤。使用虚拟机,您可以轻松尝试,如果它无法启动,请再次连接旧磁盘并修复它。

作为参考,这里有一个 shell 会话,它为您提供了有关分区 + LVM + 格式化 + 引用 fstab 主题的一些特定命令。请注意,您很可能必须修改它们,例如,如果您的设备不是 /dev/sda,如果您想要不同的文件系统等 - 这只是一个例子。

# After using fdisk to create one partition that covers the whole device,
# it looks like this:
root@ubuntu:~# fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 18ACB4C9-3F33-7041-8BEB-D819F138A809

Device     Start       End   Sectors  Size Type
/dev/sda1   2048 209715166 209713119  100G Linux LVM

# Create a physical volume for LVM
root@ubuntu:~# pvcreate /dev/sda1   
  Physical volume "/dev/sda1" successfully created.
  
# Create a volume group with the name "vg1" for LVM that will
# hold all our logical volumes
root@ubuntu:~# vgcreate vg1 /dev/sda1
  Volume group "vg1" successfully created

# Create the logical volumes as described above
root@ubuntu:~# lvcreate --name root --size 20G vg1     
  Logical volume "root" created.
root@ubuntu:~# lvcreate --name swap --size 8G vg1
  Logical volume "swap" created.
root@ubuntu:~# lvcreate --name boot --size 500M vg1
  Logical volume "boot" created.
root@ubuntu:~# lvcreate --name tmp --size 5G vg1
  Logical volume "tmp" created.

# Have a look at the logical volumes
root@ubuntu:~# lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  boot vg1 -wi-a----- 500.00m                                                    
  root vg1 -wi-a-----  20.00g                                                    
  swap vg1 -wi-a-----   8.00g                                                    
  tmp  vg1 -wi-a-----   5.00g                                                    

# Have a look at the volume group and see how much space is left
root@ubuntu:~# vgs
  VG  #PV #LV #SN Attr   VSize    VFree  
  vg1   1   4   0 wz--n- <100.00g <66.51g

# Use the remaining space for the last logical volume, var
root@ubuntu:~# lvcreate --name var --size 66.5G vg1
  Logical volume "var" created.

# Have another look at the volumes
root@ubuntu:~# lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  boot vg1 -wi-a----- 500.00m                                                    
  root vg1 -wi-a-----  20.00g                                                    
  swap vg1 -wi-a-----   8.00g                                                    
  tmp  vg1 -wi-a-----   5.00g                                                    
  var  vg1 -wi-a-----  66.50g

# Format all volumes with ext4 file system
for i in /dev/mapper/vg1-*; do mkfs.ext4 $i; done
# Turn vg1-swap into swap space
mkswap /dev/mapper/vg1-swap

# Create fstab entries that look like this
/dev/mapper/vg1-root    /       ext4    defaults                0       1
/dev/mapper/vg1-boot    /boot   ext4    defaults                0       2
/dev/mapper/vg1-var     /var    ext4    defaults                0       2
/dev/mapper/vg1-tmp     /tmp    ext4    nosuid,nodev,noexec     0       0
/dev/mapper/vg1-swap    none    swap    sw                      0       0

相关内容