суббота, 21 марта 2026 г.

Как сделать свой "живой" образ DVD live boot в Дебиан ?

 В Debian (и в Ubuntu) есть замечательный пакет Remaster-iso, состоящий из 3 программ: 

  1.  remaster-extract
  2.  remaster-squash-editor
  3.  remaster-compose

Первая разворачивает в директории (необходимо предварительно создать директорию iso-extract) root директорию из iso образа 

Вторая, более многофункциональная, но первое чего делает, является аналогом команд: 

mount --bind /dev ~/iso-extract/dev
mount --bind /run ~/iso-extract/run
mount --bind /proc ~/iso-extract/proc
mount --bind /dev ~/iso-extract/dev 
mount --bind /sys ~/iso-extract/sys
chroot ~/iso-extract/ /bin/bash 

После чего, в гостевой системе можно доустанавливать нужные компоненты либо через команду apt (стандартные приложения) либо редактировать какие-либо файлы в гостевой root-директории: я, например, устанавливаю свой принтер через установку драйверов, и редактируя гостевой файл /lib/udev/rules.d/60-libsane1.rules, плюс для просмотра тв с тюнера T230, в /lib/firmware ставлю два файла: dvb-demod-si2168-b40-01.fw  и dvb-tuner-si2158-a20-01.fw. 
Те файлы, которые должны будут находиться на получившемся live в пользовательской директории, в проекте  (гостевом chroot) должны находиться в /etc/skel - иначе, при загрузке с live будут проблемы с конфликтом прав доступа директорий /home/user - который создаётся при загрузке и той директорией (и которую НЕ НУЖНО СОЗДАВАТЬ) для того, чтобы разместить пользовательские файлы. Для того, чтобы воспроизвести на гостевой системе, ту систему, которая на жёстком диске, я запрашиваю список установленных пакетов основной системы:

dpkg-query -W -f='${Package}\n'

Далее получившийся список, редактирую оставляя только необходимые пакеты, и стирая все зависимости (они всё равно будут установлены в процессе), и у меня получился такой список,  позволяющий получить образ, размером примерно соответствующий размеру DVD болванки:

 7zip
