Como posso criar uma distribuição personalizada para executar um navegador da web simples?

18

Estamos montando algumas máquinas leves com a finalidade expressa de exibir uma única página da web em uma tela grande. Eu preciso que a máquina inicie essencialmente como leve e o mais rápido possível e essencialmente execute um navegador (WebKit?) Em tela cheia, carregando uma página que será controlada dinamicamente pelo JavaScript. Eu vou estar usando um processador Intel D525 dual-core com GPU integrado, então eu não precisaria configurar nenhum driver gráfico proprietário. Uma vez que eu tenha uma dessas máquinas configuradas corretamente, eu deveria ser capaz de dd o disco rígido em meu computador e depois colocá-lo em cada nova máquina.

Eu tenho as seguintes perguntas:

  1. Como posso criar uma "distribuição" que inclui apenas o que eu preciso? Eu suponho que precisarei do kernel (;]), X, e um navegador da web de algum tipo, mas não muito em demasia. Eu poderia pegar algo como o Ubuntu Server e simplesmente instalar o X Server e encontrar uma maneira de fazer com que a máquina faça login automaticamente, inicie o X e inicie o navegador da Web, sem fazer perguntas? Existe um livro que eu possa ler ou um artigo ou algo assim?

  2. O que posso usar para um navegador da Web simples e simples que executa essencialmente um "Chromeless Chromium"? Essas máquinas não aceitarão a entrada do usuário. Se eu precisar gerenciá-los, usarei o SSH.

por Naftuli Kay 01.08.2011 / 04:44

9 respostas

12

Muitas distribuições têm alguma facilidade para uma instalação mínima; essencialmente onde você seleciona manualmente apenas os pacotes que você deseja instalar explicitamente. O Debian tem essa habilidade e seria uma escolha melhor, na sua situação, do que o outro concorrente mínimo óbvio, o Arch Linux.

O status de lançamento do lançamento do Arch pode fornecer um nível de complexidade contínua que você deseja evitar. O Debian forneceria a base simples e mínima que você está procurando, além de oferecer estabilidade. Existe uma postagem no blog sobre como usar o Debian como um quiosque que pode oferecer algumas dicas úteis.

Para um navegador, como beav_35 sugere, Uzbl é uma boa escolha. Minha recomendação seria Vimprobable , um navegador WebKit que pode ser roteirizado, controlado por teclado e pode ser controlado de forma eficaz por SSH.

Como gerenciador de janelas, eu recomendaria dwm : com menos de 2000 SLOC, é extremamente leve e pode ser facilmente configurado para uma configuração do tipo quiosque.

    
por 01.08.2011 / 08:33
5

Primeiro de tudo, você pode não querer reinventar a roda ... Existem várias distribuições focadas em quiosques. Um desses pode poupar muito trabalho.

Em segundo lugar, se você está familiarizado com o Kickstart no Fedora e RHEL (ou CentOS ou Scientific Linux), você pode usar as ferramentas do Fedora para fazer sua própria rotação de qualquer uma dessas distribuições. A documentação está um pouco dispersa, mas comece aqui .

    
por 01.08.2011 / 13:19
4

Comece com uma distro mínima, como Arch Linux , e instale os pacotes que você precisa. Para um simples navegador da Web, tente Uzbl .

    
por 01.08.2011 / 08:10
3

