単純なWebブラウザーを実行するためのカスタム配布を作成するにはどうすればよいですか?


18

単一のWebページを大画面に表示するという明確な目的で、いくつかの軽量マシンを組み立てています。マシンは基本的に軽量かつできるだけ早く起動し、ブラウザ(WebKit?)をフルスクリーンで実行し、JavaScriptによって動的に制御される1つのページをロードする必要があります。GPUが統合されたIntel D525デュアルコアプロセッサを使用するので、独自のグラフィックドライバーをセットアップする必要はありません。これらのマシンの1つが適切にセットアップされたらdd、ハードドライブをコンピューターに接続し、それを新しいマシンにダンプできるようになります。

次の質問があります。

  1. 必要なものだけを含む「ディストリビューション」を作成するにはどうすればよいですか?カーネル(;])、X、そしてある種のWebブラウザーが必要になると思いますが、実際にはあまり必要ではありません。Ubuntu Serverのようなものを取り、X Serverをインストールして、マシンが自動的にログインし、Xを起動し、Webブラウザを起動する方法を見つけることができますか?読むことができる本や記事などはありますか?

  2. 本質的に「クロムレスChromium」を実行する、すっきりした機能の少ないWebブラウザーには何を使用できますか?これらのマシンは、ユーザー入力をまったく受け入れません。それらを管理する必要がある場合は、SSHを使用します。

回答:


12

多くのディストリビューションには、最小インストールのための機能があります。基本的には、明示的にインストールしたいパッケージのみを手動で選択する場所です。Debianはこの能力を備えており、あなたの状況では、他の明白な最小限の競争相手であるArch Linuxよりも良い選択です。

Archのローリングリリースステータスは、避けたいレベルの継続的な複雑さを提供します。Debianは、あなたが探しているシンプルで最小限の基盤に加えて、安定性を提供します。Debianをキオスクとして使用することに関するブログ投稿があり、いくつかの役立つヒントが提供されています。

ブラウザの場合、beav_35が示唆しているように、Uzblは良い選択です。Vimprobableをお勧めします。これは、スクリプト可能なキーボード駆動型で、SSHを介して効果的に制御できるWebKitブラウザーです。

ウィンドウマネージャーとしては、dwmをお勧めします。2000SLOC未満では、非常に軽量であり、キオスクタイプのセットアップ用に簡単に構成できます。


dwmはこの目的に最適で、とにかくDebianベースのシステムに精通しているので、おそらくDebianを使用します。OSをどれだけ小さくできると思いますか?そして、どうすればDebianディストリビューションを構築できますか?
ナフトゥリケイ

インストールを進めながら、ラップトップや標準などの代わりにパッケージの選択ステップに達したら、「手動」を選択し、最低限必要なパッケージ(Xなど)のみを選択します。ここから開始debian.org/CD / netinst /#businesscard-stable
jasonwryan

5

まず第一に、あなたは車輪を再発明したくないかもしれません...キオスクに焦点を当てたディストリビューションがいくつかあります。それらの1つはあなたの多くの仕事を節約するかもしれません。

次に、FedoraおよびRHEL(またはCentOSまたはScientific Linux)でのキックスタートに精通している場合は、Fedoraツールを使用して、これらのディストリビューションを独自にスピンできます。ドキュメントは少し散在していますが、ここから始めてください


Debian / Ubuntuでの同等物:FAI(完全自動インストール)
ジル「SO-悪を止めろ」

4

Arch Linuxなどの最小限のディストリビューションから始めて、必要なパッケージをインストールします。単純なWebブラウザーの場合はUzblを試してください。


uzblは素晴らしいです。+1
ナフトゥリケイ

3

