저는 Python 프로그램을 개발 중이며내 프로그램을 실행하는 부팅 가능한 USB 스틱.
필요하다:
- USB 스틱은 Linux를 실행해야 하며 일부 표준 종속성(LAN/WLAN 액세스, GUI, 연결)을 포함해야 합니다.영사기)
- 내 프로그램(데이터베이스, 일부 Python 종속성 등)에 대한 종속성을 설치할 수 있어야 합니다.
- 수동 설정을 피하고 싶습니다. 프로그램, 종속성 및 필수 드라이버를 포함하여 USB 스틱을 생성하는 스크립트가 필요합니다(이상적으로는도커)
무엇인가요가장 단순한이 목표를 달성하는 방법은 무엇입니까?
나는부팅 가능한 우분투내 프로그램과 모든 종속성을 수동으로 설치합니다. 이렇게 하면 1-2는 해결되지만 3은 해결되지 않습니다. 부팅 가능한 Ubuntu를 자동으로 사용자 정의하는 것은 쉽지 않은 것 같습니다...
답변1
이 방법은 효과가 있을 것이며 매우 간단하다고 생각합니다.
만들다끈질기게 살아라이 도구를 사용하여 Ubuntu iso 파일에서 드라이브mkusbu.
그런 다음 필요한 도구를 설치하고 조정하십시오.
그런 다음 드라이브 이미지를 생성할 수 있습니다.
마지막으로 이미지에서 다른 USB 드라이브(최소 원본 시스템의 USB 드라이브 크기 이상)로 복제합니다. 이러한 복제된 드라이브를 시스템의 최종 사용자에게 배포할 수 있습니다.
또한 최종 사용자가 이미지의 압축 버전을 다운로드하여 자신의 USB 드라이브에 추출할 수 있습니다. mkusb는
gzip
(더 빠른) 및 (더 나은 압축) 압축을 사용하여 압축된 이미지 에서 직접 이 작업을 수행할 수 있지만xz
필요한 경우 Windows에서 다른 도구를 사용하여 수행할 수도 있습니다.
답변2
다음의 도움을 사용하세요.아쿠벤투, 나는 다음을 생각해낼 수 있었다우분투 특정 솔루션이것은 나에게 효과적입니다.
1. 플래시 드라이브에 Ubuntu/Lubuntu 설치
이 지침은 대략 다음과 같습니다이 답변.
(준비하다)
- 라이브 USB 또는 DVD를 만듭니다.
- 컴퓨터를 끄고 플러그를 뽑습니다.
- 컴퓨터에서 모든 하드 드라이브를 분리합니다.
- 컴퓨터에 다시 연결하십시오.
- UEFI 설정에서 보안 부팅 및 빠른 부팅을 비활성화합니다(정확한 단계는 공급업체에 따라 다름).
(설치 프로그램을 실행하세요)
- Live USB 또는 Live DVD를 삽입합니다.
- 컴퓨터를 시작하면 USB/DVD가 부팅됩니다.
- Ubuntu 설치를 선택합니다.
- Ubuntu를 설치하려면 새 대상 드라이브를 삽입하세요.
- 지시를 따르다.
- 다른 컴퓨터에서는 작동하지 않을 수 있으므로 "타사 소프트웨어"를 설치하지 마십시오.
- "설치 유형"에서 "기타"를 선택합니다.
- 계속을 선택합니다.
- 대상 드라이브를 선택합니다(제 경우에는 /dev/sdb).
- "새 파티션 테이블"과 "계속"을 선택합니다.
(EFI 파티션)
- "사용 가능한 공간" 및 "+"를 클릭합니다.
- "크기": 100MB
- "기본"을 선택하세요
- "위치": "이 공간의 시작"
- "다음으로 사용됨": "EFI 시스템 파티션"
- 확인을 선택하세요
(/ 나뉘다)
- "사용 가능한 공간"을 클릭한 다음 "+"를 클릭합니다.
- "크기": 7800MB(또는 기타)
- "기본"을 선택하세요
- "위치": "이 공간의 시작"
- "다음으로 사용됨": "Ext4"
- 마운트 지점: "/"
- 확인을 선택하세요
(중요한)
"부트로더 설치용 장치"가 플래시 드라이브의 루트(제 경우에는 /dev/sdb)를 가리키는지 확인하세요.
지금 설치하고 계속을 클릭합니다.
- 지시를 따르다.
- 설치가 완료될 때까지 기다리십시오.
(마감)
- 컴퓨터를 끄고 하드 드라이브를 삽입합니다.
2. 생성된 USB 디스크를 저장합니다.
그런 다음 결과 이미지를 컴퓨터에 저장합니다. 이 단계를 처리하는 스크립트를 작성했습니다.
#!/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