问题介绍

想要尝试下在Linux上烧录系统镜像(iso文件)到U盘中,制作启动盘。

造成原因

个人需求。

解决方案

Linux

直接使用dd烧录即可。

  1. # 1.确定你的U盘的设备号,注意,一般而言,对于你外插的U盘,是/deb/sdb,而且默认有几个分区,即sdb1等
  2. $ sudo fdisk -l
  3. # 2.如果U盘被自动挂载,请使用U盘设备号先umount
  4. $ sudo umount /dev/sdb*
  5. # 3.准备好一个iso文件,使用dd命令将这个iso写入u盘
  6. # if=后面跟要刻录到u盘的iso文件路径
  7. # of=后面是u盘设备号(**不需要带分区号**,即直接使用sdb)
  8. # 写入过程是没有数据显示的,只要输出和输入路径没错,耐心等待即可,根据U盘读写速度以及iso文件大小,一般需要5~10分钟左右
  9. $ sudo dd if=~/ubuntu-16.04-desktop-amd64.iso of=/dev/sdb
  10. # 如果你想查看写入过程,

默认dd是没有写入过程的进度提示的,参考这篇文章(https://www.cnblogs.com/kumata/p/11004443.html),可以使用如下两种方法来增强:

#(1)重新打开一个终端窗口,通过以下命令来查看其下载进度(dd进度会在原窗口显示):
$ watch -n 1 pkill -USR1 -x dd
#(2)直接在dd指令后添加
$ sudo dd if=/home/kumata/ubuntu.18.04.img of=/dev/sdb bs=4M status=progress

因为是使用dd命令直接将将iso文件数据写入U盘,所以U盘不包含一个标准的分区表,从而导致系统无法正常的识别其大小,也无法正常使用,使用它安装系统后,如果不需要U盘安装盘了,可以使用下面的方法来恢复U盘。

另外,如果dd烧录中断,也可以使用如下方法恢复U盘。

#0.操作前请用sudo fdisk -l查看U盘分区号,请谨慎操作,不要误写硬盘分区,本例U盘分区号是/dev/sdb
#1.使用dd命令,将0写入U盘的前512字节(代表主引导记录中的引导代码和分区表)
# count=1,写入一次
# bs=512,写入的大小512(byte)
# if=/dev/zero,从系统0生成器读取0
# of=/dev/sdb,写入到U盘中
$ sudo dd count=1 bs=512 if=/dev/zero of=/dev/sdb
#2.使用fdisk分区(最好先使用p查看一下还有没有分区,如果第一步操作无误,p将查看不到分区,
#如果还保留着原有分区,则删除现有分区,重新创建分区),例如只重新划分了一个分区sdb1
$ sudo fdisk /dev/sdb
#查看现有分区,如果第一步成功,下面将看不到分区
命令(输入 m 获取帮助): p
#创建新分区,一路默认回车
命令(输入 m 获取帮助): n
...
#将分区更改成NTFS类型,以便Win系统也能识别
命令(输入 m 获取帮助): t
Selected partition 1
Hex code (type L to list codes): 7
Changed system type of partition 1 to 7 (HPFS/NTFS/exFAT)
#保存
命令(输入 m 获取帮助): w
#3.重新将U盘拔出插入,如果分区自动挂载,请先卸载,然后对该分区进行格式化,格式化成fat是为了让Windows也能识别(mkfs格式化ntfs非常慢,如果想要格式化成ntfs的,可以用mkfs.ntfs替换)
$ sudo umount /dev/sdb1
$ sudo mkfs.fat /dev/sdb1

dd命令直接将Linux的iso写入U盘就能开机引导的原因是,这些Linux的iso自带了引导文件,所以用dd将Windows的iso写入U盘将不能开机引导。

Windows

关于在linux上烧录Windows镜像的讨论可见: