1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
用u盘装系统.md 5.16 KB
一键复制 编辑 原始数据 按行查看 历史

用U盘安装系统

前言

现在已经没有人有光驱了,大多数系统都是通过u盘来安装,一般而言,在linux中刻录u盘比windows下面要方便,因为linux的设备也是文件,可以读写,用户的权限可以很大。而windows大多数都要依赖专门的刻录软件。但是安装windows系统除外,linux会更加麻烦,因为windows的iso是真正UDF格式的光盘镜像,这种格式是光盘特有的,如果直接把它刻录到U盘,windows的安装程序将会出错。

现代的uefi本质上是通过uefi支持的文件系统(fat)来读取特定的引导器(.efi格式),因此理论上是可以对U盘预先进行分区和格式化,然后把相应的文件系统复制进去。问题是,谁提供一个引导器去引导每个系统独有的引导器?

grub 可以做到,rufus也有类似的功能。但是他们要么不可定制,要么就是定制很复杂。要想在一个u盘,包含多个系统,进行所谓的多重引导,如果没有借助相关的工具,用户是很难实现的。

最简单的方法,是用rufus,每次安装就刻录一次新的系统镜像,只是rufus是一个windows程序,linux用户无法使用。本人尝试过woeusb、yumi、unetbootin,在安装windows server 2019都掉坑里面了,只有rufus可以正常安装。问题出在大多数刻录软件都是基于fat32文件系统,不支持4gb单文件,而winserver2019恰好就超过这个限制。

虽然不理解为何windows还是一如既往的推出光盘映像,而不是u盘映像,但问题总要面对的。

rufus

这个工具很强大,而且免费,唯一的缺点就是只是支持windows。

自定义U盘格式

通过研究rufus制作好的u盘,发现它是在u盘中分了两个区,一个是引导分区,里面内容是efi文件夹,功能是加载ntfs的文件系统支持。另一个是真正的映像内容,文件系统是ntfs。

猜测原理是先从引导分区启动,借助rufus的引导器,装载ntfs文件系统驱动,让uefi识别ntfs格式的分区,然后引导实际的windows映像内容,即U盘的ntfs分区。因为是ntfs分区,所以就没有4GB单文件大小的限制。

那么,能不能借用这个引导器,引导我们特定的系统印象呢?也就是我们只要将其他系统的映像内容,替换掉u盘ntfs分区的内容即可?

debian 10 测试

  1. 删除ntfs分区的文件
  2. 下载debian-live-10.0.0-amd64-gnome.iso, 解压文件到u盘ntfs分区
  3. 重启测试

结果: 可以引导,但是安装失败。估计是linux并不支持ntfs安装。因此调整方案,将linux和windows分开:

分区 格式 作用
sda1 ntfs windows安装盘
sda2 fat16 win启动盘
sda3 ext4 linux安装盘
sda4 fat32 linux启动盘

然后在主板动选择用uefi启动分区2,即安装分区1的windows,选择分区4,即安装分区3中的linux。

经过不断的试错,总结出来:

  1. win方案是可行的,但是sda1必须使用和映像同样的标签
    1. file cn_windows_server_2019_updated_march_2019_x64_dvd_c1ffb46c.iso 会输出:“cn_windows_server_2019_updated_march_2019_x64_dvd_c1ffb46c.iso: ISO 9660 CD-ROM filesystem data 'SSS_X64FRE_ZH-CN_DV9' (bootable)” ,其中“SSS_X64FRE_ZH-CN_DV9”必须是sda1的名字。估计是windows安装程序依赖这个来定位分区的位置。
  2. linux方案,以测试的debian iso为例,它只会判断分区是否iso9660格式或者是vfat格式,然后再判断内容是不是debian映像。因此ext4分区是不允许的,必须改为以上两种。

技术总结

  1. sudo losetup -fP xxx.iso : 这个命令会根据映像的分区来分别设置loop设备,loop设备可以进一步mount到某个目录。
  2. sudo mount /dev/loop0 目录 : 将设备挂载到某个目录,进而读写文件
  3. lsblk -o name,size,fstype,type,mountpoing : 查看分区情况,不过有时候响应速度没那么及时,多试几次。
  4. sudo chmod g+w,o+w 挂载目录 : 当文件系统是ext时,默认普通用户是没有写入权限的,所以要对挂载的目录设置写入权限。
  5. file xxx.iso : 可以简单查看映像类型
  6. fdisk -l xxx.iso : 可以查看映像的分区。同时fdisk这个工具其实可以和磁盘一样,对文件建立分区。
  7. sync : 对u盘读写会有缓冲,比如一秒就写入完毕,实际上只是写入到内存而已,用sync会等待实际写入u盘,保证数据安全。
  8. gparted :一个图形化的分区工具

只要规划好了分区,其他就是复制文件即可,当然你得会打开和挂载映像文件,否则也复制不了里面的内容。

一般而言,一个支持uefi启动的映像,都会有一个efi目录,或者有两个分区,其中一个分区有efi文件夹。这个就是启动内容,复制到启动分区即可。当然windows我们借用了rufus的启动分区,其实也是一个efi目录。

最终分区图:

分区

测试安装win10,和debian 10,成功。

工具:rufus efi文件下载,可支持ntfs格式,支持win10安装。

参考

  1. rufus wiki: https://github.com/pbatard/rufus/wiki/FAQ
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助