Essa é uma pergunta bastante complicada e, como seu projeto não está totalmente claro, algumas dessas sugestões podem estar fora do alvo, mas considere-as como coisas para avaliar.

  • Você pode não precisar de um navegador da Web em qualquer computador que faça parte do array de exibição. Se você está tentando mostrar uma única página em várias telas, é provável que queira usar algum tipo de tecnologia de exibição em massa. Existem várias variantes do Xorg que se especializam em gerar uma grande tela a partir de dispositivos de vídeo em várias máquinas.

  • Mesmo que você use servidores X separados em cada máquina, você pode usar o X-forwarding para enviar dados de exibição de um ou mais outros computadores, para que os navegadores ainda não precisem ser executados localmente.

  • Você não desejará usar nenhum gerenciador de janelas e usar especificações de geometria para iniciar o aplicativo em tela cheia ou usar um gerenciador de janelas de bloco ou de janela configurável (como awesome ) para gerenciar as janelas em cada X display. Isso torna fácil classificar e controlar janelas em tela cheia e é altamente programável por scripts.

  • Quanto a um navegador, acho que uzbl é provavelmente a escolha clara.

  • Esta pode ser uma boa aplicação para inicialização via rede. Você pode configurar o servidor com um kernel de netbook disponível via TFTP e um sistema de arquivos disponível via nfs. Tudo o que seus clientes precisam fazer é usar uma NIC com capacidade de netboot para entrar em contato com esse servidor, fazer o download do kernel e ir embora. Não há disco rígido envolvido! E fácil manutenção. Todas as máquinas podem inicializar a mesma imagem.

  • Sua "distro" provavelmente deve consistir em duas coisas. 1) Um conjunto de pacotes e 2) um conjunto de arquivos de configuração. O conjunto de pacotes é uma lista de pacotes que precisam ser instalados. Isso geralmente pode ser montado em um arquivo de texto e, em seguida, você pode usar a maioria dos gerenciadores de pacotes da distro para instalar essa lista de pacotes em um destino (um disco rígido ou um diretório que será seu ponto de montagem nfs). Os arquivos de configuração provavelmente devem ser mantidos em git ou outro sistema de controle de origem e conter alguns scripts e quaisquer mods de configuração que precisem ser feitos no sistema base instalado com o conjunto de pacotes. Construir um novo sistema torna-se então:

    • Montar unidade ou diretório de destino
    • package_manager --install-distro --package-set=/path/packagelist.txt --target=/path
    • cd /target/path
    • git clone /path/to/repo (ou caso contrário, verifique seu código de configuração na raiz do sistema)
    • Instale o gerenciador de inicialização se for uma unidade ou adicione a configuração do PXE se o netboot
    • boot.

Qual distro você usa como base deve depender daquilo com que você se sente mais confortável. Eu usaria PLD-Linux para mim, mas provavelmente recomendaria o ArchLinux como um sistema semelhante, mas melhor documentado, para um novato trabalhar. Não há razão para que o Debian , o Fedora , ou o Gentoo não funcionem para isso.

    
por 01.08.2011 / 11:27
2

Buildroot 2016.05 + Midori

O Buildroot é uma ótima ferramenta para criar distros mínimos:

  • você atribui um arquivo .config
  • faz o download e compila todo o software e dependências necessários e produz uma imagem

Midori um minimalista WebKit , e o Buildroot possui um pacote Midori integrado.

.config arquivo usado: link

Como gerar esse arquivo de configuração:

  1. Siga: Como instalar o X11 sozinho Sistema Linux Buildroot? | Unix & Linux Stack Exchange para criar uma imagem com o X11.
  2. %código%
    1. Toolchain
        biblioteca
      1. C
        1. glibc (para midori)
    2. Pacotes de segmentação
      1. Bibliotecas gráficas e aplicativos
        1. %código%
          1. selecione todos os drivers Gallium e DRI, pois não entendo qual deles é necessário (para OpenGL EGL)
          2. OpenGL EGL (para libgtk3)
      2. Bibliotecas
        1. Gráficos     1. libgtk3 (para midori)

Limpe a versão porque alteramos o conjunto de ferramentas e criamos novamente:

rm -rf output
make BR2_JLEVEL=$(nproc)

Aguarde horas. Então o habitual:

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 de dentro do QEMU:

root
startx

e da interface gráfica do X11, clique em uma janela make menuconfig e execute:

midori

Resultado:

Tamanhodaimagem:220M!Compareissocomos28MdeumsistemaX11simples Como instalar o X11 no meu próprio sistema Linux Buildroot? - Unix & Stack Exchange do Linux . Provavelmente por causa das dependências do WebKit + GTK3.

