带有持久性
持久性活动驱动器
有一些网站描述
它可以从带有Ubuntu 19.10和相应的Ubuntu家族风味的iso文件中创建一个持久的实时驱动器。
发布于 2019-10-18 11:23:36
发布于 2021-10-29 16:14:47
我编写了一个bash
脚本(一条线),根据@sudodus的答案编辑活动的USB磁盘,将“静音溅”更改为“持久”。
免责声明:它在我的系统上起作用,你可以自己冒险使用。它适用于bash
,可能不适用于其他shell的w/out编辑。
在从USB额外分区启动后,writable
被创建了w/out,我的干预是为了持久化,如果不是,可以使用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
):
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=备注:通过读取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中得到解释(“管道可能产生一个子subshell,其中环境是由值而不是引用继承的”),在字符串从一个块开始并在下一个块中结束的情况下,需要使用两个块。这些光盘包括三个安全检查:原始字符串和替换字符串的长度相同,块大小足够大,设备大小不大于20 be (防止主驱动器意外编辑,需要编辑更大的闪存,代码为$((file_size/1024/1024/1024)) -gt 20)。脚本中有一些冗余,例如FS = ":" ; in awk,由于某些原因,字段分隔符没有像我预期的那样工作,我不得不添加--field-separator ":",在grep --perl-regexp中也需要使用十六进制(例如\xaa值),但是这个编辑没有它们。\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
备注:
通过读取D11
、D12
、D13
、D14
、D15
可以理解脚本参数和语法的含义。为什么管道中所需的D16
/ D17
在C18
中得到解释(“管道可能产生一个子subshell,其中环境是由值而不是引用继承的”),在字符串从一个块开始并在下一个块中结束的情况下,需要使用两个块。
这些光盘包括三个安全检查:原始字符串和替换字符串的长度相同,块大小足够大,设备大小不大于20 be (防止主驱动器意外编辑,需要编辑更大的闪存,代码为D19
)。
脚本中有一些冗余,例如D20
in D21
,由于某些原因,字段分隔符没有像我预期的那样工作,我不得不添加D22
,在D23
D24
中也需要使用十六进制(例如D25
值),但是这个编辑没有它们。
发布于 2019-10-23 07:22:27
进行持久实时驱动的最简单工具
(但不一定是最好的)。
对于不限于Ubuntu中4GB的持久驱动器,mkusb是最容易(也是最好的)使用的。(还有什么)?
为了在Windows 10中使一个不限于4GB的持久驱动器,Rufus似乎是目前最容易使用的工具。
不过,这并不意味着它是最好的工具。
我做了一些简单的实验,比较Rufus和mkusb的最新版本:
首先,我删除了一个4GB的USB,然后在Windows 10中运行Rufus,重新启动,并使用磁盘使用分析器查看了/casper-rw/upper/文件夹。
然后我删除了casper分区,并做了一个新的分区。
我重新启动了驱动器几次,没有做任何更改,也没有保存任何内容,并再次查看了使用DUA重新填充的持久性分区。
我再次擦除驱动器,用mkusb创建了另一个持久USB,重新启动,并再次查看了DUA。
我再次删除了casper分区,并创建了一个新的分区。
我重新启动了驱动器几次,没有做任何更改,并再次查看了使用DUA重新填充的持久性分区。
从所附图表中可以看出,mkusb在使用磁盘空间方面似乎更好,而grub 2比syslinux更直接。
用鲁弗斯制作的Persistent USB
用Rufus分区重新填充的Persistent USB
用mkusb制作的Persistent USB
用mkusb制作的<#>Persistent USB与重新填充的casper分区
Edit:跟踪持久磁盘空间的使用情况。
我查看了Rufus和mkusb的casper-rw分区中磁盘空间的使用情况。
Rufus var文件夹
Rufus的Contents快照文件夹
mkusb var文件夹
mkusb的Contents截取文件夹
Data尚未确认
Edit: Rufus3.9.1624
用最新版本的Rufus运行磁盘使用分析器,结果接近Rufus3.8。它认为mkusb仍然能提供更高空间效率的持久驱动。
用Rufus3.9制作的Persistent USB
<#>Rufus 3.9var文件夹
同样,数据和方法尚未得到证实。
https://askubuntu.com/questions/1181854
复制相似问题