如何为运行简单的Web浏览器构建自定义发行版?


18

我们正在组装一些轻量级机器,其明确目的是在大屏幕上显示单个网页。我需要机器从根本上以尽可能轻巧的速度启动,并且实质上让它以全屏模式运行浏览器(WebKit?),并加载一个页面,该页面将由JavaScript动态控制。我将使用具有集成GPU的Intel D525双核处理器,因此不需要设置任何专有的图形驱动程序。一旦正确设置了其中一台计算机,就应该能够dd将硬盘驱动器安装到计算机上,然后将其转储到每台新计算机上。

我有以下问题:

  1. 如何创建仅包含所需内容的“分发”?我想我需要内核(;)),X和某种Web浏览器,但实际上并不需要太多。我是否可以使用Ubuntu Server之类的东西,然后简单地安装X Server并找到一种方法,使计算机自动登录,启动X并启动Web浏览器,没有问题?是否有我可以阅读的书或文章或其他内容?

  2. 对于一个运行“无铬铬”的精简精简的Web浏览器,我可以使用什么?这些机器根本不会接受用户输入。如果需要管理它们,我将使用SSH。

Answers:


12

许多发行版都提供了一些用于最小化安装的工具。本质上,您只能手动选择要明确安装的软件包。Debian具有此功能,在您的情况下,Debian将是另一个明显的最小竞争者Arch Linux的更好选择。

Arch的滚动发布状态可能会提供您希望避免的持续复杂性。Debian将为您提供简单,最少的基础,并提供稳定性。有一篇关于使用Debian作为信息亭的博客文章,可能会提供一些有用的提示。

beav_35所示,对于浏览器而言Uzbl是一个不错的选择。我的建议是Vimprobable,这是一个WebKit浏览器,该脚本可编写脚本,由键盘驱动,并且可以通过SSH有效控制。

作为窗口管理器,我建议使用dwm:低于2000 SLOC时,它非常轻巧,可以轻松配置为信息亭类型的设置。


dwm看起来很不错,无论如何我还是对基于Debian的系统更加熟悉,所以我可能会使用Debian。您认为我可以将操作系统降低到多少?我该如何建立一个Debian发行版?
2011年

在安装过程中,进入“选择软件包”步骤,而不是“笔记本电脑”,“标准”等,选择“手动”,然后仅选择您需要的最低限度的软件包(例如X):从此处开始debian.org/CD / netinst /#businesscard-stable
jasonwryan 2011年

5

首先,您可能不想重新发明轮子。有几个以信息亭为中心的发行版。其中之一可能会节省您很多工作。

其次,如果您熟悉Fedora和RHEL(或CentOS或Scientific Linux)上的Kickstart,则可以使用Fedora工具自行开发任何这些发行版。文档有点分散,但是从此处开始


Debian / Ubuntu等效:FAI(完全自动安装)
Gilles'SO-别成为邪恶'


3

这是一个涉及很深的问题,由于您的项目尚不完全清楚,其中一些建议可能不合时宜,但请考虑对它们进行评估。

  • 作为显示阵列一部分的任何计算机上,您可能都不需要Web浏览器。如果您试图在多个屏幕上显示一页,那么您可能会想要使用某种大规模显示技术。Xorg有多种变体,专门用于在多台机器上从视频设备生成一个大型显示器。

  • 即使在每台计算机上使用单独的X服务器,也可以使用X转发从一台或多台其他计算机发送显示数据,因此浏览器仍然不必在本地运行。

  • 您将要么不想使用任何窗口管理器,而要使用几何规范来全屏启动应用程序,要么要使用可配置的图块或框架窗口管理器(例如awesome)来管理每个X显示器上的窗口。这些功能使排序和控制全屏窗口变得很容易,并且可以高度脚本化。

  • 对于浏览器,我认为uzbl可能是明智的选择。

  • 这对于网络启动来说可能是一个很好的应用程序。您可以使用TFTP提供的上网本内核和nfs提供的文件系统来设置服务器。您的客户所需要做的就是使用支持netboot的NIC来联系该服务器,下载其内核并运行。不涉及硬盘驱动器!而且维修方便。所有机器都可能启动同一映像。

  • 您的“发行版”可能应该包括两件事。1)一个软件包集和2)一组配置文件。软件包集是需要安装的软件包的列表。通常可以将其组装为文本文件,然后可以使用大多数发行版的软件包管理器将此软件包列表安装到目标(硬盘驱动器或将成为nfs挂载点的目录)。配置文件可能应该保留在git另一个源控制系统中,并且应包含一些脚本以及需要对随软件包集一起安装的基本系统进行的任何配置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作为一个类似的文档,但文档更好,供新手使用。没有理由DebianFedoraGentoo对此不起作用。


