如何更容易地使用Ubuntu 19.10创建一个持久化的可启动驱动器?

带有持久性分区的持续在线驱动器

有一些网站在描述:

  • 新工具
  • 旧工具的新功能(新版本中)

可以使用Ubuntu 19.10的ISO文件以及相应的Ubuntu家族风味创建一个持久性在线驱动器。

  • 为什么会起作用,以及如何起作用?
  • 与先前的持续在线驱动器方法有何不同?
  • 克隆驱动器的默认设置不是“在线”吗?
3个回答

具有持久性分区的持久化实时驱动器

是的,有一些网站描述了可以使用Ubuntu 19.10的iso文件和相应的Ubuntu家族版本创建具有持久性分区的持久化实时驱动器的新工具和功能。

  • 根据此链接所述,一个新功能或修复的错误('功能请求'或'错误修复') 使得在直接从iso文件的克隆或提取副本启动时可以使用分区进行持久化。

这样可以更轻松地创建具有持久性分区的Ubuntu 19.10的实时驱动器。

在之前的Ubuntu版本中,可以使用FAT32文件系统中的文件进行持久化。其大小限制为4 GiB。可以通过grub在单独的分区(从iso文件的内容中)引导并使用一个分区进行持久化。但这样更加复杂,不适合手动方法。
在19.10和未来的版本中,用于持久化的分区大小仅受驱动器(USB闪存驱动器、SSD、HDD、存储卡)大小的限制。
Debian 10的live iso文件也具有此功能,并可用于创建带有持久化分区的live驱动器。
最新消息:在即将发布的20.04 LTS版Focal Fossa中,默认的持久化分区标签从“casper-rw”更改为“writable”。这在mkusb-plug 2.5.5版本中实现了(该版本与PPA中的mkusb 12.4.3捆绑在一起)。
工具
Ubuntu和Debian
  • mkusb - 适用于所有当前版本的Ubuntu

如果您运行标准的Ubuntu Live,您需要额外的指令来获取宇宙软件源。(Kubuntu,Lubuntu ... Xubuntu会自动激活宇宙软件源。)

    sudo add-apt-repository universe  # only for standard Ubuntu

    sudo add-apt-repository ppa:mkusb/ppa  # and press Enter
    sudo apt-get update
    sudo apt-get install mkusb mkusb-nox usb-pack-efi

enter image description here

  • mkusb-minp - 是一个小型的独立 shell 脚本,可以在 Ubuntu 19.10 中使用这个新功能。它也适用于 Debian 10。

请注意,在尝试旧版本或重新制作(基于 Ubuntu 的发行版)时,请阅读警告信息。

对话开始: enter image description here

对话结束: enter image description here

  • mkusb-plug - 是一组小型的 shell 脚本,可以在 Ubuntu 19.10 中使用这个新功能。它也适用于 Debian 10。我认为您会发现这个新的、非常安全的带有图形用户界面的工具使事情更加容易。

enter image description here

enter image description here

enter image description here

Windows

更新:Rufus - 一款众所周知的工具,可以在Ubuntu 19.10中使用这个新功能。请确保使用当前版本(Rufus 3.9或更高版本),它可以很好地创建所有当前Ubuntu版本的仅限启动驱动器。
它可以创建带有Ubuntu 19.10和未来版本的持久化启动驱动器,请升级到3.9版本(或更高版本),它可以创建一个良好的ext3文件系统并制作出良好的持久化启动驱动器。
请在网站上阅读变更日志警告(弹出窗口),它们可以帮助您避免严重的错误。
编辑:Rufus 3.9已经推出了 :-) 在此输入图片描述 简单的方法,在克隆之前编辑iso文件 这个在Ubuntu 19.10中的新功能也可以从Windows使用。
  • 使用HxD(一个二进制编辑器)来编辑ISO文件,以便将两个外观选项'quiet splash'替换为'persistent'(用12个字符替换12个字符)

  • 使用Win32 Disk Imager来克隆编辑后的ISO文件

  • 第一次启动克隆的驱动器时,Ubuntu系统将自动创建一个带有ext4文件系统的casper-rw分区。简单而稳定!

  • 这些链接中有详细的描述:

    enter image description here

    enter image description here

MacOS和Windows和Linux

  • Unetbootin - 您必须手动创建一个casper-rw分区以实现持久性,并删除或重命名casper-rw文件

请参阅此链接,了解如何向UNetbootin的可启动/持久性USB(Ubuntu 19.10+)添加持久分区

Please notice 'Space used to preserve files across reboots ...'

[![enter image description here][10]][10]
  • 压缩图像文件

