Как я могу создать собственный дистрибутив для запуска простого веб-браузера?


18

Мы собираем несколько легких машин с единственной целью - показать одну веб-страницу на большом экране. Мне нужно, чтобы машина, по сути, загружалась максимально легко и как можно быстрее, и, по сути, чтобы она запускала браузер (WebKit?) В полноэкранном режиме, загружая одну страницу, которая будет динамически контролироваться JavaScript. Я буду использовать двухъядерный процессор Intel D525 со встроенным графическим процессором, поэтому мне не нужно устанавливать какие-либо проприетарные графические драйверы. После того, как я правильно настрою одну из этих машин, я смогу просто установить ddжесткий диск на мой компьютер и затем сбросить его на каждую новую машину.

У меня есть следующие вопросы:

  1. Как я могу создать «дистрибутив», который включает в себя только то, что мне нужно? Полагаю, мне понадобится ядро ​​(;]), X и какой-то веб-браузер, но в действительности не так уж много другого. Могу я взять что-то вроде Ubuntu Server и просто установить X Server и найти способ автоматического входа в систему, запуска X и запуска веб-браузера, без вопросов? Есть ли книга, которую я могу прочитать или статья или что-то?

  2. Что я могу использовать для хорошего, урезанного веб-браузера, который по сути работает с Chrome без хрома? Эти машины не будут принимать пользовательский ввод вообще. Если мне нужно управлять ими, я буду использовать SSH.

Ответы:


12

Многие дистрибутивы имеют некоторые возможности для минимальной установки; по сути, где вы вручную выбираете только те пакеты, которые вы явно хотите установить. Debian обладает такой способностью и будет лучшим выбором в вашей ситуации, чем другой очевидный минимальный конкурент, Arch Linux.

Текущий статус выпуска Arch может обеспечить уровень сложности, который вы хотите избежать. Debian обеспечит простую минимальную базу, которую вы ищете, и обеспечит стабильность. В блоге есть сообщение об использовании Debian в качестве киоска, в котором могут быть полезные советы.

Для браузера, как предполагает beav_35 , Uzbl - хороший выбор. Я бы порекомендовал Vimprobable , браузер WebKit с возможностью написания сценариев, управления с клавиатуры и эффективного управления по SSH.

В качестве оконного менеджера я бы порекомендовал dwm : при менее чем 2000 SLOC он чрезвычайно легок и может быть легко настроен для настройки типа киоска.


dwm отлично подходит для этой цели, и в любом случае я гораздо лучше знаком с системами на основе Debian, поэтому, вероятно, я буду использовать Debian. Как вы думаете, насколько малым я смогу получить ОС? И как я могу собрать дистрибутив Debian?
Нафтули Кей

Когда вы продолжите установку, когда вы достигнете шага выбора пакетов, вместо Ноутбука, Стандартного и т. Д. Выберите «Вручную» и выберите только те пакеты (например, X), которые вам нужны для минимума: начните здесь debian.org/CD / netinst / # businesscard-stable
jasonwryan

5

Прежде всего, вы можете не захотеть изобретать велосипед ... Существует несколько дистрибутивов, ориентированных на киоски. Один из них может сэкономить вам много работы.

Во-вторых, если вы знакомы с Kickstart в Fedora и RHEL (или CentOS или Scientific Linux), вы можете использовать инструменты Fedora, чтобы создать собственный вариант любого из этих дистрибутивов. Документация немного разбросана, но начнем здесь .


Эквивалент Debian / Ubuntu: FAI (полностью автоматическая установка)
Жиль "ТАК - перестать быть злым"

4

Начните с минимального дистрибутива, такого как Arch Linux , затем установите нужные вам пакеты. Для простого веб-браузера попробуйте Uzbl .


узбл это круто +1
Нафтули Кей

3

