Come posso creare una distribuzione personalizzata per l'esecuzione di un semplice browser Web?


18

Stiamo assemblando alcune macchine leggere allo scopo esplicito di visualizzare una singola pagina Web su un grande schermo. Ho bisogno che la macchina si avvii essenzialmente il più leggero e il più rapidamente possibile ed essenzialmente abbia un browser (WebKit?) A schermo intero, caricando una pagina che sarà controllata dinamicamente da JavaScript. Userò un processore dual core Intel D525 con GPU integrata, quindi non dovrei aver bisogno di impostare alcun driver grafico proprietario. Una volta che ho installato correttamente una di queste macchine, dovrei essere in grado di accedere al dddisco rigido sul mio computer e quindi scaricarlo su ogni nuova macchina.

Ho le seguenti domande:

  1. Come posso creare una "distribuzione" che include solo ciò di cui ho bisogno? Suppongo che avrò bisogno del kernel (;]), X e di un browser Web di qualche tipo, ma non troppo. Potrei prendere qualcosa come Ubuntu Server e semplicemente installare X Server e trovare un modo per far accedere automaticamente la macchina, avviare X e avviare il browser Web, senza fare domande? C'è un libro che posso leggere o un articolo o qualcosa del genere?

  2. Cosa posso usare per un bel browser Web ridotto che esegue essenzialmente un "Chromium senza cromatura?" Queste macchine non accetteranno affatto l'input dell'utente. Se devo gestirli, userò SSH.

Risposte:


12

Molte distribuzioni hanno qualche possibilità per un'installazione minima; essenzialmente dove selezioni manualmente solo quei pacchetti che desideri esplicitamente installare. Debian ha questa capacità e sarebbe una scelta migliore, nella tua situazione, rispetto all'altro ovvio contendente minimo, Arch Linux.

Lo stato di rilascio progressivo di Arch può fornire un livello di complessità continua che si desidera evitare. Debian fornirebbe la base semplice e minimale che stai cercando, oltre a offrire stabilità. C'è un post sul blog sull'uso di Debian come chiosco che può offrire alcuni consigli utili.

Per un browser, come beav_35 suggerisce, Uzbl è una scelta buona. La mia raccomandazione sarebbe Vimprobable , un browser WebKit che è utilizzabile tramite script, gestito da tastiera e che può essere controllato in modo efficace su SSH.

Come gestore di finestre, consiglierei dwm : a meno di 2000 SLOC, è estremamente leggero e può essere facilmente configurato per un'installazione di tipo chiosco.


dwm ha un bell'aspetto per questo scopo, e ho comunque molta più familiarità con i sistemi basati su Debian, quindi probabilmente userò Debian. Quanto piccolo pensi che riesca a far scendere il sistema operativo? E come posso costruire una distribuzione Debian?
Naftuli Kay,

Man mano che procedi con l'installazione, quando raggiungi il passaggio di selezione dei pacchetti, invece di Laptop, Standard, ecc., Scegli "Manuale" e seleziona solo i pacchetti (come X) necessari per un minimo indispensabile: inizia qui debian.org/CD / netinst / # businesscard-stable
jasonwryan

5

Prima di tutto, potresti non voler reinventare la ruota ... Esistono diverse distribuzioni focalizzate sul chiosco. Uno di questi potrebbe farti risparmiare un sacco di lavoro.

In secondo luogo, se hai familiarità con Kickstart su Fedora e RHEL (o CentOS o Scientific Linux), puoi usare gli strumenti Fedora per fare il tuo giro di una di quelle distribuzioni. La documentazione è un po 'sparsa, ma inizia qui .


Equivalente Debian / Ubuntu: FAI (Installazione completamente automatica)
Gilles 'SO- smetti di essere malvagio'


3