これは非常に複雑な質問です。プロジェクトは完全には明確ではないため、これらの提案のいくつかは範囲外かもしれませんが、評価することを検討してください。

  • ディスプレイアレイの一部であるコンピューターにWebブラウザーが必要ない場合があります。多くの画面で1つのページを表示しようとしている場合、何らかの種類の大量表示技術を使用する可能性があります。Xorgには、複数のマシンのビデオデバイスから1つの大きなディスプレイを生成することに特化したいくつかのバリアントがあります。

  • 各マシンで個別のXサーバーを使用している場合でも、X転送を使用して1つ以上の他のコンピューターから表示データを送信できるため、ブラウザーをローカルで実行する必要はありません。

  • ウィンドウマネージャーをまったく使用せず、ジオメトリ仕様を使用してアプリをフルスクリーンで起動するか、構成可能なタイルまたはフレームワークウィンドウマネージャー(などawesome)を使用して各Xディスプレイ上のウィンドウを管理します。これらにより、フルスクリーンウィンドウの並べ替えと制御が簡単になり、高度にスクリプト化できます。

  • ブラウザについてuzblは、おそらく明確な選択だと思います。

  • これは、ネットワークブートに適したアプリケーションです。TFTPを介して利用可能なネットブックカーネルとnfsを介して利用可能なファイルシステムでサーバーをセットアップできます。クライアントが行う必要があるのは、ネットブート対応のNICを使用してこのサーバーに接続し、カーネルをダウンロードして実行することだけです。ハードドライブは必要ありません!簡単なメンテナンス。すべてのマシンが潜在的に同じイメージを起動できます。

  • あなたの「ディストリビューション」はおそらく2つのもので構成されているはずです。1)パッケージセットおよび2)構成ファイルのセット。パッケージセットは、インストールする必要があるパッケージのリストです。これは通常テキストファイルにアセンブルでき、ほとんどのディストリビューションのパッケージマネージャーを使用して、このパッケージリストをターゲット(ハードドライブまたはnfsマウントポイントとなるディレクトリ)にインストールできます。構成ファイルは、おそらくgit別のソース管理システムに保存する必要があり、いくつかのスクリプトと、パッケージセットと共にインストールされたベースシステムに対して行う必要のあるconfig modを含める必要があります。新しいシステムの構築は次のようになります。

    • ドライブまたはターゲットディレクトリをマウントする
    • package_manager --install-distro --package-set=/path/packagelist.txt --target=/path
    • cd /target/path
    • git clone /path/to/repo (または、構成コードをシステムルートにチェックアウトします)
    • ドライブの場合はブートローダーをインストールし、netbootの場合はPXE構成を追加します
    • ブート。

どのディストリビューションをベースとして使用するかは、最も使いやすいものに依存します。私は自分でPLD-Linuxを使用しますが、ArchLinuxを、初心者向けの同様の、しかし文書化されたシステムとしてお勧めします。DebianFedora、またはGentooがこのために機能しない理由はありません。


ネットブートで:それは素晴らしいように聞こえ、物事を維持するのがとても簡単になるでしょう。ただし、各マシンはマシンに固有の情報を取得するため、異なるURLをロードする必要があります。であることは、なんとか?セキュリティの少しの手段としてHTTP-Basic認証に異なるユーザー/パスワードを使用するように各マシンを構成するかもしれませんが、他のすべては表面上は同じままです。
ナフトゥリケイ

「ディスプレイアレイの一部であるすべてのコンピューターでWebブラウザーが必要ない場合があります」:実際にそうなると思います。これらのマシンはそれぞれ異なる場所にあり、VGAまたはHDMIを介して1つのディスプレイを駆動し、そのマシンに固有のWebページを表示します。(ただし、ユーザー/パスワードによってコンテンツが異なる単一のURLを提供できます)。
ナフトゥリケイ

ウィンドウマネージャー上:dwmまたはのような非常に軽量なものを使用しますawesome。タイトルバーなしでフルスクリーンモードでアプリケーションを起動するようにウィンドウマネージャに指示するにはどうすればよいですか?
ナフトゥリケイ

ディストリビューションの構成:本当に必要なのは、gitリポジトリを作成し、パッケージリストと構成ファイルを保持してから、何らかの方法でISOを作成することです。最も小さなDebianディストリビューションを入手して、そこから作業するにはどうすればよいですか?これらの構成ファイルを取得して書き込み可能なISOを作成するにはどうすればよいですか?私が使用しているだろうapt-getaptitudeDebianの上。
ナフトゥリケイ

X転送の場合:マシンごとに1つのディスプレイを駆動するので、実際には必要ありません。おそらく、マシンにリバースSSH接続を発行させて、コンピューターが接続できるようにする方法を見つける必要がありますが、これを自動化する方法があるかもしれません。コンピューターAがコンピューターBへのTCP接続を開き、コンピューターBをSSH経由でコンピューターAに接続する方法はありますか?それ以外の場合、各ルーターの動的DNS名を取得する必要があります。楽しくない/簡単ではありません。
ナフトゥリケイ

2

Buildroot 2016.05 +みどり