Это довольно сложный вопрос, и, поскольку ваш проект не совсем понятен, некоторые из этих предложений могут быть неуместны, но подумайте о них, чтобы оценить.

  • Вам может не понадобиться веб-браузер на любом компьютере, который является частью массива дисплея. Если вы пытаетесь показать одну страницу на нескольких экранах, скорее всего, вы захотите использовать какую-то технологию массового отображения. Существует несколько вариантов Xorg, которые специализируются на создании одного большого дисплея из видеоустройств на нескольких машинах.

  • Даже если вы используете отдельные X-серверы на каждой машине, вы можете использовать X-forwarding для отправки отображаемых данных с одного или нескольких других компьютеров, поэтому браузерам все равно не придется работать локально.

  • Вы захотите либо вообще не использовать оконный менеджер и использовать геометрические спецификации для запуска полноэкранного приложения, либо использовать настраиваемый диспетчер окон плитки или структуры (например, awesome) для управления окнами на каждом X-дисплее. Это облегчает сортировку и управление полноэкранными окнами и позволяет создавать сценарии.

  • Что касается браузера, я думаю, что uzblэто, вероятно, четкий выбор.

  • Это может быть хорошим приложением для загрузки по сети. Вы можете настроить сервер с ядром нетбука, доступным через TFTP, и файловой системой, доступной через nfs. Все, что нужно вашим клиентам, - это использовать сетевую карту с поддержкой сетевой загрузки, чтобы связаться с этим сервером, загрузить их ядро ​​и начать работу. Нет жесткого диска! И простота в обслуживании. Все машины могут потенциально загружать один и тот же образ.

  • Ваш «дистрибутив», вероятно, должен состоять из двух вещей. 1) набор пакетов и 2) набор файлов конфигурации. Набор пакетов - это список пакетов, которые необходимо установить. Обычно его можно собрать в текстовом файле, и затем вы можете использовать большинство менеджеров пакетов дистрибутива для установки этого списка пакетов на цель (либо на жесткий диск, либо в каталог, который будет вашей точкой монтирования nfs). Файлы конфигурации, вероятно, должны храниться в gitдругой системе управления исходным кодом и содержать несколько сценариев, а также любые моды конфигурации, которые необходимо выполнить для базовой системы, установленной с набором пакетов. Построение новой системы становится:

    • Смонтировать диск или целевой каталог
    • package_manager --install-distro --package-set=/path/packagelist.txt --target=/path
    • cd /target/path
    • git clone /path/to/repo (или иным образом извлеките ваш код конфигурации в системный корень)
    • Установите загрузчик, если диск, или добавьте PXE config, если netboot
    • загрузки.

Какой дистрибутив вы используете в качестве основы, должен зависеть от того, что вам наиболее удобно. Я бы использовал PLD-Linux для себя, но, вероятно, рекомендую ArchLinux как похожую, но лучше документированную систему для работы с новичком. Нет никаких причин, по которым Debian , Fedora или Gentoo не будут работать для этого.


при сетевой загрузке: это звучит УДИВИТЕЛЬНО и значительно упростит обслуживание. Тем не менее, каждая машина должна загружать разные URL, так как они будут получать информацию, уникальную для машины. Является ли, что выполнимо? Все остальное якобы осталось бы прежним, хотя я мог бы настроить каждую машину на использование разных пользователей / паролей для проверки подлинности HTTP-Basic в качестве небольшого средства безопасности.
Нафтули Кей

на «Вам может не понадобиться веб-браузер на каждом компьютере, который является частью массива отображения»: я думаю, что на самом деле мне это понадобится. Каждая из этих машин будет находиться в разных местах, управляя одним дисплеем по VGA или HDMI, отображая уникальную веб-страницу для этой машины. (хотя мы могли бы обслуживать один URL-адрес, который изменяет содержание пользователя / пароля).
Нафтули Кей

на оконных менеджерах: я бы, вероятно, просто использовал очень легкий, например, dwmили awesome. Как я могу сказать диспетчеру окон запустить приложение без строки заголовка в полноэкранном режиме?
Нафтули Кей

о том, из чего должен состоять дистрибутив: так что все, что мне действительно нужно, это создать git-репо, сохранить список пакетов и файлы конфигурации, а затем каким-то образом создать ISO. Как мне получить самый крошечный дистрибутив Debian и затем оттуда работать? Как мне взять эти файлы конфигурации и сделать записываемый ISO? Я бы использовал apt-getили aptitudeна Debian.
Нафтули Кей

