web-dev-qa-db-ja.com

シンプルなWebブラウザーを実行するためのカスタムディストリビューションを構築するにはどうすればよいですか?

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

次の質問があります。

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

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

18
Naftuli Kay

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

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

ブラウザの場合、 beav_35 が示唆するように、 zbl が適切な選択です。私がお勧めするのは Vimprobable です。これは、スクリプト対応でキーボード駆動型で、SSH経由で効果的に制御できるWebKitブラウザーです。

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

12
jasonwryan

まず第一に、あなたは車輪を再発明したくないかもしれません...キオスクに焦点を合わせたいくつかの分布があります。それらの1つはあなたに多くの仕事を節約するかもしれません。

次に、FedoraとRHEL(またはCentOSまたはScientific Linux)でのKickstartに慣れている場合は、Fedoraツールを使用して、これらのディストリビューションの独自のスピンを作成できます。ドキュメントは少しばらばらですが、- ここから開始

5

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

4
beav_35

これはかなり複雑な質問であり、プロジェクトが完全に明確ではないため、これらの提案の一部は適格ではない可能性がありますが、評価することを考慮してください。

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

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

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

  • ブラウザに関しては、uzblがおそらく正しい選択だと思います。

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

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

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

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

3
Caleb

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. フォロー: 自分のLinux BuildrootシステムにX11をインストールするには?| Unix&Linux Stack Exchange X11でイメージを作成します。
  2. make menuconfig
    1. ツールチェーン
      1. Cライブラリ
        1. glibc(midori用)
    2. ターゲットパッケージ
      1. グラフィックライブラリとアプリケーション
        1. mesa3d
          1. 必要なものがわからないため、すべてのGalliumおよびDRIドライバーを選択します(OpenGL EGLの場合)
          2. OpenGL EGL(libgtk3用)
      2. ライブラリ
        1. グラフィック1. libgtk3(midori用)

ツールチェーンを変更して再度ビルドするため、ビルドをクリーンアップします。

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

結果:

enter image description here

画像サイズ:220M!それを28MのベアX11システムと比較してください 自分のLinux BuildrootシステムにX11をインストールする方法?-Unix&Linux Stack Exchange 。 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など)。

そのため、Midoriよりも小さい画像wayで問題を回避できます。

Buildroot 2016.05にはパッケージnetsurf-buildsystemこれはそれを提供するはずですが、私はテストしていません。誰かがなんとかそれを動かしているなら、.config、スクリーンショットと画像サイズへのリンクを編集してください。

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"
1
igor
  • 何人かの人々がuzblについて言及し、私はそれが良い選択であることに同意します-しかし、あなたは luakit をさらによく見つけるかもしれません。

  • Calebがすでに述べたように、実際にはanyウィンドウマネージャーは必要ありません。これは、最大のluakitブラウザでWMなしの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をお勧めします。これは、私がそれを最もよく知っているというだけでなく、インストールされているすべてのソフトウェアのビルド時オプションをグローバルに管理するというかなりユニークなアプローチを使用しているためでもあります。 SEフラグ を意味します。これらを使用して、それらをサポートするすべてのプログラムで使用される機能/ライブラリ/標準のセットを決定します。たとえば、プログラムでALSAを使用し、esd、jack、pulseaudioなどの追加のオーディオバックエンドが不要な場合は、 alsa -jack -esd -pulseaudio USEフラグの中。その後、ビルドするソフトウェアの各部分can ALSA以外の追加のオーディオバックエンドを使用します。これらのサポートなしでビルドされます。これは構成/ビルドレベルで発生するため、ソフトウェアが大幅に薄くなります。したがって、これはストリップダウン(バグが多く、メンテナンスが非常に困難になる可能性がある)を行うのではなく、(すべての依存関係を尊重しながら)構築することの哲学です。

0
rozcietrzewiacz

このようなシステムでは、 Puppy をお勧めします。

Linuxの任意のバージョンを使用してディストリビューションをビルドできますが、パピーはそれを 非常に簡単にビルドできる カスタムブート可能イメージにします コンパクト となるように設計されており、優れたオーバーレイファイルシステムをサポートしています。

私はハードドライブをddすることができるはずです

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

0
symcbean

他の人がいないことに驚いたので、これについて触れます。

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

0
n0pe