Buildrootは、最小限のディストリビューションを構築するための優れたツールです。

  • あなたはそれに.configファイルを与えます
  • 必要なすべてのソフトウェアと依存関係をダウンロードしてコンパイルし、イメージを生成します

Midoriは最小限のWebKitベースのブラウザであり、Buildrootには組み込みのMidoriパッケージがあります。

.config使用ファイル:https : //github.com/cirosantilli/buildroot-configs/blob/32d1174e0bf8d00b92323eebe8901af3f8c389d3/2016.05/qemu_x86_64_x11_midori_defconfig

その構成ファイルを生成する方法:

  1. フォロー:自分のLinux BuildrootシステムにX11をインストールする方法は?| X11でイメージを作成するためのUnix&Linux Stack Exchange
  2. make menuconfig
    1. ツールチェーン
      1. Cライブラリ
        1. glibc(緑用)
    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 GUIからxtermウィンドウをクリックして実行します:

midori

結果:

ここに画像の説明を入力してください

画像サイズ:220M!それを裸のX11システムの28Mと比較してください自分のLinux BuildrootシステムにX11をインストールする方法は?-UnixおよびLinuxスタック交換。WebKit + GTK3の依存関係が原因と思われます。

Ubuntu 16.04ホスト、QEMU 2.5.0でテスト済み。

NetSurf

fbdevをサポートするSDLで記述:http : //www.netsurf-browser.org/about/screenshots/#framebuffer

fbdevは、X11を経由しないLinuxカーネルモジュールによって提供される低レベルのインターフェイスです(X11はオプションでバックエンドとして使用できると思います)。基本的にはメモリに書き込むだけで、画面に表示されます。

Ubuntuでfbdevを使用するには、TTY(Ctrl + Alt + F1など)である必要があります。

だから、おそらくイメージと離れて得ることができる方法みどりのそれよりも小さいです。

Buildroot 2016.05にはnetsurf-buildsystemそれを提供するパッケージがありますが、私はテストしていません。誰かがそれを実行することに成功した場合は、.config、スクリーンショット、画像サイズへのリンクを編集してください。


1

Arch Linux ISOを取得し、完全に自動化されたインストールを実行する変更されたルートイメージを使用して新しいISOを生成する小さなbashスクリプトを一度作成しました。これには、Xorg、FVWM、およびChromiumを使用したシステムのセットアップと構成だけでなく、パーティション分割も含まれます。インストールされたシステムは自動的にログインし、Chromiumを起動します。新しいISOをUSBフラッシュドライブに挿入して、後戻りします。;-)

免責事項:スクリプトは現状のまま提供され、保証はありません。しばらく使用していませんので、あちこちで微調整が必​​要になる場合があります。必要に応じて変更します。

#!/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を使用すると、カスタムブータブルイメージを非常に簡単に構築でき、コンパクトに設計され、優れたオーバーレイファイルシステムをサポートします。

私はハードドライブをdddできるはずです

いいえ-賢明に維持できるブート可能なイメージを構築することをお勧めします-あなたが提案するアプローチが戻ってきて、噛みつきます。


問題は、サムドライブでオペレーティングシステムを実行することです。OSをインストールするディスクドライブさえ持っていない可能性もあります。
ナフトゥリケイ

0
  • 数人がuzblに言及しましたが、私はそれが良い選択であることに同意します-しかし、luakitはさらに良いかもしれません。

  • カレブは、すでに述べたように、あなたが本当に必要としない任意のウィンドウマネージャを。以下は、最大化されたluakitブラウザーでWM-less Xorgサーバーを実行するために作成したスクリプトの例です。

    #!/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 -pulseaudioUSEフラグに入れます。その後、構築できる各ソフトウェアは、ALSA以外の追加のオーディオバックエンドを使用すると、それらのサポートなしで構築されます。これは構成/ビルドレベルで行われるため、最終的には非常に薄いソフトウェアになります。したがって、これは、(すべての依存関係を尊重しながら)構築するという哲学です(最終的にはバグが多く、保守が非常に困難になる可能性があります)。


0

他の誰も持っていないことに驚いているので、これについて言及します。

Linux from Scratchは、独自のLinuxディストリビューションを作成する手順を説明する書籍(pdf)です。達成しようとしていることはやり過ぎかもしれません(実際には、必要なツールが既にあるので見ています)が、システムの仕組みを理解する上で非常に貴重なツールであることがわかります。それほど難しくはなく、プログラミングも必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.