abiword
abiword-common
abiword-plugin-grammar
alsa-utils
audacious
audacious-plugins
audacious-plugins-data
claws-mail
claws-mail-i18n
copyq
copyq-plugins
cups
cups-browsed
cups-client
cups-common
cups-core-drivers
cups-daemon
cups-filters
cups-filters-core-drivers
cups-ipp-utils
cups-ppdc
cups-server-common
curl
dvb-tools
dvd+rw-tools
fbreader
fceux
fdisk
featherpad
featherpad-l10n
feh
ffmpeg
ffmpegthumbnailer
ffmpegthumbs
file
firefox-esr
firefox-esr-l10n-ru
five-or-more
fontconfig
fontconfig-config
fonts-cantarell
fonts-dejavu
fonts-dejavu-core
fonts-dejavu-extra
fonts-dejavu-mono
fonts-droid-fallback
fonts-elusive-icons
fonts-font-awesome
fonts-freefont-ttf
fonts-hack
fonts-lato
fonts-liberation
fonts-liberation-sans-narrow
fonts-mathjax
fonts-noto
fonts-noto-cjk
fonts-noto-cjk-extra
fonts-noto-color-emoji
fonts-noto-core
fonts-noto-extra
fonts-noto-mono
fonts-noto-ui-core
fonts-noto-ui-extra
fonts-noto-unhinted
fonts-opensymbol
fonts-quicksand
fonts-symbola
fonts-urw-base35
fonts-wine
four-in-a-row
fuse-emulator-common
fuse-emulator-sdl
fuse-emulator-utils
fuse3
gaupol
gawk
gcal
gcal-common
gdebi
gdebi-core
gdisk
git
git-man
gnumeric
gnumeric-common
gnumeric-doc
gnupg
gnupg-l10n
gnupg-utils
growisofs
grub-common
grub-efi-amd64
grub-efi-amd64-bin
grub-efi-amd64-signed
grub-efi-amd64-unsigned
grub2-common
gsettings-desktop-schemas
gstreamer1.0-alsa
gstreamer1.0-clutter-3.0
gstreamer1.0-gl
gstreamer1.0-gtk3
gstreamer1.0-gtk4
gstreamer1.0-libav
gstreamer1.0-libcamera
gstreamer1.0-nice
gstreamer1.0-packagekit
gstreamer1.0-pipewire
gstreamer1.0-plugins-bad
gstreamer1.0-plugins-base
gstreamer1.0-plugins-base
gstreamer1.0-plugins-good
gstreamer1.0-plugins-good
gstreamer1.0-plugins-ugly
gstreamer1.0-x
gstreamer1.0-x
gtk2-engines
gtk2-engines-murrine
gtk2-engines-pixbuf
guvcview
gvfs
gvfs-backends
gvfs-common
gvfs-daemons
gvfs-fuse
gvfs-libs
gwenview
gwenview-doc
gzip
hdparm
httrack
i3
i3-wm
i3blocks
i3lock
i3status
im-config
imagemagick
imagemagick-7-common
imagemagick-7.q16
mc
mc-data
mousepad
mplayer
mpv
pavucontrol
pci.ids
pciutils
pcmanfm
pipewire
pipewire-alsa
pipewire-audio
pipewire-bin
pipewire-pulse
print-manager
qbittorrent
qemu-block-extra
qemu-system-common
qemu-system-data
qemu-system-gui
qemu-system-modules-opengl
qemu-system-modules-spice
qemu-system-x86
qemu-utils
qmmp
qpdf
qpdfview
qpdfview-djvu-plugin
qpdfview-pdf-poppler-plugin
qpdfview-ps-plugin
qpdfview-translations
rtorrent
udev
udisks2
unar
vlc
vlc-bin
vlc-data
vlc-l10n
vlc-plugin-access-extra
vlc-plugin-base
vlc-plugin-bittorrent
vlc-plugin-fluidsynth
vlc-plugin-jack
vlc-plugin-notify
vlc-plugin-pipewire
vlc-plugin-qt
vlc-plugin-samba
vlc-plugin-skins2
vlc-plugin-svg
vlc-plugin-video-output
vlc-plugin-video-splitter
vlc-plugin-visualization
vobcopy
vorbis-tools
x11-apps
x11-common
x11-session-utils
x11-utils
x11-xkb-utils
x11-xserver-utils
x11proto-dev
x11vnc
x264
xapp-sn-watcher
xapps-common
xarchiver
xauth
xbitmaps
xbrlapi
xcvt
xdg-dbus-proxy
xdg-desktop-portal
xdg-desktop-portal-gtk
xdg-desktop-portal-kde
xdg-desktop-portal-lxqt
xdg-desktop-portal-xapp
xdg-user-dirs
xdg-user-dirs-gtk
xdg-utils
xfburn
xfconf
xfdesktop4
xfdesktop4-data
xfonts-100dpi
xfonts-75dpi
xfonts-base
xfonts-encodings
xfonts-scalable
xfonts-utils
xfwm4
xfwm4-theme-breeze
xiccd
xinit
xkb-data
xkbset
xml-core
xorg-docs-core
xorg-sgml-doctools
xorriso
xsane
xsane-common
xscreensaver
xscreensaver-data
xscreensaver-gl
xserver-common
xserver-xephyr
xserver-xorg
xserver-xorg-core
xserver-xorg-input-all
xserver-xorg-input-libinput
xserver-xorg-input-wacom
xserver-xorg-legacy
xserver-xorg-video-all
xserver-xorg-video-amdgpu
xserver-xorg-video-ati
xserver-xorg-video-fbdev
xserver-xorg-video-intel
xserver-xorg-video-nouveau
xserver-xorg-video-qxl
xserver-xorg-video-radeon
xserver-xorg-video-vesa
xserver-xorg-video-vmware
xsettingsd
zbar-tools
zim
zim-tools
zip
zlib1g
zlib1g
zlib1g-dev
zstd
blueman
network-manager-applet
nodm
xdg-user-dirs
xdg-user-dirs-gtk 
system-config-printer
system-config-printer-common
system-config-printer-udev
wine32 (dpkg --add-architecture i386)
wine64