Testado no host do Ubuntu 16.04, QEMU 2.5.0.

NetSurf

Escrito no SDL, que suporta o link fbdev:

fbdev é uma interface de nível mais baixo oferecida por um módulo do kernel Linux que não passa pelo X11 (acho que o X11 pode opcionalmente usá-lo como backend). Você basicamente só escreve na memória e aparece na tela.

Para usar fbdev no Ubuntu, você precisa estar em um TTY (por exemplo, Ctrl + Alt + F1).

Então você provavelmente pode se safar com uma imagem way menor que a da Midori.

O Buildroot 2016.05 possui um pacote mesa3d que deve ser fornecido, mas eu não testei. Se alguém conseguir executá-lo, edite em um link para um .config, captura de tela e tamanho da imagem.

    
por 28.08.2016 / 11:43
1

Eu escrevi um pequeno script bash uma vez que leva um ISO do Arch Linux e gera um novo ISO com uma imagem de raiz modificada que faz uma instalação totalmente automatizada. Isso inclui particionamento, bem como configuração e configuração do sistema com Xorg, FVWM e Chromium. O sistema instalado fará login automaticamente e iniciará o Chromium. Basta colocar o novo ISO em uma unidade flash USB e inclinar-se para trás. ; -)

Isenção de responsabilidade: o script é fornecido como está, sem garantia. Eu não uso há algum tempo, então pode ser necessário um ajuste aqui ou ali. Modifique conforme necessário.

#!/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"
    
por 01.08.2011 / 13:06
0

Para um sistema como este, eu recomendo Filhote .

Embora você possa construir sua distribuição usando qualquer versão do Linux, o Puppy torna muito fácil de construir imagens de inicialização personalizadas, foi projetada para ser compacta e tem um ótimo suporte ao sistema de arquivos de sobreposição.

I should just be able to dd the hard drive

Não - eu recomendaria a criação de uma imagem inicializável que você possa manter de forma sensata - a abordagem que você sugere voltará e morderá você.

    
por 01.08.2011 / 09:58
0
  • Várias pessoas mencionaram o uzbl e eu concordo que é uma boa escolha - mas você pode encontrar luakit melhor ainda.

  • Como Caleb já mencionou, você realmente não precisa de nenhum gerenciador de janelas. Aqui está um script de exemplo que eu criei para executar um servidor XM sem WM com o navegador luakit maximizado:

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

    Ele usa o xdotool para maximizar a janela logo após o início do luakit. Talvez exista uma solução melhor para isso ...

  • Para a base desse sistema, eu definitivamente recomendo o Gentoo. Isso não é apenas porque eu o conheço melhor;), mas também porque ele usa uma abordagem única de gerenciar globalmente as opções de tempo de construção de todo o software instalado. Quero dizer, os sinalizadores USE . Usando esses, você determina o conjunto de recursos / bibliotecas / padrões que são usados por todos os programas que os suportam - assim, por exemplo, se você quiser que seus programas usem o ALSA e não precise de backends de áudio adicionais como esd, jack ou pulseaudio, Coloque alsa -jack -esd -pulseaudio entre seus flags de USE. Depois disso, cada software que você construir que possa usar backends de áudio adicionais, além do ALSA, será construído sem o suporte para eles. Como isso acontece no nível de configuração / build, você acaba com um software significativamente mais fino. Portanto, esta é uma filosofia de construção (respeitando todas as dependências) em vez de desmontar (o que pode acabar sendo problemático e muito difícil de manter).

por 14.08.2011 / 16:00
0

Eu vou mencionar isso porque estou surpreso que ninguém mais tenha.

Linux from Scratch é um livro (pdf) que o guia pela criação de sua própria distribuição Linux. Pode ser um exagero para o que você está tentando realizar (na verdade, é porque você já tem as ferramentas que precisa), mas pode ser uma ferramenta inestimável para entender como um sistema funciona. Não é tão difícil assim e não há programação envolvida.

    
por 21.08.2011 / 16:07