Установка Ubuntu 22.04 на флешку как полноценную ОС

Как установить линукс на флешку. Создание загрузочной флешки Ubuntu.

Видеоинструкция

Предварительные настройки

1) Выполните инструкции по установке libvirt

2) Скачайте iso образ с сайта https://cdimage.ubuntu.com/lubuntu/releases/22.04/release/

Создайте диск

cd ~
mkdir Images
cd Images

Создайте диск

dd if=/dev/zero of=disk.img bs=1M count=12288 conv=fsync status=progress

Если в процессе установки выяснилось, что вам нехватает места на диске, то выполните инструкцию по увеличению размера img файла

Создайте виртуальную машину QEMU

Выберите метод установки Локальный ISO или CDROM

Выберите скачанный ISO образ

Установите количество ОЗУ минимум 2Гб и процессоры 2шт

Выберите диск созданный Image файл

Проверьте конфигураию перед запуском VM

Установка ОС

После загрузки, установите ОС через графический установщик и перезагрузитесь

Установка Google Chrome

Добавьте ключ

apt-key adv --keyserver keyserver.ubuntu.com  --recv 4EB27DB2A3B88B8B
apt-key export 4EB27DB2A3B88B8B | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/google-chrome.gpg

Добавьте репозиторий Google Chrome

cat > /etc/apt/sources.list.d/google-chrome.list << EOF
deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main
EOF

Установите браузер

apt-get update
apt-get install -y google-chrome-stable 

Установка Flatpak

Удалите программы установленные через snap

snap remove firefox
snap remove gtk-common-themes
snap remove gnome-3-38-2004

Удалите snap

apt-get purge snapd firefox

Установите flatpak

apt-get install flatpak
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

Установка Firefox

flatpak install flathub org.mozilla.firefox

Установка драйвера Nvidia

 Установите nvidia detect

apt install -y ubuntu-drivers-common

Запустите тест и узнайте какой у вас драйвер

nvidia-detector

Установите последние драйвера nvidia

apt install -y nvidia-driver-525 linux-modules-nvidia-525-generic

Зайдите в /etc/modprobe.d/ проверьте есть ли там файл с содержимым "options nvidia-drm modeset=1". Если нет, то создайте его

echo 'options nvidia-drm modeset=1' > /etc/modprobe.d/nvidia-drm-nomodeset.conf

Обновите initramfs

update-initramfs -u

 Перезагрузитесь и проверьте загружен ли модуль nvidia

lsmod |grep nvidia

Настройка приветствия

Установите локаль:

cat > /etc/profile.d/0.locale.sh << EOF
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
export LANG
export LANGUAGE
EOF

cat > /etc/profile.d/0.editor.sh << EOF
export EDITOR=nano
EOF

echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
echo "ru_RU.UTF-8 UTF-8" >> /etc/locale.gen

Откройте файл

nano /etc/profile.d/0.welcome.sh

Вставьте текст 

if [[ `whoami` = "root" ]]; then
    HILIT="\e[0;91m"
else
    HILIT="\e[0;94m"
fi

HOSTNAME=`hostname`
PS1="\[${HILIT}\][\u@${HOSTNAME} \W]\\$ \[\e[0m\]"
export PS1

Отключите автоматическую вставку скобок в консоли

Добавьте в файл /etc/inputrc строчку

set enable-bracketed-paste off

Установка ПО

Подключите зеркало

export DEBIAN_MIRROR="http://en.archive.ubuntu.com"
export DEBIAN_VERSION="jammy"

cat > /etc/apt/sources.list << EOF
deb $DEBIAN_MIRROR/ubuntu/ $DEBIAN_VERSION main universe restricted multiverse
deb-src $DEBIAN_MIRROR/ubuntu/ $DEBIAN_VERSION main universe restricted multiverse

deb $DEBIAN_MIRROR/ubuntu/ $DEBIAN_VERSION-updates main universe restricted multiverse
deb-src $DEBIAN_MIRROR/ubuntu/ $DEBIAN_VERSION-updates main universe restricted multiverse

deb $DEBIAN_MIRROR/ubuntu/ $DEBIAN_VERSION-security main universe restricted multiverse
deb-src $DEBIAN_MIRROR/ubuntu/ $DEBIAN_VERSION-security main universe restricted multiverse

deb $DEBIAN_MIRROR/ubuntu/ $DEBIAN_VERSION-backports main universe restricted multiverse
deb-src $DEBIAN_MIRROR/ubuntu/ $DEBIAN_VERSION-backports main universe restricted multiverse
EOF