Получается образ с предустановленным тайловым менеджером i3, правда без какого-либо меню, но можно вызвать консоль приложений кнопкой Win+D, либо PCMANFM (с собственным меню приложений) кнопкой Win+Enter, VLC запускается кнопкой Win+T, в качестве дисплейного менеджера в моей установке - nodm, с, по умолчанию, принятым логином 'user', но думаю, заменить на что-нибудь другое но то же легковесное....
В будущую пользовательскую директорию в /etc/skel/.config/user-dirs.dirs
заношу строки:  

XDG_DESKTOP_DIR="$HOME/Рабочий стол"
XDG_DOWNLOAD_DIR="$HOME/Загрузки"
XDG_TEMPLATES_DIR="$HOME/Шаблоны"
XDG_PUBLICSHARE_DIR="$HOME/Общедоступные"
XDG_DOCUMENTS_DIR="$HOME/Документы"
XDG_MUSIC_DIR="$HOME/Музыка"
XDG_PICTURES_DIR="$HOME/Изображения"
XDG_VIDEOS_DIR="$HOME/Видео"

 Чтобы xdg-user-dirs запускался автоматические, добавляю в /etc/skel/.config/user-dirs.dirs, строки:

[Desktop Entry]
Type=Application
Name=User folders update
TryExec=xdg-user-dirs-update
Exec=xdg-user-dirs-update
StartupNotify=false
NoDisplay=true

X-GNOME-Autostart-Phase=Initialization
X-KDE-autostart-phase=1

 в etc/xdg/autostart/xdg-user-dirs-kde.desktop, строки:

[Desktop Entry]
Type=Application
Name=User folders update
TryExec=xdg-user-dirs-update
Exec=xdg-user-dirs-update
StartupNotify=false
NoDisplay=true
X-KDE-autostart-phase=1

Для чего, думаю, объяснять не нужно :)

На этом формирование гостевой live системы завершаю, выхожу из chroot, командой exit/ после чего remaster-squashfs-editor предлагает записать изменения в дополнительную файловую систему (основная master пока не затрагивается). ВНИМАНИЕ: ЛЮБОЙ ДРУГОЙ СИМВОЛ КРОМЕ 'Y' ПРИВЕДЁТ К ОТКАЗУ ОТ ЗАПИСИ. После нажатия (какое бы решение ни было) будет 'good by' - разница только с записью или без. На этом этапе можно уже создавать iso образ, командой remaster-compose, просто дополнительная файловая система будет грузиться дополнительно к основной, что будет несколько дольше (но не намного, не критично) но меню remaster-squashfs-editor предлагает возможность объединения файловых систем в одну - последнее 4 меню - "New filesystem'.