在网络启动时:听起来很棒,并且使维护变得如此容易。但是,每台机器都需要加载不同的URL,因为它们将获取该机器特有的信息。是是可行的?表面上所有其他内容都将保持不变,尽管我可以将每台计算机配置为对HTTP基本身份验证使用不同的用户/密码,以此作为一种安全性手段。
Naftuli Kay 2011年

关于“您可能不需要在作为显示阵列一部分的每台计算机上都使用Web浏览器”:我想我会的。这些机器中的每一个将位于不同的位置,通过VGA或HDMI驱动一个显示器,并显示该机器的唯一网页。(尽管我们可以提供一个URL,该URL可以改变用户/密码上的内容)。
Naftuli Kay 2011年

关于窗口管理器:我可能只使用像dwm或的轻量级对象awesome。如何告诉窗口管理器在全屏模式下没有标题栏的情况下启动应用程序?
Naftuli Kay 2011年

关于发行版应该包括的内容:因此,我真正需要做的就是创建一个git repo,保留一个软件包列表和配置文件,然后以某种方式创建一个ISO。我如何获得最小的Debian发行版,然后从那里进行开发?如何获取这些配置文件并制作可刻录的ISO?我会使用apt-getaptitudeDebian的。
Naftuli Kay 2011年

关于X转发:确实没有必要,因为我将在每台机器上驱动一个显示器。我可能必须找到一种方法来使计算机发出反向SSH连接,以便我的计算机能够连接到它,但是可能有一种方法可以使它自动化。有没有办法让计算机A打开到计算机B的TCP连接,然后使计算机B通过SSH通过该连接连接到计算机A?否则,我必须为每个路由器获取动态DNS名称:不好玩/不容易。
2011年

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. 关注:如何在我自己的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

结果:

在此处输入图片说明

图片大小:220M!将此与裸X11系统的28M进行比较如何在我自己的Linux Buildroot系统上安装X11?-Unix和Linux堆栈交换。可能是由于WebKit + GTK3依赖性。

已在Ubuntu 16.04主机QEMU 2.5.0上进行测试。

网络冲浪

用支持fbdev的SDL编写:http : //www.netsurf-browser.org/about/screenshots/#framebuffer

fbdev是Linux内核模块提供的较低级别的接口,它不通过X11(我认为X11可以选择将其用作后端)。基本上,您只需要写入内存,它就会显示在屏幕上。

要在Ubuntu上使用fbdev,您必须处于TTY(例如Ctrl + Alt + F1)。

所以,你也许可以蒙混过关的图像的方式相比,绿的更小。

Buildroot 2016.05具有netsurf-buildsystem应提供的软件包,但我尚未测试。如果有人设法使其运行,请在指向.config,屏幕截图和图像大小的链接中进行编辑。


1

我曾经写过一个小bash脚本,它使用Arch Linux ISO并生成带有修改后的根映像的新ISO,该映像可以进行全自动安装。这包括分区以及使用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使得构建自定义可引导映像非常容易,其设计紧凑且具有强大的覆盖文件系统支持。

我应该能够在硬盘上dd

否-我建议您构建一个可引导的映像,您可以明智地对其进行维护-您建议的方法会回来并引起您的注意。


问题是,我将在拇指驱动器上运行操作系统。我什至没有安装操作系统的磁盘驱动器。
Naftuli Kay 2011年

0
  • 几个人提到了uzbl,我同意这是一个不错的选择-但您可能会觉得luakit更好。

  • 正如Caleb所述,您实际上并不需要任何窗口管理器。这是我精心设计的示例脚本,用于使用最大化的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
    

    luakit启动后,它使用xdotool最大化窗口。也许对此有更好的解决方案...

  • 对于这种系统的基础,我绝对会推荐Gentoo。这不仅是因为我最了解它;而且还因为它使用了一种相当独特的方法来全局管理所有已安装软件的构建时选项。我的意思是USE标志。使用这些,您可以确定支持它们的所有程序所使用的功能/库/标准的集合-例如,如果您希望您的程序使用ALSA且不需要诸如esd,jack或pulseaudio之类的其他音频后端,则放在alsa -jack -esd -pulseaudio您的USE标志中。之后,您构建的每个软件都可以使用ALSA以外的其他音频后端时,将不支持这些后端。由于这是在配置/构建级别上发生的,因此最终会获得精简的软件。因此,这是一种建立(同时尊重所有依赖关系)而不是精简(这最终可能会导致错误并且很难维护)的理念。


0

我会提到这一点,因为我很惊讶没有其他人。

Scratch的Linux是一本书(pdf),它引导您逐步创建自己的Linux发行版。对于您要完成的工作来说,这可能是过大的选择(实际上,它看起来像您已经拥有所需的工具),但是对于了解系统的工作方式,它可以证明是非常宝贵的工具。其实并不难,并且不涉及任何编程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.