打包当前Ubuntu镜像 制作Ubuntu togo系统

embedded/2025/3/16 6:10:22/

我的系统的基本情况说明:
我原来的系统的具体型号如下:

uname -r
Linux Engine 5.15.0-134-generic #145~20.04.1-Ubuntu SMP 
Mon Feb 17 13:27:16 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

我原来的硬盘以及分区策略如下:
可以看到我的分区策略大致就是有两张固态,然后EFI/home单独挂载在了一块盘里,/swap挂载在了另外一块盘里

df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             31G     0   31G   0% /dev
tmpfs           6.2G  2.9M  6.2G   1% /run
/dev/nvme1n1p3  1.8T  922G  812G  54% /
tmpfs            31G  119M   31G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs            31G     0   31G   0% /sys/fs/cgroup
/dev/loop0      128K  128K     0 100% /snap/bare/5
/dev/loop2      347M  347M     0 100% /snap/gnome-3-38-2004/119
···
/dev/nvme0n1p2  1.9T  642G  1.2T  37% /home
/dev/nvme0n1p1   96M  6.1M   90M   7% /boot/efi
tmpfs           6.2G  176K  6.2G   1% /run/user/1000

我现在希望的是可以把系统中的所有内容(除了数据集这种占用资源特别多的)都备份到一个单独的外接硬盘盒中,制作一个Ubuntu To Go的系统,在任何的电脑上都可以通过更改启动方式的方法启动我的系统。

以下是制作 Ubuntu To Go 系统的分步指南:


步骤 1:准备工作

  1. 备份数据
    操作前请备份重要数据,避免意外丢失。

  2. 准备外置硬盘

    • 我使用的是SSK10Gbps硬盘盒致钛1TB Ti600 Gen4 7000MB/s的固态硬盘
    • 硬盘盒的速度换算一下是1250MB/s,其实是达不到硬盘的上限的
    • 但是我的拯救者笔记本具有的接口是USB3.1的A口(5Gbps)和USB3.2的C口(10Gbps),所以我之前觉得短板可能也不在硬盘盒这里就没有买新的
    • 确保外置硬盘已插入电脑并识别(如 /dev/sdX,请替换为自己的设备路径)。
  3. 安装必要工具

    sudo apt update && sudo apt install rsync grub2-efi parted
    

    这里这个grub2-efi我显示unable to locate,不过没事,不影响接下来的操作


步骤 2:分区与格式化外置硬盘

  1. 使用 parted 分区

    sudo parted /dev/sdX
    
    • 输入 mklabel gpt 创建 GPT 分区表。
    • 创建 EFI 分区:
      mkpart ESP fat32 1MiB 512MiB
      set 1 esp on
      
    • 创建根分区:
      mkpart primary ext4 512MiB 100%
      
    • 退出:quit
    • 这里要注意没有swap分区,这个在我下一次优化的时候会补充,但是暂时是不影响使用的。
  2. 格式化分区

    sudo mkfs.fat -F32 /dev/sdX1  # 格式化 EFI 分区
    sudo mkfs.ext4 /dev/sdX2      # 格式化根分区
    

步骤 3:复制系统文件

  1. 挂载分区

    sudo mkdir /mnt/usb
    sudo mount /dev/sdX2 /mnt/usb        # 挂载根分区
    sudo mkdir -p /mnt/usb/boot/efi
    sudo mount /dev/sdX1 /mnt/usb/boot/efi  # 挂载 EFI 分区
    
  2. 使用 rsync 克隆系统

    sudo rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/usb/
    

这里因为我的数据量比较大,所以clone同步的时间也很长,我clone了800G+的数据过去估计花了5-6个小时,这里我们可以同时看一下复制的进度watch -n 1 df -h,我们可以看到挂载的/dev/sdX1中使用的内容资源在逐渐增多,等到大致和挂载点\下的体积大体上相同就可以了。


步骤 4:配置启动引导(GRUB)

  1. Chroot 到外置硬盘系统

    sudo mount --bind /dev /mnt/usb/dev
    sudo mount --bind /proc /mnt/usb/proc
    sudo mount --bind /sys /mnt/usb/sys
    sudo chroot /mnt/usb
    
  2. 更新文件系统 UUID

    • 查看外置硬盘根分区的 UUID:
      blkid /dev/sdX2
      
    • 编辑 /etc/fstab
      nano /etc/fstab
      
      替换原有根分区和 EFI 分区的 UUID 为外置硬盘的实际 UUID。
  3. 安装 GRUB 到外置硬盘

    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck
    update-grub
    
  4. 退出 Chroot

    exit
    sudo umount /mnt/usb/{dev,proc,sys,boot/efi}
    sudo umount /mnt/usb
    

