在远程 Ubuntu 服务器上,我执行了一系列升级/更改以从桌面安装Ubuntu 10.10 特立独行到服务器安装12.04 LTS 精确
一切都很顺利,除了我遇到的一些问题之外,到目前为止,一直没有物理访问。下一个目标是创建一个使用 LVM 作为后端存储的 XEN 服务器。系统上没有 LVM,我在达到 12.04 LTS 后添加了 LVM。我知道如何远程创建它的 XEN 机器,以前做过。但我在尝试启动新配置时遇到问题。
原来安装这个盒子的人没有注意分区;该机器被用作服务器,但安装为桌面(我修复了这个),但给我留下了这种分区方案:
Disk /dev/sda: 500.0 GB, 499999834112 bytes
...
Device Boot Start End Blocks Id System
/dev/sda1 * 1 58558 470361088 83 Linux
/dev/sda2 58558 60789 17916929 5 Extended
/dev/sda5 58558 60789 17916928 82 Linux swap / Solaris
所以我把巨大的 17G 交换分区重新组织成一个新的启动分区(现在是 /dev/sda2)、一个小的交换分区(/dev/sda3)和一个新的根分区(lvs)。我将磁盘使用量降低到大约 3GB,这已经足够小了,我将其复制到我在 LVM 下创建的新根目录。
目前我们有
Device Boot Start End Blocks Id System
/dev/sda1 2048 940724223 470361088 83 Linux
/dev/sda2 * 940724224 941748223 512000 83 Linux
/dev/sda3 941748224 943845375 1048576 82 Linux swap / Solaris
/dev/sda4 943845376 976562175 16358400 8e Linux LVM
/dev/sda1 是旧引导分区我希望机器从 /dev/sda2 启动。现在的区别是我现在想要一个单独的 /boot 和 / 分区。根分区在 LVM 下称为:
# lvscan
ACTIVE '/dev/server20/root' [10.00 GiB] inherit
最终目标是我想将 /dev/sda1 置于 LVM 控制之下,但我必须以不使用它的方式引导系统。从那时起,LVM 就可以工作了。
除了上面的整个文件系统更改之外,我还做了:
创建的逻辑卷:
pvcreate /dev/sda4
vgcreate server20 /dev/sda4
lvcreate -L 10G -n root server20
mkfs.ext4 /dev/server20/root
安装它:
mount /dev/server20/root /mnt/root/
mount /dev/sda2 /mnt/root/boot/
(cd / ; find . -xdev -print0 | rsync -xavz . /mnt/root/)
for i in /dev /run /dev/pts /proc /sys; do sudo mount -B $i /mnt/root$i; done
更新 grub:
chroot /mnt/root
echo "dm-mod" >> /etc/initramfs-tools/modules
echo "dm-mod" >> /etc/modules
grub-mkconfig (verified config file visually)
update-grub (no errors/warnings)
检查了创建的 /boot/grub/grub.cfg 我发现大多数看起来都是正确的,特别是像这样的东西:
insmod lvm
...
set root='(server20-root)'
search --no-floppy --fs-uuid --set=root 0bb92c24-8c02-4fa3-8f75-970076261b2f
...
menuentry 'Ubuntu, with Linux 3.2.0-38-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos2)'
search --no-floppy --fs-uuid --set=root 891b3eaa-fb43-4a42-9789-a91c2a5ffb13
linux /vmlinuz-3.2.0-38-generic root=/dev/mapper/server20-root ro quiet
initrd /initrd.img-3.2.0-38-generic
}
...
然后,检查 blkid 的:
/dev/sda2: UUID="891b3eaa-fb43-4a42-9789-a91c2a5ffb13" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda4: UUID="IyDrfU-TOYT-rFXO-JknG-rwEK-Sm2A-mfKcIe" TYPE="LVM2_member"
/dev/mapper/server20-root: UUID="0bb92c24-8c02-4fa3-8f75-970076261b2f" TYPE="ext4"
/dev/sda1: UUID="888c061a-1d51-4516-aced-4bb21042d2f4" TYPE="ext4"
/dev/sda3: UUID="19efc041-eccd-42c9-94aa-5b6c88ffd5bb" TYPE="swap"
所以,我从中了解到:我的启动分区将是 msdos2 ,即 /dev/sda2 。在搜索行中也引用了 uuid,即使它说的是 root,我将它与其他安装进行了比较,这意味着在 root/boot 分离的情况下作为启动 uuid(正确的假设?)。
我确实认为这可以使用附加磁盘布局重新启动,但事实并非如此。我使用 fdisk 将 /dev/sda1 和 /dev/sda2 可启动标志设置为活动状态。它以与以前相同的方式启动,幸运的是没有出现任何问题。
我更深层次的问题可能是由于对 chroot + update-grub 的误解而引发的。我实际上不确定我需要在 root/boot /dev/sda1 上做什么。我是否必须将 grub.cfg 从 chroot 版本复制到 /boot 子目录?
重新启动后我采取的步骤
switched off bootable flag on /dev/sda1
remounted everything again and performed all steps again plus an additional
grub-install /dev/sda (from the chroot)
这足以忽略 /dev/sda1 吗?我阅读了有关 grub 的所有内容,但我无法获得有关在同一磁盘上有 2 个引导分区的情况下引导过程如何进行的答案。 (还有很多其他情况)。有人可以想象一下使用 chroot 与使用类似东西的 grub 流程吗grub-install --boot-directory=/mnt/boot。这内部是怎么处理的?
请随意为这个问题建议更好的标题,我在这方面很糟糕。
另外,这是 MBR
dd if=/dev/sda of=mbr.bin bs=512 count=1
root@server20:/# file mbr.bin
mbr.bin: x86 boot sector;
partition 1: ID=0x83, starthead 32, startsector 2048, 940722176 sectors;
partition 2: ID=0x83, active, starthead 95, startsector 940724224, 1024000 sectors;
partition 3: ID=0x82, starthead 29, startsector 941748224, 2097152 sectors;
partition 4: ID=0x8e, starthead 167, startsector 943845376, 32716800 sectors, code offset 0x63
答案1
我又尝试了一次重新启动,看来我所做的最后 3 个步骤解决了问题:
using fdisk to switch off bootable flag for /dev/sda1
partprobe so the kernel knows about changes
remounted everything again on top of root at /mnt/root and performed:
grub-install /dev/sda (from the chroot)
update-grub
MBR 转储让我相信这次它起作用了。我已经使用 lvm root 启动了。看来引导分区挂载失败,但系统确实通过了。我必须使用较小的 /dev/sda1 再次更改它并执行相同的过程。