通过grub直接启动debian或ubuntu的iso系统镜像,以及以resize2fs为目的而启动Live系统的注意事项

您所在的位置:网站首页 ubuntu安装找不到u盘 通过grub直接启动debian或ubuntu的iso系统镜像,以及以resize2fs为目的而启动Live系统的注意事项

通过grub直接启动debian或ubuntu的iso系统镜像,以及以resize2fs为目的而启动Live系统的注意事项

2023-03-22 15:31| 来源: 网络整理| 查看: 265

为了安装GNU+Linux系统或缩小电脑硬盘里的ext文件系统(命令resize2fs),需要启动系统镜像,但这一般得先将镜像写入u盘等物理存储设备。但是如果手边没有空闲的u盘怎么办?由于grub可以直接设定内核和initrd的路径,所以可以通过grub直接启动GNU+Linux系统镜像。

对于基于ubuntu的GNU+Linux系统镜像,启动iso镜像的grub命令示例如下(参考https://help.ubuntu.com/community/Grub2/ISOBoot):

set iso_path="/home/jack/os/ubuntu.iso" loopback iso_root $iso_path linux (iso_root)/casper/vmlinuz boot=casper iso-scan/filename=$iso_path initrd (iso_root)/casper/initrd.gz boot

解释:(下文中“分区”和“文件系统”概念混用;“根目录”概念也不严谨,因为grub中的“root”并不是一个目录,没有斜杠符号)

grub中的set命令可以理解为环境变量设置,作用类似Unix命令export。为iso镜像路径赋一个名称如iso_path是方便考虑,这使得后续的loopback命令和iso-scan/filename这个kernel parameter后面无需输入完整的iso镜像路径。

loopback就是在grub内挂载iso镜像,后面第一个参数是挂载点(名称可随意设置,类似DOS风格系统中的A盘B盘),第二个参数是iso镜像的路径。在grub内,挂载点(如(iso_path))与物理硬盘分区(如(hd0,gpt2))的作用等价,都可通过直接输入ls看到。

注意,grub的镜像挂载点只在grub内有效,所以当内核启动、grub将控制权交给内核之后,内核不再能使用镜像挂载点内部的文件;可见,只有grub命令如linux和initrd命令后的第一个参数(linux内核与initrd的路径)可以包含镜像挂载点,而kernel parameters(linux命令后面的第2、3……个参数)不能包含镜像挂载点内的文件,否则内核启动时会报错找不到此文件。那默认情况下内核只能找到什么地方的文件呢?grub内的根目录下的文件。可以通过命令“set root=某个硬盘分区”来设置grub的根目录,其中硬盘分区可以是(hd0,gpt2)等,分区文件系统中的文件可以通过“ls (hd0,gpt2)/”来查看;经测试,ext和FAT32文件系统都是内核可识别的。

强调kernel parameters只能包含grub根目录下的文件,有什么意义?如果启动系统镜像的目的是缩小电脑硬盘里的ext分区大小,而resize2fs命令又不支持online resizing,那么就要求启动的系统镜像无需使用目标ext分区。但如果系统镜像存储在目标ext分区中,由于启动了的Live系统始终使用着这个系统镜像(见iso-scan/filename后面的路径;在启动了的Live系统中体现为,lsblk后会发现目标ext分区已被自动挂载,且无法umount),因此目标ext分区也一直被使用,依然online,所以无法缩小目标ext文件系统的大小。可见,为了在Live系统中缩小目标ext分区的大小,必须要求Live系统的镜像存储在其他的分区中(或外部设备如u盘中);而为了使系统镜像成功启动,又必须将系统镜像所在的分区文件系统设为grub的root。举例来说,如果grub的默认root是(hd0,gpt2),那么为了缩小(hd0,gpt2)的大小,只能将Live系统镜像复制到(hd0,gpt3)中,之后在grub内首先set root=(hd0,gpt3),后面的命令同上,但要注意iso_path不能是“(hd0,gpt3)/os/ubuntu.iso”,而只能是“/os/ubuntu.iso”,因为内核当然不认识(hd0,gpt3)这个grub的分区文件系统标识。最终,可以在Live系统中通过resize2fs缩小“(hd0,gpt2)”。

对于debian的安装镜像,由于其与ubuntu安装镜像的启动方式差异,不能使用上面启动ubuntu的grub命令,而应该按照以下步骤:(参考https://www.linuxbabe.com/debian/boot-debian-9-iso-from-hard-drive-grub2)

⑴ 下载debian的iso安装镜像,注意安装镜像的debian系统版本和CPU架构(如11.6.0-amd64)。

⑵ 手动下载debian软件库中的目录“dists/Debian11.6/main/installer-amd64/current/images/hd-media/”下的vmlinuz和initrd.gz文件。“debian软件库”可以是任意的debian软件源,如https://mirror.sjtu.edu.cn/debian/。注意:① “Debian11.6”与“installer-amd64”要与iso安装镜像的版本与CPU架构契合。② hd-vmlinuz和initrd.gz来自hd-media文件夹。③ vmlinuz和initrd.gz文件要与iso安装镜像放在同一目录。

⑶ 之后在grub中将内核与initrd路径简单设置为上面下载的vmlinuz和initrd.gz文件路径即可启动。安装程序会自动搜索同一路径下的iso镜像,从中抽取网卡驱动以联网下载更多软件完成安装。而系统版本的严格匹配正是网卡驱动的正常运行所必须的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3