Обновите ПО

apt-get update
aptitude upgrade -y

Установите LXQT

apt-get install -y bash-completion bsdmainutils psmisc uuid-runtime \
  htop mc nano curl pv dnsutils sudo man-db anacron iotop preload \
  git cmake g++ openssh-client wget unrar unar zip unzip p7zip-full \
  rar inxi attr libnotify-bin traceroute bridge-utils mtools xfsprogs \
  network-manager rsync dnsmasq python3-pynput network-manager-gnome \
  iptables-persistent net-tools dnsutils linux-base dbus grub-efi \
  grub-efi-amd64-bin grub-efi-ia32-bin grub-pc-bin openntpd python3-pip \
  libnss-nis libnss-nisplus whois flatpak picom xorg xterm xxkb xkbind \
  gxkb openbox sddm sddm-theme-maldives gnome-disk-utility smbclient \
  compton breeze breeze-gtk-theme kde-cli-tools kde-spectacle obconf-qt \
  scrot software-properties-gtk kcalc konsole dolphin dconf-editor \
  gnome-screensaver fonts-noto-core fonts-dejavu fonts-freefont-ttf \
  xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-kde \
  font-manager kitty kcolorchooser vlc ark 

Удалите лишние программы

apt-get purge apparmor ifupdown resolvconf connman cmst \
  geoclue-2.0 modemmanager xfwm4 xfwm4-theme-breeze obconf \
  xscreensaver gnome-keyring gnome-power-manager gnome-session-bin \
  smplayer nm-tray
apt autoremove

Очистите кэш

apt-get clean all

Установите конфиги

Конфиг Kitty

mkdir ~/.config/kitty
curl -L https://github.com/bayrell-os/lxqt_home/raw/main/src/.config/kitty/kitty.conf > ~/.config/kitty/kitty.conf

Openbox

mkdir ~/.config/openbox
curl -L https://github.com/bayrell-os/lxqt_home/raw/main/src/.config/openbox/rc.xml > ~/.config/openbox/rc.xml

Featherpad

mkdir ~/.config/featherpad
curl -L https://github.com/bayrell-os/lxqt_home/raw/main/src/.config/featherpad/fp.conf > ~/.config/featherpad/fp.conf

Picom

curl -L https://github.com/bayrell-os/lxqt_home/raw/main/src/.config/picom.conf > ~/.config/picom.conf

Bash конфиг

curl -L https://github.com/bayrell-os/lxqt_home/raw/main/src/.bashrc > ~/.bashrc
sudo curl -L https://github.com/bayrell-os/lxqt_home/raw/main/src/.bashrc > /root/.bashrc

Настройки панели

curl -L https://github.com/bayrell-os/lxqt_home/raw/main/src/.config/lxqt/panel.conf > ~/.config/lxqt/panel.conf

Настройки для скриншота

curl -L https://github.com/bayrell-os/lxqt_home/raw/main/src/.config/spectaclerc > ~/.config/spectaclerc

Установите скрипты 

sudo mkdir /opt/desktop_scripts
sudo curl -L https://github.com/bayrell-os/desktop_scripts/raw/main/screenshot.sh > /opt/desktop_scripts/screenshot.sh
sudo curl -L https://github.com/bayrell-os/desktop_scripts/raw/main/brightness.sh > /opt/desktop_scripts/brightness.sh

Добавьте brightness.sh в sudo. Создайте файл 

nano /etc/sudoers.d/brightness

С содержимым:

user ALL = NOPASSWD: /opt/desktop_scripts/brightness.sh

Настройка клавиатуры

Сконфигурируйте раскладку клавиатуры на переключение через Alt+Shift

nano /etc/default/keyboard

# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="us,ru"
XKBVARIANT=""
XKBOPTIONS="grp:alt_shift_toggle,grp_led:scroll"

BACKSPACE="guess"

Настройка NetworkManager

Измените настройки /etc/NetworkManager/NetworkManager.conf

[main]
plugins=ifupdown,keyfile
dns=none

[ifupdown]
managed=false

[device]
wifi.scan-rand-mac-address=no

[keyfile]
unmanaged-devices=*,except:type:ethernet,except:type:wifi,except:type:gsm,except:type:cdma,interface-name:lxc*,interface-name:docker*,interface-name:virtual*,interface-name:veth*

Отключите сервисы systemd и avahi