на X-forwarding: в этом нет необходимости, так как я буду управлять одним дисплеем на машину. Вероятно, мне придется найти способ заставить компьютер выдавать обратное SSH-соединение, чтобы мой компьютер мог подключиться к нему, но может быть способ автоматизировать это. Есть ли способ заставить компьютер A открыть TCP-соединение с компьютером B, а затем подключить компьютер B через это соединение к компьютеру A через SSH? В противном случае мне пришлось бы получать динамические DNS-имена для каждого маршрутизатора: не весело / просто.
Нафтули Кей

2

Buildroot 2016.05 + Midori

Buildroot - отличный инструмент для создания минимальных дистрибутивов:

  • Вы даете это .configфайл
  • он загружает и компилирует все необходимое программное обеспечение и зависимости, а также создает изображение

Midori - минималистичный браузер на основе WebKit , а Buildroot имеет встроенный пакет Midori.

.configиспользуемый файл: https://github.com/cirosantilli/buildroot-configs/blob/32d1174e0bf8d00b92323eebe8901af3f8c389d3/2016.05/qemu_x86_64_x11_midori_defconfig

Как создать этот файл конфигурации:

  1. Следуйте: Как установить X11 на мою собственную систему Linux Buildroot? | Unix & Linux Stack Exchange для создания образа с X11.
  2. make menuconfig
    1. Toolchain
      1. C библиотека
        1. глибк (для мидори)
    2. Целевые пакеты
      1. Графические библиотеки и приложения
        1. mesa3d
          1. выбрать все драйверы Gallium и DRI, так как я не понимаю, какой из них нужен (для OpenGL EGL)
          2. OpenGL EGL (для libgtk3)
      2. Библиотеки
        1. Графика 1. libgtk3 (для мидори)

Очистите сборку, потому что мы изменили набор инструментов, и соберите снова:

rm -rf output
make BR2_JLEVEL=$(nproc)

Подожди часов. Тогда обычный:

qemu-system-x86_64 \
    -enable-kvm \
    -M pc \
    -m 512 \
    -kernel output/images/bzImage \
    -drive file=output/images/rootfs.ext2,if=virtio,format=raw \
    -append root=/dev/vda \
    -net nic,model=virtio \
    -net user

И изнутри QEMU:

root
startx

и из графического интерфейса X11 щелкните xtermокно и запустите:

midori

Результат:

введите описание изображения здесь

Размер изображения: 220М! Сравните это с 28M простой системы X11. Как установить X11 в моей собственной системе Linux Buildroot? - Unix & Linux Stack Exchange . Вероятно, из-за зависимостей WebKit + GTK3.

Протестировано на хосте Ubuntu 16.04, QEMU 2.5.0.

NetSurf

Написан на SDL, который поддерживает fbdev: http://www.netsurf-browser.org/about/screenshots/#framebuffer

fbdev - это интерфейс более низкого уровня, предлагаемый модулем ядра Linux, который не проходит через X11 (я думаю, что X11 может дополнительно использовать его в качестве бэкэнда). Вы просто пишете в память, и это отображается на экране.

Чтобы использовать fbdev в Ubuntu, вы должны использовать TTY (например, Ctrl + Alt + F1).

Таким образом, вы, вероятно, можете сойти с изображения, намного меньшего, чем у Мидори.

Buildroot 2016.05 имеет пакет, netsurf-buildsystemкоторый должен предоставить его, но я не тестировал. Если кому-то удастся запустить его, отредактируйте ссылку на файл .config, снимок экрана и размер изображения.


1

Однажды я написал небольшой bash-скрипт, который принимает ISO-образ Arch Linux и генерирует новый ISO-файл с измененным корневым образом, который выполняет полностью автоматическую установку. Это включает в себя создание разделов, а также настройку и настройку системы с помощью Xorg, FVWM и Chromium. Установленная система автоматически войдет в систему и запустит Chromium. Просто поместите новый ISO на флешку и откиньтесь назад. ;-)