Questa è una domanda piuttosto complessa, e poiché il tuo progetto non è del tutto chiaro alcuni di questi suggerimenti potrebbero essere off-mark, ma considerali cose da valutare.

  • Potrebbe non essere necessario un browser Web su qualsiasi computer che faccia parte dell'array di visualizzazione. Se stai cercando di mostrare una singola pagina su più schermi, è probabile che tu voglia utilizzare una sorta di tecnologia di visualizzazione di massa. Esistono diverse varianti di Xorg specializzate nella generazione di un grande display da dispositivi video su più macchine.

  • Anche se si utilizzano server X separati su ciascun computer, è possibile utilizzare l'inoltro X per inviare dati di visualizzazione da uno o più altri computer, in modo che i browser non debbano comunque essere eseguiti localmente.

  • Non vorrai utilizzare nessun gestore di finestre e utilizzare le specifiche della geometria per avviare l'app a schermo intero, oppure utilizzare un riquadro configurabile o un gestore di finestre di framework (come awesome) per gestire le finestre su ogni display X. Questi facilitano l'ordinamento e il controllo delle finestre a schermo intero e sono altamente scriptabili.

  • Per quanto riguarda un browser, penso che uzblsia probabilmente la scelta chiara.

  • Questa potrebbe essere una buona applicazione per l'avvio di rete. È possibile configurare il server con un kernel per netbook disponibile tramite TFTP e un file system disponibile tramite nfs. Tutto ciò che i tuoi clienti devono fare è usare una scheda di rete abilitata per netboot per contattare questo server, scaricare il loro kernel e andare. Nessun disco rigido coinvolto! E facile manutenzione. Tutte le macchine possono potenzialmente avviare la stessa immagine.

  • La tua "distro" dovrebbe probabilmente consistere in due cose. 1) Un set di pacchetti e 2) un set di file di configurazione. Il set di pacchetti è un elenco di pacchetti che devono essere installati. Questo di solito può essere assemblato in un file di testo e quindi è possibile utilizzare la maggior parte dei gestori di pacchetti della distro per installare questo elenco di pacchetti su una destinazione (o un disco rigido o una directory che sarà il punto di montaggio di nfs). I file di configurazione dovrebbero probabilmente essere conservati in gitun altro sistema di controllo del codice sorgente e contenere alcuni script e qualsiasi configurazione di configurazione debba essere effettuata sul sistema di base installato con il set di pacchetti. La costruzione di un nuovo sistema diventa quindi:

    • Montare l'unità o la directory di destinazione
    • package_manager --install-distro --package-set=/path/packagelist.txt --target=/path
    • cd /target/path
    • git clone /path/to/repo (o controlla il tuo codice di configurazione nella radice del sistema)
    • Installa bootloader se guidi o aggiungi PXE config se netboot
    • stivale.

La distro che usi come base dovrebbe dipendere da cosa ti senti più a tuo agio. Vorrei usare PLD-Linux per me stesso, ma probabilmente consiglierei ArchLinux come un sistema simile ma meglio documentato per un principiante con cui lavorare. Non c'è motivo per cui Debian , Fedora o Gentoo non funzionino per questo.


sull'avvio in rete: sembra FANTASTICO e renderebbe le cose molto più facili da mantenere. Tuttavia, ogni macchina deve caricare un URL diverso, poiché recupereranno informazioni univoche per la macchina. È che fattibile? Tutto il resto rimarrebbe apparentemente lo stesso, anche se potrei configurare ogni macchina per utilizzare un utente / password diversi per l'autenticazione HTTP-Basic come un piccolo mezzo di sicurezza.
Naftuli Kay,

su "Potrebbe non essere necessario un browser Web su tutti i computer che fanno parte dell'array di visualizzazione": penso che lo farò, in realtà. Ognuna di queste macchine si troverà in una posizione diversa, guidando un display su VGA o HDMI, visualizzando una pagina web unica per quella macchina. (anche se potremmo offrire un singolo URL che varia il contenuto su utente / password).
Naftuli Kay,

sui gestori di finestre: probabilmente ne userei uno leggero come dwmo awesome. Come posso dire a un gestore di finestre di avviare un'applicazione senza la barra del titolo in modalità schermo intero?
Naftuli Kay,

su cosa dovrebbe consistere la distro: quindi tutto ciò di cui ho veramente bisogno è creare un repository git, tenere un elenco di pacchetti e file di configurazione, quindi creare in qualche modo un ISO. Come ottengo la più piccola distro Debian e poi lavoro da lì? Come posso prendere questi file di configurazione e creare un ISO masterizzabile? Userei apt-geto aptitudesu Debian.
Naftuli Kay,

su X-forwarding: non dovrebbe davvero essere necessario, poiché guiderò un display per macchina. Probabilmente dovrò trovare un modo per far sì che la macchina emetta una connessione SSH inversa in modo che il mio computer sia in grado di connettersi ad essa, ma potrebbe esserci un modo per automatizzare questo. Esiste un modo per fare in modo che un computer A apra una connessione TCP al computer B e quindi che il computer B si colleghi tramite tale connessione al computer A tramite SSH? Altrimenti, dovrei ottenere nomi DNS dinamici per ogni router: non è divertente / facile.
Naftuli Kay,

2

Buildroot 2016.05 + Midori

Buildroot è un ottimo strumento per creare distro minime:

  • gli dai un .configfile
  • scarica e compila tutto il software e le dipendenze richiesti e produce un'immagine

Midori è un browser minimalista basato su WebKit e Buildroot ha un pacchetto Midori integrato.

.configfile utilizzato: https://github.com/cirosantilli/buildroot-configs/blob/32d1174e0bf8d00b92323eebe8901af3f8c389d3/2016.05/qemu_x86_64_x11_midori_defconfig

Come generare quel file di configurazione:

  1. Segui: Come installare X11 sul mio sistema Linux Buildroot? | Scambio di stack Unix e Linux per creare un'immagine con X11.
  2. make menuconfig
    1. toolchain
      1. Libreria C.
        1. glibc (per midori)
    2. Pacchetti target
      1. Librerie grafiche e applicazioni
        1. mesa3d
          1. seleziona tutti i driver Gallio e DRI poiché non capisco quale sia necessario (per OpenGL EGL)
          2. OpenGL EGL (per libgtk3)
      2. biblioteche
        1. Grafica 1. libgtk3 (per midori)