systemctl disable systemd-networkd.socket
systemctl disable systemd-networkd.service
systemctl disable systemd-resolved.service
systemctl disable avahi-daemon.service
systemctl disable avahi-daemon.socket

Поменяйте файл /etc/resolv.conf

rm -f /etc/resolv.conf
echo "nameserver 127.0.0.1" > /etc/resolv.conf

Создайте файл /etc/dnsmasq.conf

port=53
#listen-address=0.0.0.0
no-dhcp-interface=
bind-interfaces
expand-hosts
local-ttl=1
no-negcache

# Динамические настройки DNS
resolv-file=/run/NetworkManager/resolv.conf

# Настройки DNS по умолчанию
#resolv-file=/etc/resolv.dnsmasq

conf-dir=/etc/dnsmasq.d
cache-size=150
max-cache-ttl=600
min-cache-ttl=60

# Одновременный запрос ко всем DNS серверам
# all-servers

# Запрещаем резолвить домены без точки (нужно для Docker Swarm)
domain-needed

# Для отладки
#log-queries

Раскоментируйте строку в файле /etc/default/dnsmasq

IGNORE_RESOLVCONF=yes

Выключите резолвер из внешней сети интернет. Создайте файл /etc/dnsmasq.d/disable-external-network

bind-interfaces
except-interface=eth*
except-interface=enp*
except-interface=wlan*
except-interface=wlp*

Создайте файл /etc/NetworkManager/dispatcher.d/99-dnsmasq

#!/bin/bash

if [[ "$2" = "up" || "$2" = "down" ]]; then
    kill -9 `cat /var/run/dnsmasq/dnsmasq.pid`
    sleep 2
    systemctl start dnsmasq
fi

Настройка времени

Синхронизация времени

cp /etc/openntpd/ntpd.conf /etc/openntpd/ntpd.orig.conf
echo "servers pool.ntp.org" > /etc/openntpd/ntpd.conf

Установите BFQ

BFQ это диспетчер I/O. Это улучшенная версия, которая позволяет ускорить работу с системой. Подробнее про BFQ

Откройте файл

nano /etc/default/grub

В параметр GRUB_CMDLINE_LINUX_DEFAULT нужно добавить строчку scsi_mod.use_blk_mq=1 а также убрать слово quiet

Пример:

GRUB_CMDLINE_LINUX_DEFAULT="acpi_backlight=none scsi_mod.use_blk_mq=1"

acpi_backlight - это яркость экрана. Возможные значения:

  • video
  • vendor
  • none

Если яркость экрана не будет меняться, то попробуйте изменить эти параметры, или убрать acpi_backlight=none

Добавить BFQ

echo 'bfq' >> /etc/initramfs-tools/modules
echo 'ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq"' >> /etc/udev/rules.d/60-scheduler.rules

Настройка GRUB

Откройте файл с настройками grub

nano /etc/default/grub

Следует установить строки

GRUB_DEFAULT=0
#GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
GRUB_DISABLE_OS_PROBER=true
GRUB_DISTRIBUTOR="Live USB Debian"
#GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="acpi_backlight=none scsi_mod.use_blk_mq=1"
GRUB_CMDLINE_LINUX=""

Обновите grub

update-grub

Настройка iptables

Iptables нужно ставить всегда обязательно. Это фаерволл, который защищает систему он внешних атак. Откройте редактор файла /etc/iptables/rules.v4

nano /etc/iptables/rules.v4

Вставьте следующее содержимое:

*filter
:INPUT ACCEPT [19:913]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [39:3584]
:ALLOW-INPUT - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

# Разрешаем входящие соединения ssh
#-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# Разрешить http
#-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# Перейти к цепочке ALLOW-INPUT
-A INPUT -j ALLOW-INPUT

# Запрещаем остальные входящие соединения
-A INPUT -j REJECT
-A FORWARD -j REJECT

-A ALLOW-INPUT -j RETURN

COMMIT

Скопируйте rules.v4 в rules.v6

cp /etc/iptables/rules.v4 /etc/iptables/rules.v6

Настройка udisks2

udisks2 отвечает за подключение флешек и разных устройств. Рекомендуется добавить параметр sync для более корректной работы с USB устройствами

Откройте файл

nano /etc/udisks2/mount_options.conf

Вставьте содержимое

[defaults]
vfat_defaults=uid=$UID,gid=$GID,shortname=mixed,utf8=1,showexec,flush,sync
ntfs_defaults=uid=$UID,gid=$GID,windows_names,sync,relatime
ntfs:ntfs3_defaults=uid=$UID,gid=$GID,windows_names,sync,relatime