您可以根据以下链接直接提取和克隆压缩的图像文件:

Xubuntu Core 20.04 LTS with mkusb 12.4.5 (mkusb-dus 和 mkusb-plug)

这适用于所有操作系统,只要您拥有:

  • 一个可以解压xz文件的工具
  • 一个克隆工具

. enter image description here

手动方法

当您运行Ubuntu时,只需进行几个手动步骤即可创建一个带有持久化分区的持久化活动驱动器。

  • 编辑iso文件,将quiet splash替换为persistent。是的,您可以编辑二进制iso文件,并用另外12个字符替换12个字符,然后将输出刷写到目标设备(通常是USB闪存驱动器)。可以使用sed来完成。

  • 在编辑过的iso文件的刷写副本之后创建一个分区。可以使用fdisk来完成。

  • 在该分区上创建一个ext2文件系统,并将其标记为casper-rw。可以使用mkfs.ext2来完成。

  • 刷新缓冲区。可以使用sync来完成。

这就是mkusb-minp所做的事情,还有很多检查,以确保整个过程安全可靠。换句话说,您将获得帮助以将数据正确写入目标设备,并在可能存在问题时收到警告。

你可以自己动手体验每一步,或者阅读shell脚本mkusb-minp的代码并理解细节。
请注意,在下面的示例中,我使用dus并选择'Cloning'。你也可以使用其他克隆工具,但如果你使用像dd这样简单的工具,请仔细检查你是否在正确的设备上进行克隆,并且该设备上的所有分区都已卸载。
strings lubuntu-19.10-desktop-amd64.iso |grep 'quiet splash'  # check that 'quiet splash' is there to be replaced by 'persistent  ' (12 characters)
sed 's/quiet splash/persistent  /' lubuntu-19.10-desktop-amd64.iso > persistent-lubuntu-19.10-desktop-amd64.iso  # yes, sed works with binary files
ls -l *19.10*  # check that the size is the same
strings persistent-lubuntu-19.10-desktop-amd64.iso |grep 'persistent  '  # check that 'persistent' is there now
dus persistent-lubuntu-19.10-desktop-amd64.iso  # I use mkusb-dus, you can use the Ubuntu Startup Disk Creator or another cloning tool
sudo lsblk -fm  # It is important to check the device letter of the target drive (the USB drive, that you want persistent live
sudo fdisk /dev/sdx  # x is the device letter of the target drive, please double-check that you have the correct letter
n           # new partition
p           # primary
<Return>    # default: 3
<Return>    # default: next free sector
<Return>    # default: last addressable sector
w           # write and quit
sudo lsblk -fm  # check that things look good and verify that partition #3 is the correct partition to be used to store the persistent data
sudo mkfs.ext2 -L casper-rw /dev/sdx3  # put label and file system into the partition of persistence
sudo lsblk -fm  # check that things look good
sync  # flush the buffers and wait for prompt

链接

有一般的手动方法可以轻松地从使用文件进行持久化修改为使用分区进行持久化。请参阅以下链接:

克隆的Ubuntu 19.10+启动盘并非真正的仅限于实时使用

克隆的驱动器默认不是实时使用吗?

嗯,以前是这样的,但在19.10版本中它仍然是实时使用的,但不再是仅限于实时使用。

如果您想要创建一个纯粹的仅限于实时使用的驱动器,在关机和重启后不会保留任何内容,您可以:

  • 使用mkusb-minp选项-nmkusb-plug并选择“无持久化实时驱动器”。

  • 或手动修改内置的引导选项,将“quiet splash”替换为“nopersistent”

链接


2这看起来像是对一个经典问题的权威回答,将会获得大量页面浏览量。因此,我认为添加截图是合适的。 - karel
1@karel,好主意 :-) 请建议添加哪些截图(以及避免淹没在截图中的数量)。 - sudodus
如何演示持久性功能,类似于此答案中的截图?如果问题看起来像是规范材料,这将保护它免受评审人员的反射关闭。 - karel
@karel,好的。应该可以链接到那张图片,并为mkusb添加一张图片,或者可能再添加一两张图片。 - sudodus
链接/内联任何您想要的。 - karel
1@karel,完成了 :-) 请检查并提供反馈 - 如果您认为可以的话,对于 mkusb-minp,也许我应该减少截图或删除带有整个对话框的代码列表。 - sudodus