步骤 6:测试启动

  1. 在其他电脑上启动
    • 插入外置硬盘,开机时按 F12/Esc/Del 等键选择从外置硬盘启动。
    • 如果启动失败,检查 GRUB 安装步骤和 fstab UUID 是否正确。
    • Tips: 一般启动的选项里有两个,一个是进BIOS(F2),一个是弱化版的启动项选择(F12),一般来说用第二个就可以,对于拯救者电脑,第二个的界面是这样的,这里选择SSK固态硬盘启动
      在这里插入图片描述

我这里的最终效果,在新的U盘启动的机器上,暂时验证效果如下:

  • 所有的gnome插件启动正常
  • 显卡驱动&cuda启动正常
  • App cache正常
  • 一些速度的测试要见我的下一篇文章进行具体的测试~
    在这里插入图片描述

常见问题解决

  • 无法挂载根分区:检查外置硬盘分区是否损坏,重新格式化。
  • 黑屏/卡在启动界面:尝试在 GRUB 启动时按 e 编辑启动参数,添加 nomodeset
  • 无法识别外置硬盘:确保 BIOS/UEFI 中已启用从 USB 启动。

希望可以帮到大家~


http://www.ppmy.cn/embedded/172986.html

相关文章

市场趋势分析与策略优化

市场趋势分析与策略优化 在交易市场中,价格的变动并非随机,而是由多种因素共同驱动。如何分析市场趋势,并制定有效的策略,是交易者在市场中保持竞争力的关键。本文将探讨市场趋势的分类、影响因素及如何利用数据分析优化交易决策。…

Next.js提供api接口

看react官网在推Next.js,所以简单学习了解一下 DEMO 使用cna官方脚手架(13版本)初始化项目以后目录如下: 可以看出,初始项目只有一个根路由页面page.tsx,想要增加一个纯粹的api route可以在app/目录下创建api/xxx/route.ts。即可…

函数式编程定义

java.util.function包consumer用accept , supplier用get , predicate用test , function用apply 综合使用 // 串在一起,实现判断42这个字符串是奇数还是偶数 if (isNumber.test(supplier.get())) {// 说明是一个数字consumer.accept(change.apply(supplier.get())…

深度揭秘:蓝耘 Maas 平台如何重塑深度学习格局

目录 前言 深度学习:技术基石与发展脉络 蓝耘 Maas 平台:深度学习的强大助推器 1. 高性能算力支撑 2. 丰富的模型支持 3. 便捷的开发体验 4. 完善的安全保障 代码示例:蓝耘 Maas 平台上的深度学习实践 1. 注册与登录 2. 代码实现 …

Pytorch系列教程:可视化Pytorch模型训练过程

深度学习和理解训练过程中的学习和进步机制对于优化性能、诊断欠拟合或过拟合等问题至关重要。将训练过程可视化的过程为学习的动态提供了有价值的见解,使我们能够做出合理的决策。训练进度必须可视化的两种方法是:使用Matplotlib和Tensor Board。在本文…

深入理解TCP/IP网络模型及Linux网络管理

1. TCP/IP网络模型简介 TCP/IP(传输控制协议/互联网协议)是互联网的基础通信协议集。它分为四层,从上到下依次为: 应用层:处理高层协议,如HTTP、FTP等。传输层:负责端到端的通信,主…

Ubuntu中为curl和Docker配置代理

Ubuntu中为curl和Docker配置代理 在Ubuntu环境下工作时,经常需要使用代理来访问网络资源,尤其在网络受限或需要翻墙访问时。本文介绍如何分别为curl命令和Docker配置代理192.168.100.11:8000。 一、curl命令代理配置 方法1:临时设置代理&a…

二叉树题目

二叉树每层最大值 import java.util.*;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val x; } }public class Solution {public List<Integer> max_num(TreeNode root) {List<Integer> result new ArrayList<>(); // 存储每…