Установка libssl 1.1

cd /src
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb

Проверьте md5 сумму. Она должна быть равна 1cd1b6ba2a30a42580c01e92a6278281

$ md5sum -b *
1cd1b6ba2a30a42580c01e92a6278281 *libssl1.1_1.1.1f-1ubuntu2_amd64.deb

Установите libssl

dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb

Установка gnome screensaver

Выполните команду

cat > /etc/xdg/autostart/lxqt-gnome-screensaver.desktop << EOF
[Desktop Entry]
Comment=Screensaver
Exec=gnome-screensaver
GenericName=GNOME Screensaver
Name=GNOME Screensaver
OnlyShowIn=LXQt;
TryExec=gnome-screensaver
Type=Application
EOF

Установка picom

Выполните команду

cat > /etc/xdg/autostart/lxqt-picom.desktop << EOF
[Desktop Entry]
Comment=A X compositor
Exec=picom --backend glx --vsync
GenericName=X compositor
Name=Picom (X Compositor)
OnlyShowIn=LXQt;
TryExec=compton
Type=Application
EOF

Настройка монитора

Выполните команду

cat > /etc/xdg/autostart/lxqt-monitor.desktop << EOF
[Desktop Entry]
Comment=Monitor Settings
Exec=sh -c \'sleep 60 && xset dpms 200 200 200 && xset -dpms && xset s off && xset dpms 600 600 600\'
GenericName=Monitor Always ON
Name=Monitor Always ON
OnlyShowIn=LXQt;
Type=Application
EOF

В Exec должна быть одна кавычка, а не две

Настройка pulseaudio

Если у вас установлен pipewire то делать это не нужно

Создайте файл

nano /etc/pulse/default.pa.d/pulse-socket.pa

Пропишите строчку

load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/pulse-socket

Отключение автообновлений

Откройте файл /etc/apt/apt.conf.d/20auto-upgrades и установите значение "0" для Unattended-Upgrade

APT::Periodic::Unattended-Upgrade "0";

Отключите автозапуск

systemctl stop unattended-upgrades
systemctl disable unattended-upgrades

Прочие настройки

Установите лимиты на размер journalctl и время ожидания запуска сервисов

echo "SystemMaxUse=128M" >> /etc/systemd/journald.conf
echo "DefaultTimeoutStartSec=60" >> /etc/systemd/system.conf
echo "DefaultTimeoutStopSec=30" >> /etc/systemd/system.conf

Настройка Flatpak

Чтобы курсор во Flatpak приложениях был одинаковым, выполните команды от пользователя:

flatpak override --user --filesystem=$HOME/.icons/:ro
flatpak override --user --filesystem=/usr/share/icons/:ro
flatpak override --user --filesystem=xdg-config/gtk-3.0:ro
flatpak override --user --env GTK_USE_PORTAL=1

Скопируйте kde портал

cp /usr/share/xdg-desktop-portal/portals/kde.portal /usr/share/xdg-desktop-portal/portals/lxqt.portal

Поменяйте в файле /usr/share/xdg-desktop-portal/portals/lxqt.portal последнюю строку

UseIn=LXQt

Создайте файл

nano /etc/xdg/autostart/lxqt-portals.desktop

с содержимым

[Desktop Entry]
Comment=XDG Portals
Exec=/usr/libexec/xdg-desktop-portal --replace
GenericName=XDG Portals
Name=XDG Portals
OnlyShowIn=LXQt;
Type=Application

Перезагрузите виртуальную машину и проверьте работу

Перенос образа img на флешку используя команду dd

После установки Fedora, выключите Qemu.

Подключите флешку. Узнайте на каком устройстве она смонтирована

fdisk -l

Предполагается что флешка смонтирована на устройство /dev/sdb. У вас может быть другое устройство.

Disk /dev/sdb: 29,7 GiB, 31914983424 bytes, 62333952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 783A4E57-3B40-4317-8A8C-BD074FCB0F0E

Скопируйте img образ на флешку.

Обратите внимание на какое устройство вы копируете!

Вместо /dev/sdb у вас может быть другое устройство!

dd bs=1M if=ubuntu.img of=/dev/sdb conv=noerror,fsync status=progress

Выполните синхронизацию

sync -f && fstrim -av

Проверьте изменения

fdisk -l /dev/sdb

Должно вывести примерно следующее