我写了一个一行的bash脚本来编辑live USB磁盘,将"quiet splash"更改为"persistent",这是基于@sudodus的回答。
免责声明:在我的系统上运行正常,但使用时需自担风险。此脚本适用于bash,可能无法在其他shell上编辑。
从USB启动后,会自动创建一个名为"writable"的额外分区,用于实现持久性覆盖,如果没有自动创建,可以使用fdisk命令。
代码的第一个变体效率不高,因为每次编辑后都要通过grep全局搜索,但可以通过按下ctrl-c来停止搜索。
device_to_edit=/dev/sdb; string_to_edit="quiet splas\x68"; new_string="persistent  "; block_size=512; ed_count=0; to_end=""; if [ ! ${#string_to_edit} -eq ${#new_string} ]; then echo -e "\n Suspect a danger as strings lengths not same"; elif [ $block_size -lt ${#new_string} ]; then echo -e "\n\ Suspect a danger as block size too small for string length"; elif file_size=$(lsblk -b --output PATH,SIZE | grep "$device_to_edit " | sed -E 's/.* ([0-9]{1,})/\1/'); [ $((file_size/1024/1024/1024)) -gt 20 ]; then echo -e "\n Suspect a danger as device size is large"; else while [ -z $to_end ]; do offset_to_edit=$(sudo grep --only-matching --byte-offset --max-count=1 --text --perl-regexp "$string_to_edit" $device_to_edit | awk --field-separator ":" '{ FS = "0" ; print $1 ; exit }'); if [ -z "$offset_to_edit" ]; then echo -e "\n end of file is reached" ; to_end="yes" ; else block_to_edit=$(($offset_to_edit/$block_size)) ; sudo dd if=/$device_to_edit count=2 skip=$block_to_edit bs=$block_size | sed "s/$string_to_edit/$new_string/" | sudo dd conv=notrunc of=$device_to_edit count=2 seek=$block_to_edit bs=$block_size; echo "blocks $block_to_edit and next edited (blocks start with 0)"; ((ed_count++)) ; fi ; done ; echo -e "\n$ed_count editions made"; fi

在代码的第二个变体中,只执行了一次grep,但是grep会遍历整个文件(例如块设备、USB),这可能需要很长时间才能进行任何编辑(在我的系统上,对于8GB的驱动器,大约需要15分钟,我为了满足好奇心添加了日期)。
date; device_to_edit=/dev/sdb; string_to_edit="quiet splash"; new_string="persistent  "; block_size=512; ed_count=0; to_end=""; if [ ! ${#string_to_edit} -eq ${#new_string} ]; then echo -e "\n Suspect a danger as strings lengths not same"; elif [ $block_size -lt ${#new_string} ]; then echo -e "\n\ Suspect a danger as block size too small for string length"; elif file_size=$(lsblk -b --output PATH,SIZE | grep "$device_to_edit " | sed -E 's/.* ([0-9]{1,})/\1/'); [ $((file_size/1024/1024/1024)) -gt 20 ]; then echo -e "\n Suspect a danger as device size is large"; else sudo grep --only-matching --byte-offset --text --perl-regexp "$string_to_edit" $device_to_edit | awk --field-separator ":" '{ FS = ":" ; print $1 }' | { IFS=$'\n' read -d '' -a offsets_to_edit ; for offset in ${offsets_to_edit[@]}; do block_to_edit=$(($offset/$block_size)) ; sudo dd if=/$device_to_edit count=2 skip=$block_to_edit bs=$block_size | sed "s/$string_to_edit/$new_string/" | sudo dd conv=notrunc of=$device_to_edit count=2 seek=$block_to_edit bs=$block_size; echo "blocks $block_to_edit and next edited (blocks start with 0)"; ((ed_count++)); done; echo -e "\n$ed_count editions made"; } ; fi; date

注意事项:
通过阅读“man bash”,“man awk”,“man sed”,“info(coreutils)dd invocation”和“help read”,可以理解脚本参数和语法的含义。为什么在管道中需要使用“(list)” / “{ list; }”在https://stackoverflow.com/questions/2746553/read-values-into-a-shell-variable-from-a-pipe中有解释(“管道可能会生成一个子shell,其中环境是按值继承的,而不是按引用继承的”),需要使用两个块来处理字符串开始于一个块并结束于下一个块的情况。
脚本包括三个安全检查:原始字符串和替换字符串的长度相同,块大小足够大,设备大小不超过20GB(以防止意外编辑主驱动器,如果要编辑更大的闪存存储,代码是$((file_size/1024/1024/1024)) -gt 20)。
脚本中存在一些冗余,例如在awk中的FS = ":";,由于某种原因字段分隔符没有按照我预期的方式工作,所以我不得不添加--field-separator ":"。另外,在grep中需要使用--perl-regexp来使用十六进制值,例如\xaa,但是这个编辑中并没有这些值。

1很高兴看到你用另一组工具成功完成了。我用 sed 一行命令做到了这一点,也许你可以用 awk 来缩短它。参见此链接sed 's/quiet splash/persistent /' eoan-desktop-amd64.iso > persistent-eoan-desktop-amd64.iso # 12 char - sudodus

Rufus是制作带有Ubuntu 19.10的持久化启动盘最简单的工具(但不一定是最好的)。
对于在Ubuntu中制作不受4GB限制的持久化启动盘,mkusb是最简单(也是最好)的选择。还有其他什么选择吗?
对于在Windows 10中制作不受4GB限制的持久化启动盘,目前似乎Rufus是最简单易用的工具。
然而,这并不意味着它是最好的工具。
我进行了一些简单的实验,比较了最新版本的Rufus和mkusb:
首先,我清除了一个4GB的USB,并在Windows 10上运行了Rufus,重新启动后,使用磁盘使用分析器查看了/casper-rw/upper/文件夹。
然后,我删除了casper-rw分区并创建了一个新的分区。
我重新启动了几次,没有进行任何更改或保存任何内容,再次使用DUA查看了重新填充的持久化分区。
然后,我再次清除了驱动器,并使用mkusb创建了另一个持久化USB,重新启动后,再次使用DUA查看了驱动器。
再次删除casper-rw分区并创建一个新的分区。
我重新启动了驱动器几次,没有进行任何更改,并再次使用DUA查看了重新填充的持久分区。
从附图中可以看出,mkusb在磁盘空间利用方面似乎更优秀,而grub 2比syslinux更直观。

Persistent USB made with Rufus

使用Rufus制作的持久化USB

Persistent USB made with Rufus repopulated

使用Rufus制作的持久化USB,带有重新填充的casper-rw分区。

Persistent USB made with mkusb

使用mkusb制作的持久化USB

Persistent USB made with mkusb repopulated

用mkusb和Repopulated casper-rw分区制作的持久USB。
编辑:跟踪持久磁盘空间使用情况。
我查看了Rufus和mkusb最新制作的持久USB的casper-rw分区的磁盘空间使用情况。

Rufus var folder

Rufus变成折叠式的

contents of Rufus snaps folder

Rufus快照文件夹的内容

![mkusb var folder

mkusb var文件夹

![contents of mkusb snaps folder

mkusb快照文件夹的内容

数据尚未确认

编辑:Rufus 3.9.1624

使用最新版本的Rufus运行磁盘使用分析器,结果接近于Rufus 3.8。看起来mkusb仍然可以制作更节省空间的持久化驱动。

在此输入图像描述 Rufus 3.9制作的持久化USB 在此输入图像描述 Rufus 3.9 var文件夹

再次强调,数据和方法尚未确认。


2Rufus的开发人员在这里。您应该意识到,可用空间与格式化过程中保留的索引节点数量直接相关,而这个值更或多或少是任意的。目前,Rufus为保留块设置了5%(ext2fs_r_blocks_count_set()),因此我认为,如果mkusb采用更少的保留块,那么当驱动器填满时,您将缺少索引节点来创建新文件,尽管从长远来看,它可能看起来像mkusb更好地利用了空间...值得一提的是,Rufus使用mke2fs.conf的默认值。 - Akeo
2此外,您需要解释一下您的“ grub 2比syslinux更直观”的评论,因为似乎您认为Rufus强制使用Syslinux,这是一个错误的假设。 Syslinux与GRUB的使用取决于BIOS与UEFI引导,并且正如Ubuntu维护者所设置的那样。 Rufus不会强制使用任何一种引导程序,而是完全尊重维护者根据引导模式选择使用哪种引导程序的决定。 - Akeo
@Akeo:在我谦虚的观点中,你在Rufus方面做得非常出色。所谓出色的工作是指你通过帮助引入Linux,帮助Windows用户摆脱了痛苦的生活。然而,我在这些页面上看到了关于Rufus持久分区空间使用的评论。我正在努力进行一些工作,试图改善这种情况。(斯里兰卡并不是每个人都能负担得起巨大的闪存驱动器)。关于grub/syslinux,也许我对Grub2的偏好是个人喜好。过去我曾遇到过syslinux、UEFI和多个分区的问题。最诚挚的问候。 - C.S.Cameron
1@Akeo。请阅读此链接中列出的结果。很抱歉地说,Rufus持久分区中使用空间的问题随着分区大小的增加而急剧增加。为了明确问题:在通过USB适配器连接的60 GB SSD中,占用了40 GiB的空间,只有12 GiB可供用户使用。经过e2fsck -f修复后,该驱动器几乎与由mkusb制作的新驱动器一样好。因此,文件系统存在真正的问题。请再仔细查看一下。 - sudodus
@Akeo,当然,一旦那个链接的内容不再相关,我会立即编辑它。我希望Rufus能够正常工作,并且我想能够推荐它。 - sudodus
@Akeo:如果方便的话,请考虑添加一个数据分区选项,让Linux和Windows都能读写(从USB启动时/cdrom/只读),另外请考虑增加一个能够将系统引导到RAM的选项。我知道这样会导致启动时间变长,但这个功能确实有其用途。 - C.S.Cameron
@sudodus,请在Rufus问题跟踪器中创建一个问题。如果你认为有问题并希望看到它得到解决,这是正确的方式。这样其他人就可以公开发表意见,而不是在与你想要修复的软件无关且其开发者可能不监控的论坛上发表意见。C.S.Cameron,我们已经讨论过将系统引导到RAM中的问题,我说过对于那些想要这样做的人来说,在Rufus中添加这个功能非常简单。至于你提出的数据分区建议,我没有计划添加,因为我没有收到相关需求。 - Akeo
@Akeo,继续测试:0. 我之前使用的是普通的Windows 10安装;1. 今天我下载并安装了一个“Windows Insider”版本。结果效果更好。没有明显的存储空间损失,但e2fsck -f仍然检测到错误;2. 然后我再次将Rufus下载到我的普通Windows 10上。现在它也在这台电脑和系统中运行良好,且没有明显的存储空间损失(但e2fsck -f仍然检测到错误)。你是否上传了修复bug的Rufus文件,或者可能是我之前的下载失败了?请发布当前Rufus文件的md5sum - sudodus
@Akeo,我会在进行更多的测试之后回来(可能是明天)。我希望能够说我不再看到任何大的驱动空间损失,并且这些大问题可能是由于Windows系统或下载的Rufus文件出了问题。--但是,摆脱e2fsck -f发现的错误将是很好的。它可能会在持久性的实时系统的寿命中引发各种问题。 - sudodus
@Akeo,我会在你的Rufus问题跟踪器上写下来。今天早些时候有一些好的结果,但是当我以一种一致的方式“准备”驱动器时,即使使用Windows Insider版本并重新下载了Rufus,我仍然遇到了一致性的磁盘空间损失。我希望这能帮助你开始调试。如果你愿意,我也可以帮助测试Rufus的新版本。只要告诉我何时何地获取文件即可。 - sudodus
1@sudodus,这个评论链是说明为什么最好在问题跟踪器中解决。发布二进制文件后我不会进行更改,因此,您使用的二进制文件是相同的。它也经过数字签名,因此提供MD5没有意义,因为如果与我在发布日上传的内容有任何不同,则签名验证将失败,Windows会告诉您。是的,我计划研究这个问题,但由于我正在使用官方e2fsprogs代码(与Linux使用的相同),所以这使得情况变得更加复杂,因为我并没有写过这个代码。 - Akeo
@Akeo,请查看github.com/pbatard/rufus/issues/1396 - sudodus
@sudodus,谢谢,我会努力尝试,但可能不会像你希望的那样快速... - Akeo
@C.S.Cameron,你可能想要编辑这个回答,因为Rufus已经调试完毕,版本3.9已经可用了 :-) - sudodus
@Sudodus:我在1号下载了3.9版,但还没来得及测试。今天我计划测试mkusb 2.5.5中可写分区和home-rw分区的使用。 - C.S.Cameron
@Sudodus:你有没有尝试过Rufus 3.9进行测试?我的结果似乎与3.8版本并没有太大差异。我不确定我的方法是否正确。 - C.S.Cameron
@C.S.Cameron: 很高兴你打算测试mkusb-plug 2.5.5。我已经进行了很多测试,但总会有一些我没有测试到的情况,所以你可能会发现一个bug;是的,我已经测试了Rufus 3.9,使用了一个16GB的Sandisk Extreme。ext3文件系统正常,持久性与19.10版本一样按预期工作。(但对于Focal Fossa,它不会创建'writable'标签,所以如果casper关于此问题的bug不修复,当Ubuntu 20.04 LTS发布时,Rufus可能需要升级。) - sudodus
@C.S.Cameron,我已经在几台计算机上进行了测试,bug #1863672 影响其中一半的计算机。可能存在竞态条件,这可能很难修复。'casper' 中当前代码的意图是两者都应该工作('writable' 是默认选择)。 - sudodus
@Sudodus 哎呀,对我来说,在最新的Focal版本中,Rufus 3.9的可写功能正常工作,包括casper-rw、casper-rw + home-rw以及writable和writable + home rw。 - C.S.Cameron