Отказ от ответственности: сценарий предоставляется как есть, гарантия не предоставляется. Я не использовал его некоторое время, поэтому может потребоваться настройка здесь или там. Изменить по необходимости.

#!/bin/bash
# Helpful pages:
#
#   * [ArchWiki topic][1] that explains the options of an AIF configuration
#     file.
#
#   * [Status of automated installation][2], a topic in the Arch Linux Forums
#     that contains the original basic install script by *mhertz*.
#
# [1]: https://wiki.archlinux.org/index.php/AIF_Configuration_File
# [2]: https://bbs.archlinux.org/viewtopic.php?id=111925

TMP_DIR=/tmp/arch-install

# Read command line parameters for input and output ISO files.
if [ -z "$1" ]; then
    echo 'No input file specified, aborting.'
    exit 1
elif [ ! -f "$1" ]; then
    echo 'Input file "'$INPUT_ISO'" not found, aborting.'
    exit 1
elif [ -z "$2" ]; then
    echo 'No output file specified, aborting.'
    exit 1
elif [ -f "$2" ]; then
    echo 'Output file "'$OUTPUT_ISO'" already exists, aborting.'
    exit 1
fi

# Determine full paths to input and output ISO files.
INPUT_ISO=$(readlink -f "$1")
OUTPUT_ISO=$(readlink -f "$2")

# Set some variables for convenience.
SOURCE_DIR=$TMP_DIR/source
DEST_DIR=$TMP_DIR/dest
ROOT_DIR=$TMP_DIR/squashfs-root
BOOT_CFG=$DEST_DIR/boot/isolinux/isolinux.cfg

# Extract ISO image and root image.
mkdir -p $SOURCE_DIR
mount -o loop "$INPUT_ISO" $SOURCE_DIR
cp -a $SOURCE_DIR $DEST_DIR
umount $SOURCE_DIR
rmdir $SOURCE_DIR
unsquashfs -d $ROOT_DIR $DEST_DIR/root-image.sqfs
rm $DEST_DIR/root-image.sqfs

# Modify the root image as needed.
cat >> $ROOT_DIR/etc/aif.conf <<EOF
SOURCE=cd
FILE_URL=file:///src/core/pkg
SYNC_URL=http://ftp.tu-chemnitz.de/pub/linux/archlinux/\$repo/os/\$arch
HARDWARECLOCK=UpTC
TIMEZONE=Europe/Vienna
RUNTIME_REPOSITORIES=
RUNTIME_PACKAGES=
TARGET_GROUPS=base
TARGET_PACKAGES_EXCLUDE=
TARGET_PACKAGES='openssh xorg xcursor-vanilla-dmz-aa'

worker_runtime_network () {
    dhcpcd eth0
}

worker_configure_system () {
    prefill_configs
    sed -i '/^HOSTNAME/ s/"myhost"/"arch"/' \$var_TARGET_DIR/etc/rc.conf
    sed -i '/^password/ s/pam_permit\.so/pam_unix.so md5 shadow/' \$var_TARGET_DIR/etc/pam.d/chpasswd
    sed -i '\|Server = http://ftp\.tu-chemnitz\.de/| s/^#//' \$var_TARGET_DIR/etc/pacman.d/mirrorlist
    sed -i '/id:3:initdefault:/ s/^/#/' \$var_TARGET_DIR/etc/inittab
    sed -i '/id:5:initdefault:/ s/^#//' \$var_TARGET_DIR/etc/inittab
    sed -i '\|x:5:respawn:/usr/bin/xdm| s/^/#/' \$var_TARGET_DIR/etc/inittab
    echo "x:5:respawn:/bin/su -l -c '/usr/bin/startx </dev/null >/dev/null 2>&1' myuser" >> \$var_TARGET_DIR/etc/inittab
    sed -i 's/^timeout .*$/timeout 0/' \$var_TARGET_DIR/boot/grub/menu.lst
    cp /etc/rc.local.firstboot \$var_TARGET_DIR/etc/rc.local
}

