1. 在闪存驱动器上安装 Ubuntu/Lubuntu

1. 在闪存驱动器上安装 Ubuntu/Lubuntu

我正在开发一个Python程序并想创建一个运行我的程序的可启动 USB 记忆棒

要求:

  1. USB 记忆棒应运行 Linux,包括一些标准依赖项(LAN/WLAN 访问、GUI、连接到投影仪
  2. 我应该能够为我的程序安装依赖项(数据库、一些 python 依赖项等)
  3. 我想避免任何手动设置:我需要一个生成 USB 记忆棒的脚本,包括我的程序、任何依赖项和所需的驱动程序(理想情况下,认为泊坞窗

是什么最简单的实现这个目标的方法?


我考虑过创建一个可启动的Ubuntu并手动安装我的程序和任何依赖项。这解决了 1-2,但不是 3。自动定制可启动的 Ubuntu 似乎并不简单......

答案1

这个方法应该有效,而且我认为它相当简单

  • 创建一个执着的活着使用该工具从 Ubuntu iso 文件进行驱动姆库斯布

  • 然后安装您需要的工具并进行调整。

  • 之后,您可以创建该驱动器的映像。

  • 最后从映像克隆到其他 USB 驱动器(至少与原始系统的 USB 驱动器一样大)。您可以将这些克隆的驱动器分发给系统的最终用户。

    还可以让最终用户下载映像的压缩版本并将其解压到自己的 USB 驱动器中。 mkusb 可以直接从使用gzip(更快)和(更好的压缩)压缩的图像来完成此操作xz,但也可以使用其他工具来完成,如有必要,也可以在 Windows 中完成。

答案2

使用来自的帮助阿库本图,我能够想出一个Ubuntu 特定解决方案这对我行得通:

1. 在闪存驱动器上安装 Ubuntu/Lubuntu

这些说明大致遵循这个答案

(准备)

  • 创建实时 USB 或 DVD。
  • 关闭计算机并拔掉电源插头。
  • 从计算机上拔下所有硬盘驱动器。
  • 重新插入计算机。
  • 在 UEFI 设置中禁用安全启动和快速启动(具体步骤因供应商而异)

(运行安装程序)

  • 插入 Live USB 或 Live DVD。
  • 启动计算机,USB/DVD 应该可以启动。
  • 选择安装 Ubuntu。
  • 插入新的目标驱动器来安装 Ubuntu。
  • 按照说明进行操作。
  • 不要安装“第三方软件”,因为它可能无法在其他机器上运行。
  • 在“安装类型”中选择“其他”。
  • 选择“继续”。
  • 选择目标驱动器(在我的例子中为/dev/sdb)
  • 选择“新建分区表”并“继续”。

(EFI分区)

  • 单击“可用空间”和“+”。
  • “大小”:100 MB
  • 选择“主要”
  • "Location": "此空间的开头"
  • “用作”:“EFI系统分区”
  • 选择“确定”

(/ 分割)

  • 单击“可用空间”,然后单击“+”。
  • “大小”:7800 MB(或其他)
  • 选择“主要”
  • "Location": "此空间的开头"
  • “用作”:“Ext4”
  • 挂载点:“/”
  • 选择“确定”

(重要的)

  • 确保“用于引导加载程序安装的设备”指向闪存驱动器的根目录(在我的例子中为/dev/sdb)。

  • 单击“立即安装”和“继续”。

  • 按照说明进行操作。
  • 等待安装完成。

(包起来)

  • 关闭计算机并插入硬盘。

2.保存生成的U盘

接下来,将生成的图像保存到您的机器上。我编写了一个处理此步骤的脚本。

#!/bin/bash
#
# Saves flash drive partitions to disk
#
# Example Usage:
# ./copy.sh /dev/sde ./images

# enable bash strict mode
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
IFS=$'\n\t'

##########
# INPUTS #
##########

# Checking inputs
if [ $# -ne 2 ]; then
  echo "USAGE: ./copy.sh DEVICE OUTPUTDIR"
  echo "Available devices:"
  sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID,MODEL
  exit
fi

# parse inputs
DEVICE=$1
OUTPUTDIR=$2
EFIFILE=$OUTPUTDIR/ubuntu-efi.img
ROOTFILE=$OUTPUTDIR/ubuntu-root.img
PARTITIONFILE=$OUTPUTDIR/partitions.txt

# Display helpful information
echo "Saving device $DEVICE to $OUTPUTDIR:"
sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID,MODEL $DEVICE

# Confirm
read -r -p "Continue? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
    echo "Start copying (this could take a long time)..."
else
    echo "Aborting" >&2
    exit
fi

mkdir -p "$OUTPUTDIR"

########
# SAVE #
########

# record sizes
sudo fdisk -l | grep ${DEVICE} | sed "s#${DEVICE}#/dev/sdX#g" > $PARTITIONFILE

# dd: copy and convert
# if: source disk
# bs: sector size value from fdisk output
# count: last "end" sector from fdisk output incremented by one
# conv=sync,noerror: sync I/O and don't stop in case of errors on the source disk
sudo dd if=${DEVICE}1 conv=sync,noerror of=$EFIFILE
sudo dd if=${DEVICE}2 conv=sync,noerror of=$ROOTFILE

3.安装到新驱动器

最后,将保存的映像安装到新的闪存驱动器。我再次编写了一个处理此步骤的脚本。

#!/bin/bash
#
# Installs Ubuntu/Lubuntu to flash drive
#
# Example Usage:
# ./copy.sh /dev/sde ./images

###########
# HELPERS #
###########

# enable bash strict mode
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
IFS=$'\n\t'

# directory containing this script
BASEDIR="$( dirname "$0")"

# run commands at the end of the script (even on errors)
EXIT=""
function addExit {
    # call the argument before ending the script
    EXIT="$@ ; $EXIT"
    trap "echo 'Final tasks before exit...' ; $EXIT" EXIT HUP TERM INT QUIT
}

##########
# INPUTS #
##########

# Checking inputs
if [ $# -ne 2 ]; then
  echo "USAGE: ./copy.sh DEVICE SOURCEDIR"
  echo "Available devices:"
  sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID,MODEL
  exit
fi

# parse inputs
DEVICE="$1"
SOURCEDIR="$2"
MNT=/mnt

# Display helpful information
echo "Installing to device $DEVICE:"
sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID,MODEL $DEVICE

# Confirm
read -r -p "Continue? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
    echo "Preparing partitions..."
else
    echo "Aborting" >&2
    exit
fi

# record sizes
PARTITIONFILE="$SOURCEDIR/partitions.txt"
EFISTART=$( cat "$PARTITIONFILE" | grep /dev/sdX1 | awk -F" "  '{ print $2 }')
EFIEND=$(   cat "$PARTITIONFILE" | grep /dev/sdX1 | awk -F" "  '{ print $3 }')
ROOTSTART=$(cat "$PARTITIONFILE" | grep /dev/sdX2 | awk -F" "  '{ print $2 }')
ROOTEND=$(  cat "$PARTITIONFILE" | grep /dev/sdX2 | awk -F" "  '{ print $3 }')

#######################
# COPY TO FLASH DRIVE #
#######################

# umount all paritions of this device
echo "Unmounting all partitions of $DEVICE..."
sudo umount $DEVICE?* || true

# create partition table
sudo wipefs --all $DEVICE
sudo parted $DEVICE mklabel gpt

# efi partition
sudo parted $DEVICE mkpart primary fat32 ${EFISTART}s ${EFIEND}s
sudo parted $DEVICE set 1 boot on
sudo parted $DEVICE set 1 esp on

echo "Start copying efi..."
EFIFILE="$SOURCEDIR/ubuntu-efi.img"
sudo dd if="$EFIFILE" of=${DEVICE}1

# root partition
sudo parted $DEVICE mkpart primary ext4 ${ROOTSTART}s ${ROOTEND}s
# sudo parted $DEVICE name 2 UbuntuUSB

echo "Start copying root (this could take a long time)..."
ROOTFILE="$SOURCEDIR/ubuntu-root.img"
sudo dd if="$ROOTFILE" of=${DEVICE}2

##################
# PREPARE CHROOT #
##################
# prepare running command in root directory of new installation

sudo mount ${DEVICE}2 $MNT
addExit "sudo umount $MNT"

sudo mount ${DEVICE}1 $MNT/boot/efi
addExit "sudo umount $MNT/boot/efi"

for i in /dev /dev/pts /proc /sys; do
    sudo mount -B $i ${MNT}$i
    addExit "sudo umount ${MNT}$i"
done
sudo cp /etc/resolv.conf $MNT/etc/
modprobe efivars

########
# GRUB #
########

# update grub
sudo chroot $MNT grub-install -d /usr/lib/grub/x86_64-efi --efi-directory=/boot/efi/ --removable ${DEVICE}

#############
# CUSTOMIZE #
#############

# prepare scripts
sudo cp -r "${BASEDIR}/customize" "$MNT/opt/customize"

# install software
sudo chroot $MNT "/opt/customize/software.sh"

该脚本还使用以下脚本安装其他自定义软件./customize/software.sh

#!/bin/bash

# enable bash strict mode
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
IFS=$'\n\t'

###########
# PREPARE #
###########

# avoid locale issues and in order to import GPG keys
export HOME=/root
export LC_ALL=C

#######
# APT #
#######

apt-get update -y
apt-get clean
apt-get -y autoremove --purge

####################
# INSTALL SOFTWARE #
####################

# -y: auto-confirm
# -qq: quiet installation
apt-get install -y -qq \
    htop \
    gparted \
    build-essential

相关内容