GPT PMBR size mismatch (16777215 != 62333951) will be corrected by w(rite).
Disk /dev/sdb: 29,7 GiB, 31914983424 bytes, 62333952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: EDFCC007-0E71-47D3-B6D7-031EF67843E9

Device      Start      End  Sectors  Size Type
/dev/sdb1    2048   206847   204800  100M EFI System
/dev/sdb2  206848 16777182 16570335  7,9G Linux root (x86-64)

Исправление ошибки GPT PMBR size mismatch

Если у вас при вызове команды fdisk -l Выдает ошибку

GPT PMBR size mismatch (16777215 != 62333951) will be corrected by w(rite).

То нужно исправить флешку через gdisk

gdisk /dev/sdb

Выполните последовательно команды x, e, v, w

x - extra functionality (experts only)
e - relocate backup data structures to the end of the disk
v - verify disk
w - write table to disk and exit

Примерно должно получиться следующее:

$ gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): x

Expert command (? for help): e
Relocating backup data structures to the end of the disk

Expert command (? for help): v

No problems found. 45558750 free sectors (21.7 GiB) available in 2
segments, the largest of which is 45556736 (21.7 GiB) in size.

Expert command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

После выполнения этих команд таблица должна быт исправлена. Проверьте ее командой

fdisk -l /dev/sdb

ошибка исчезла:

Disk /dev/sdb: 29,7 GiB, 31914983424 bytes, 62333952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: EDFCC007-0E71-47D3-B6D7-031EF67843E9

Device      Start      End  Sectors  Size Type
/dev/sdb1    2048   206847   204800  100M EFI System
/dev/sdb2  206848 16777182 16570335  7,9G Linux root (x86-64)

Так как img образ был значительно меньше размера флешки, то нужно увелить размер

cfdisk /dev/sdb

Выбирите пункт resize и установите новый размер. Запишите изменения на диск через пункт [Write]

Проверьте целостность файловой системы и увеличьте ее размер

e2fsck -y -f /dev/sdb2
resize2fs /dev/sdb2

Также можно проверить целостность boot раздела

fsck -fvy /dev/sdb1
fsck -fvy /dev/sdb2

Установка загрузчика GRUB

Оказывается Lubuntu установилась без загрузчика EFI. Нужно его установить.

Смонтируйте флешку

mount /dev/sdb2 /mnt

mkdir -p /mnt/boot/efi
mkdir -p /mnt/{proc,sys,dev,tmp}
mkdir -p /mnt/dev/pts

mount /dev/sdb1 /mnt/boot/efi
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev
mount -t devpts none /mnt/dev/pts

Сделайте chroot

chroot /mnt

 Установите загрузчик

Обратите внимание, на какой диск устанавливаете загрузчик. Обычно это /dev/sdb, но может быть другой диск 

grub-install --target=x86_64-efi --bootloader-id=liveusb \
  --boot-directory=/boot --removable --recheck \
  --no-floppy /dev/sdb

update-initramfs -u
update-grub

Выйдите из chroot

exit

Отмонтируйте папки 

umount /mnt/proc
umount /mnt/sys
umount /mnt/dev/pts
umount /mnt/dev

Отмонтируйте boot папку

umount /mnt/boot/efi

Отмонтируйте флешку 

umount /mnt

Загрузочная флешка готова!

Проверка флешки через QEMU

 Запустите qemu

qemu-system-x86_64 -m 2G -cpu host -enable-kvm \
  -bios /usr/share/ovmf/OVMF.fd \
  -netdev user,id=net0 -device virtio-net-pci,netdev=net0 \
  -drive format=raw,media=disk,file=/dev/sdb

Проверка img файла через QEMU

Запустите qemu с параметрами

qemu-system-x86_64 -m 2G -cpu host -enable-kvm \
  -bios /usr/share/ovmf/OVMF.fd \
  -netdev user,id=net0 -device virtio-net-pci,netdev=net0 \
  -drive format=raw,file=/media/debian/usb.img

Проверка img файла через VirtualBox

IMG Файл можно конвертировать в файл Virtualbox и обратно.

Конвертация в диск для VirtualBox

VBoxManage convertfromraw --format VDI usb.img usb.vdi

Поменяйте владельца файла

chown user:user usb.vdi

Создайте виртуальную машину и подключите этот vdi диск и запустите виртуальную машину

Чтобы сконвертировать обратно диск VirtualBox в img выполните команду

VBoxManage internalcommands converttoraw usb.vdi usb.img