# Mandatory variables.
GRUB_DEVICE=/dev/sda
PARTITIONS='/dev/sda 20:ext2:+ 512:swap 2500:xfs *:xfs'
BLOCKDATA='/dev/sda1 raw no_label ext2;yes;/boot;target;no_opts;no_label;no_params
/dev/sda2 raw no_label swap;yes;no_mountpoint;target;no_opts;no_label;no_params
/dev/sda3 raw no_label xfs;yes;/;target;no_opts;no_label;no_params
/dev/sda4 raw no_label xfs;yes;/home;target;no_opts;no_label;no_params'
EOF

cat >> $ROOT_DIR/etc/rc.local <<EOF
aif -p automatic -c /etc/aif.conf
reboot
EOF

cat >> $ROOT_DIR/etc/rc.local.firstboot <<EOF
echo root:rootpassword | chpasswd
useradd -m myuser
echo myuser:myuser | chpasswd
cat >> /home/myuser/.xinitrc <<EOT
#!/bin/sh
exec fvwm2
EOT
cat >> /home/myuser/.Xdefaults <<EOT
Xcursor.theme: Vanilla-DMZ-AA
EOT
mkdir -p /home/myuser/.fvwm
cat >> /home/myuser/.fvwm/config <<EOT
DeskTopSize 1x1
DesktopName 0 Main
DestroyFunc StartFunction
AddToFunc StartFunction
 + I Test (Init) Exec exec xsetroot -solid '#303030'
 + I Test (Init) Exec exec chromium 'http://www.stackoverflow.com'
DestroyMenu RootMenu
AddToMenu RootMenu "Menu" Title
 + "Terminal" Exec exec xterm
 + "Browser" Exec exec chromium 'https://www.stackoverflow.com'
 + "" Nop
 + "Log off" Quit
 + "Reboot" Exec exec sudo /sbin/reboot
 + "Shutdown" Exec exec sudo /sbin/halt
OpaqueMoveSize unlimited
Style * ClickToFocus, ResizeOpaque
Style chromium !Title, !Border, !Handles
CursorStyle root top_left_arrow
CursorStyle stroke hand2
IgnoreModifiers L25
Key Help R A -
Key F1 R A -
Key Tab A M -
Key Escape A MC -
Mouse 1 R A -
Mouse 1 T A Move
Mouse 1 FS A Resize
Mouse 1 I A Iconify Off
Mouse 2 FST A -
Mouse 3 R A Menu RootMenu Nop
EOT
mkdir -p /home/myuser/.config/chromium/Default
touch /home/myuser/.config/chromium/First\ Run
cat >> /home/myuser/.config/chromium/Default/Preferences <<EOT
{
   "alternate_error_pages": {
      "enabled": false
   },
   "autofill": {
      "enabled": false
   },
   "browser": {
      "custom_chrome_frame": true,
      "enable_spellchecking": false
   },
   "default_search_provider": {
       "enabled": true,
       "encodings": "UTF-8",
       "icon_url": "about:blank",
       "id": "2",
       "instant_url": "",
       "keyword": "google.com",
       "name": "Google",
       "prepopulate_id": "1",
       "search_url": "{google:baseURL}search?ie={inputEncoding}&q={searchTerms}",
       "suggest_url": ""
   },
   "devtools": {
      "disabled": true
   },
   "dns_prefetching": {
      "enabled": false
   },
   "download": {
      "directory_upgrade": true
   },
   "extensions": {
      "chrome_url_overrides": {
         "bookmarks": [ "chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html" ]
      }
   },
   "geolocation": {
      "default_content_setting": 2
   },
   "google": {
      "services": {
         "username": ""
      }
   },
   "homepage": "https://www.stackoverflow.com",
   "homepage_is_newtabpage": false,
   "intl": {
      "accept_languages": "en",
      "charset_default": "ISO-8859-1"
   },
   "ntp": {
      "pref_version": 3
   },
   "profile": {
      "clear_site_data_on_exit": true,
      "content_settings": {
         "pref_version": 1
      },
      "default_content_settings": {
         "plugins": 1
      },
      "exited_cleanly": true,
      "notifications_default_content_setting": 2,
      "password_manager_enabled": false
   },
   "safebrowsing": {
      "enabled": false
   },
   "search": {
      "suggest_enabled": false
   },
   "tabs": {
      "use_vertical_tabs": false
   },
   "translate": {
      "enabled": false
   }
}
EOT
chown -R myuser:myuser /home/myuser
pacman -Sy
pacman -S --noconfirm pacman
pacman -S --noconfirm fvwm-devel chromium sudo
echo 'myuser arch=NOPASSWD: /sbin/halt,/sbin/reboot' > /etc/sudoers.d/start_stop
chmod 0440 /etc/sudoers.d/start_stop
rm /etc/rc.local
EOF