Стоит только добавить: за основу беру так называемый - стандартный вариант Debian - в моём случае  debian-live-13.4.0-amd64-standard.iso, который ещё не имеет предустановленного графического слоя, и загружается прямо в текстовый терминал, предлагая доустановить необходимые приложения в соответствии с потребностями, но и он без множества пользовательских программ занимает 1,90Гб, что весьма немало :(

пятница, 9 декабря 2022 г.

Уменьшение размера крупных скринсшотов, с сохранением читаемости текста страницы

 convert '61444x4608.png' -define filter:support=2 -unsharp 0.25x0.08+8.3+0.045 -dither None -posterize 136 -quality 82 -define jpeg:fancy-upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude-chunk=all -interlace none -colorspace sRGB  '600x400.jpg'

четверг, 7 мая 2020 г.

Комментарий к вопросу о возможности восстановления DVDR, показался интересным, этот теоретический пост про технологию изготовления дисков, что привожу его здесь в машинном переводе с английского:

Дальше »

понедельник, 25 февраля 2019 г.

linux: бесконечный своп...

В какой-то момент заметил, что дистрибутив linux (не важно какой именно) слишком легко сваливается в своп: постоянно что-то безостановочно пишет на HDD... Посмотрев количество свободной памяти, обнаружил, что практически вся память отдана в buff/cache и никак не используется, в то же время, когда рабочая память всего 700мб... Как перераспределить память ? На форуме Убунты нашёл такой рецепт:

в /etc/sysctl.conf
vm.swappiness=05
vm.laptop_mode=5
vm.dirty_writeback_centisecs=6000
vm.vfs_cache_pressure=1000
Перечёркнутая строка нужна, это если только есть лаптоп

После чего размер cache сократился до нормальных 500мб, а для пользовательских данных стала доступна остальная память, свопить перестало.

На toster.ru есть ещё опции, но, пока, этого достаточно

UPD: А на хабре нашёл заметку: https://habr.com/ru/post/344836/#comment_10569644

пятница, 21 декабря 2018 г.

Алгебраические операции на bash

На примере программы "Подсчет числа дней между двумя датами"
Дальше »

пятница, 30 ноября 2018 г.

cd проверка статуса лотка привода

К сожалению, чистый bash не имеет возможности проверять открыт-ли лоток привода или нет, но это можно сделать 3 способами:

1. С помощью lshw
lshw -quiet 2>/dev/null | awk '/\*-cd/,/con/' | sed -e 's/^[ \t]*//' | grep configuration | cut -d ' ' -f3
2. С помощью крошечной программы trayopen
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close
#include <linux/cdrom.h>

int main(int argc,char **argv) {
  int cdrom;
  int status=1;

  printf("Usage: trayopen [device]\n");
  printf("Result: Open tray exit code 0, closed tray exit code 1.\n");

  if ((cdrom = open(argv[1],O_RDONLY | O_NONBLOCK)) < 0) {
    printf("Unable to open device %s. Provide a device name (/dev/sr0, /dev/cdrom) as a parameter.\n",argv[1]);
    exit(1);
  }

  if (ioctl(cdrom,CDROM_DRIVE_STATUS) == CDS_TRAY_OPEN) {
    status=0;
  }

  close(cdrom);
  exit(status);
}
Компиляция: gcc trayopen.c -o trayopen .
В найденной в сети программе trayopen не хватало строки
#include <unistd.h> // for close
И при компиляции без этой строки выводило:
implicit declaration of function «close»; did you mean «pclose»? [-Wimplicit-function-declaration]

Использовать программу можно через операции сравнения:
 ./trayopen /dev/sr0 && echo tray is open || echo tray is closed
3. Через программу cdstatus:
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#include <fcntl.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <poll.h>
int main(int argc, char **argv){
        int fd, s; int pt = -1;
        if(argc < 2)
                errx(1, "usage: %s /dev/srX [poll_secs] [verbose]", argv[0]);
        if((fd = open(argv[1], O_RDONLY|O_NONBLOCK)) == -1)
                err(1, "open %s", argv[1]);
        if(argc > 2 && ((pt = strtod(argv[2], 0) * 1000) < 1 || pt > 3600000))
                errx(1, "bad timeout '%s'", argv[2]);
redo:
        switch(s = ioctl(fd, CDROM_DRIVE_STATUS, 0)){
        case -1: err(1, "ioctl(CDROM_DRIVE_STATUS)");
        case CDS_NO_INFO: errx(1, "ioctl(CDROM_DRIVE_STATUS) not implemented");
        }
        if(pt < 0 || argc > 3)
                switch(s){
                case CDS_NO_DISC: printf("no_disc\n"); break;
                case CDS_TRAY_OPEN: printf("tray_open\n"); break;
                case CDS_DRIVE_NOT_READY: printf("drive_not_ready\n"); break;
                case CDS_DISC_OK: printf("disc_ok\n"); break;
                default: printf("status=%d\n", s); break;
                }
        if(pt > 0 && s != CDS_DISC_OK){
                if(poll(0, 0, pt) < 0) err(1, "poll");
                goto redo;
        }
        return s != CDS_DISC_OK;
}
cdstatus выводит результат не в true, а собственно в текстовый вывод: "no_disc", "tray_open", "drive_not_ready", "disc_ok".

 Спасибо авторам идей и тем на форумах:
Detect CD tray status 
problem using ioctl , CDROM_DRIVE_STATUS
Implicit declaration of function ‘close'

пятница, 5 октября 2018 г.

Циклы в sed

Машинный перевод комментария из англоязычного интернета:

sed ':a;N;$!ba;s/\n/ /g' file

прочитает весь файл в цикле, а затем заменит новую строку (строки) пробелом.

Объяснение:

1. Создайте ярлык через :a .
2. Добавьте текущую и следующую строку в пространство шаблонов через N
3. Если мы находимся до последней строки, переходим к созданной метке $!ba ( $! Означает не делать ее на последней строке, так как должна быть одна последняя новая строка).
4. Наконец, подстановка заменяет каждую новую строку пробелом в пространстве шаблонов (это весь файл).

link