Pulisci la build perché abbiamo cambiato la toolchain e la build di nuovo:

rm -rf output
make BR2_JLEVEL=$(nproc)

Aspetta ore. Quindi il solito:

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

E dall'interno di QEMU:

root
startx

e dalla GUI X11 fare clic su una xtermfinestra ed eseguire:

midori

Risultato:

inserisci qui la descrizione dell'immagine

Dimensione dell'immagine: 220 M! Confrontalo con i 28M di un sistema X11 nudo Come installare X11 sul mio sistema Linux Buildroot? - Scambio di stack Unix e Linux . Probabilmente a causa delle dipendenze WebKit + GTK3.

Testato su host Ubuntu 16.04, QEMU 2.5.0.

NetSurf

Scritto in SDL, che supporta il fbdev: http://www.netsurf-browser.org/about/screenshots/#framebuffer

fbdev è un'interfaccia di livello inferiore offerta da un modulo del kernel Linux che non passa attraverso X11 (penso che X11 possa opzionalmente usarlo come backend). Fondamentalmente basta scrivere in memoria e viene visualizzato sullo schermo.

Per usare fbdev su Ubuntu, devi essere su un TTY (es. Ctrl + Alt + F1).

Quindi probabilmente puoi cavartela con un'immagine molto più piccola di quella di Midori.

Buildroot 2016.05 ha un pacchetto netsurf-buildsystemche dovrebbe fornirlo, ma non l'ho provato. Se qualcuno riesce a farlo funzionare, si prega di modificare in un collegamento a un .config, screenshot e dimensioni dell'immagine.


1

Una volta ho scritto un piccolo script bash che prende un ISO di Arch Linux e genera un nuovo ISO con un'immagine root modificata che esegue un'installazione completamente automatizzata. Ciò include il partizionamento, nonché l'installazione e la configurazione del sistema con Xorg, FVWM e Chromium. Il sistema installato accederà automaticamente e avvierà Chromium. Basta inserire la nuova ISO su un'unità flash USB e distendersi. ;-)

Disclaimer: lo script viene fornito così com'è, nessuna garanzia fornita. Non lo uso da un po ', quindi potrebbe aver bisogno di una modifica qui o là. Modificare se necessario.

#!/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

Per un sistema come questo consiglierei Puppy .

Mentre puoi creare la tua distribuzione utilizzando qualsiasi versione di Linux, Puppy semplifica la creazione di immagini di avvio personalizzate, è progettato per essere compatto e ha un ottimo supporto per il file system overlay.

Dovrei solo essere in grado di dd il disco rigido

No - Consiglierei di creare un'immagine di avvio che puoi mantenere in modo ragionevole - l'approccio che suggerisci tornerà e ti morderà.


Il fatto è che eseguirò il sistema operativo su una chiavetta USB. Non avrò nemmeno potenzialmente un'unità disco con cui installare il sistema operativo.
Naftuli Kay,

0
  • Diverse persone hanno menzionato Uzbl e sono d'accordo che sia una buona scelta, ma potresti trovare Luakit ancora migliore.

  • Come già accennato da Caleb, non hai davvero bisogno di nessun gestore di finestre. Ecco uno script di esempio che ho creato per eseguire un server Xorg senza WM con un browser luakit ottimizzato:

    #!/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
    

    Utilizza xdotool per ingrandire la finestra subito dopo l'avvio di luakit. Forse c'è una soluzione migliore a questo però ...

  • Per la base di tale sistema, consiglierei sicuramente Gentoo. Questo non solo perché lo conosco meglio;) ma anche perché utilizza un approccio piuttosto unico di gestione globale delle opzioni di build-time di tutto il software installato. Intendo le bandiere USE . Usando questi, si determina l'insieme di funzionalità / librerie / standard che vengono utilizzati da tutti i programmi che li supportano - quindi, ad esempio, se si desidera che i programmi utilizzino ALSA e non siano necessari backend audio aggiuntivi come esd, jack o pulseaudio, mettere alsa -jack -esd -pulseaudiotra le bandiere USE. Dopo di ciò, ogni pezzo di software che costruisci può farloutilizzare ulteriori backend audio a parte ALSA sarà costruito senza il supporto per quelli. Dal momento che ciò accade a livello di configurazione / build, si finisce con un software significativamente più sottile. Quindi questa è una filosofia di costruzione (nel rispetto di tutte le dipendenze) invece di eliminazione (che può finire per essere buggy e molto difficile da mantenere).


0

Ne parlerò perché sono sorpreso che nessun altro l'abbia fatto.

Linux from Scratch è un libro (pdf) che ti guida nella creazione della tua distribuzione Linux. Potrebbe essere eccessivo per quello che stai cercando di realizzare (in realtà, visto che hai già gli strumenti di cui hai bisogno), ma può rivelarsi uno strumento prezioso per capire come funziona un sistema. Non è poi così difficile e non è prevista alcuna programmazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.