# Create the new root image.
mksquashfs $TMP_DIR/squashfs-root $TMP_DIR/dest/root-image.sqfs
rm -rf $TMP_DIR/squashfs-root

# Configure the boot loader.
sed -i 's/TIMEOUT 3000/TIMEOUT 100/' $BOOT_CFG
sed -i '/APPEND hd0 0/d' $BOOT_CFG
sed -i 's/archisolabel=[^ ]*/archisolabel=ARCH/' $BOOT_CFG

# Create the new ISO image.
genisoimage -l -R -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
    -no-emul-boot -boot-load-size 4 -boot-info-table -V ARCH \
    -o "$OUTPUT_ISO" $DEST_DIR
rm -rf $TMP_DIR
isohybrid "$OUTPUT_ISO"

0

Для такой системы я бы порекомендовал Puppy .

Несмотря на то, что вы можете создать свой дистрибутив, используя любую версию Linux, Puppy очень легко создает пользовательские загрузочные образы, компактна и имеет отличную поддержку файловой системы.

Я просто должен быть в состоянии использовать жесткий диск

Нет - я бы порекомендовал создать загрузочный образ, который вы можете разумно поддерживать - предложенный вами подход вернется и укусит вас.


Дело в том, что я буду запускать операционную систему на флэш-накопителе. У меня даже не будет диска для установки ОС.
Нафтули Кей

0
  • Несколько человек упомянули uzbl, и я согласен, что это хороший выбор, но вы можете найти luakit еще лучше.

  • Как Калеб уже упоминалось, вы на самом деле не нужен какой - либо оконный менеджер. Вот пример сценария, который я создал для запуска сервера Xorg без WM с развернутым браузером luakit:

    #!/bin/sh
    XDCMD="xdotool search --class luakit windowsize %3 100% 100%"
    while [ 1 ]
    do
        ( sleep 0.5; $XDCMD || sleep 0.2 && $XDCMD || sleep 5 && $XDCMD ) &
        /usr/bin/luakit $@
    done
    

    Он использует xdotool для максимизации окна сразу после запуска luakit. Может быть, есть лучшее решение для этого, хотя ...

  • Для базы такой системы я бы определенно рекомендовал Gentoo. Это не только потому, что я знаю это лучше;), но и потому, что он использует довольно уникальный подход глобального управления параметрами времени сборки всего установленного программного обеспечения. Я имею в виду флаги USE . Используя их, вы определяете набор функций / библиотек / стандартов, которые используются всеми программами, которые их поддерживают - например, если вы хотите, чтобы ваши программы использовали ALSA и не нуждались в дополнительных аудиобэкэндах, таких как esd, jack или pulseaudio, вы поместите alsa -jack -esd -pulseaudioсреди своих флагов USE. После этого каждый программный продукт, который вы создаете, можетИспользование дополнительных аудио бэкендов кроме ALSA будет построено без поддержки тех. Так как это происходит на уровне конфигурации / сборки, у вас получается более тонкое программное обеспечение. Так что это философия построения (при соблюдении всех зависимостей) вместо того, чтобы убирать (что может привести к тому, что будет глючно и очень сложно поддерживать).


0

Я упомяну это, потому что я удивлен, что никто больше не имеет.

Linux from Scratch - это книга (pdf), которая поможет вам создать собственный дистрибутив Linux. Это может быть излишним для того, что вы пытаетесь достичь (на самом деле, это потому, что у вас уже есть необходимые инструменты), но это может оказаться бесценным инструментом для понимания того, как работает система. Это действительно не так сложно, и в этом нет никакого программирования.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.