SDB:KIWI Cookbook Kiosk System

跳转到:导航搜索


使用最小GNOME示例作为基础,进行适当的修改,以创建一个可用于Web kiosk的镜像。
Icon-checked.png
此过程至少在 Kiwi 版本 3.25 ( kiwi --version ) 上进行了测试 - 较旧的版本不支持所有显示的功能 版本


创建Web Kiosk镜像

在此示例中,我们将结合之前讨论的各种主题来创建一个功能更强的镜像。虽然该示例不会产生一个完全可用的Web kiosk(需要进行一些额外的定制和加固),但创建的镜像非常接近可部署的系统。

创建Web Kiosk镜像

准备时间

  • 45 分钟

烹饪时间

  • 20 分钟

配料

  • 正在运行的 openSUSE 11.1 或 11.2 系统
  • openSUSE 11.1 或 11.2 仓库
  • 已安装最新版本的 KIWI 工具集(至少版本 3.93)
  • 已安装 kiwi-doc 包
  • 大约 1 GB 的可用磁盘空间


该示例使用位于 /usr/share/doc/packages/kiwi/examples/suse-11.x/suse-min-gnome 的 suse-min-gnome 示例作为起点。从那里我们将进行一些重要的修改来实现我们的目标。

创建KIWI配置文件树

如上所述,我们将使用在 Live_USB-Stick Recipe 中讨论的 suse-min-gnome 示例作为基线。因此,配置树的初始创建只是一个简单的复制。

cp -r /usr/share/doc/packages/kiwi/examples/suse-11.2/suse-min-gnome /tmp/web-kiosk
如果您正在使用 openSUSE 11.1,请使用 openSUSE 11.1 suse-min-gnome 示例。在 openSUSE 11.1 和 openSUSE 11.2 上工作之间的区别在于 X-server 的配置。在 openSUSE 11.2 中,X-Server 使用自动配置,因此根树中没有 boot.local 叠加文件。

修改config.sh

首先,我们将修改 config.sh 文件以满足我们的需求。使用您喜欢的编辑器编辑 /tmp/web-kiosk/config.sh 并进行以下修改

  1. 在文件的“services 部分”中添加
    1. suseInsertService sshd
  2. 在 SUSEConfig 部分添加
    1. baseUpdateSysConfig /etc/sysconfig/displaymanager DISPLAYMANAGER_AUTOLOGIN kioskuser
    2. baseDisableCtrlAltDel

我们需要启动 ssh 服务,以便在系统启动并运行后能够远程访问系统,因为无法从正在运行的镜像访问终端。我们还在配置用户 *kioskuser* 进行自动登录,并且调用 *baseDisableCtrlAltDel* 函数禁用了 Ctrl-Alt-Delete 键序列,即我们正在禁用来自键盘的强制重启。

进行这些更改后,新的 config.sh 文件应如下所示

#!/bin/bash
#================
# FILE          : config.sh
#----------------
# PROJECT       : OpenSuSE KIWI Image System
# COPYRIGHT     : (c) 2006 SUSE LINUX Products GmbH. All rights reserved
#               :
# AUTHOR        : Marcus Schaefer <ms@suse.de>
#               :
# BELONGS TO    : Operating System images
#               :
# DESCRIPTION   : configuration script for SUSE based
#               : operating systems
#               :
#               :
# STATUS        : BETA
#----------------
#======================================
# Functions...
#--------------------------------------
test -f /.kconfig && . /.kconfig
test -f /.profile && . /.profile

#======================================
# Greeting...
#--------------------------------------
echo "Configure image: [$kiwi_iname]..."

#======================================
# Activate services
#--------------------------------------
suseActivateDefaultServices
suseInsertService boot.device-mapper
suseInsertService sshd

#======================================
# SuSEconfig
#--------------------------------------
baseUpdateSysConfig /etc/sysconfig/displaymanager DISPLAYMANAGER_AUTOLOGIN kioskuser
baseUpdateSysConfig /etc/sysconfig/displaymanager DISPLAYMANAGER gdm
baseUpdateSysConfig /etc/sysconfig/windowmanager DEFAULT_WM gnome
baseDisableCtrlAltDel
baseSetRunlevel 5
suseConfig

#======================================
# Umount kernel filesystems
#--------------------------------------
baseCleanMount

exit 0

修改config.xml

现在我们将修改 config.xml 文件以对我们的Web kiosk进行适当的更改。编辑 /tmp/web-kiosk/config.xml 并应用以下更改

  • 更改镜像的 *name* 属性
    • <image schemaversion="3.8" name="suse-11.2-web-kiosk-demo">
  • 更改 specification 元素的值
    • <specification>openSUSE 11.2 Web kiosk appliance</specification>
  • 删除 iso 镜像类型
    • <type boot="isoboot/suse-11.2" flags="unified">iso</type>
  • 添加带有 USB 格式的 OEM 镜像类型
    • <type filesystem="ext3" boot="oemboot/suse-11.2" format="usb">oem</type>
  • 将用户 tux 更改为 kioskuser
    • <user pwd="$1$wYJUgpM5$RXMMeASDc035eX.NbYWFl0" home="/home/kioskuser" name="kioskuser"/>
  • 删除拉取 gnome-applets、Perl 和 Python 的行
    • <package name="gnome-applets"/>
    • <package name="perl"/>
    • <package name="python"/>

考虑到Web kiosk硬件可能没有用于安装的光驱,我们通过添加带有 USB 格式的 OEM 类型来创建一个可自我安装的镜像。

OEM 镜像是一个虚拟磁盘镜像,代表所有分区和引导加载程序信息,就像在真实磁盘上一样。然后可以使用 dd 命令将此镜像转储到物理存储器上。通过指定 format 属性,我们指示 kiwi 以适合 USB 驱动器的方式创建此 OEM 镜像,然后可以使用它来安装磁盘镜像。结果是一个 USB 驱动器,当用作引导设备时,将安装我们的 kiosk 镜像到目标机器上。在此过程中,目标安装设备上的所有数据都将丢失。有关 OEM 镜像类型的更多信息,请参阅安装在 kiwi-doc 包中或在线版本中找到的 /usr/share/doc/packages/kiwi/kiwi.pdf 中的 KIWI Image System Cookbook 此处

该配置还描述了我们将用于测试目的的 VMware 镜像类型。

应用更改后,您的配置文件应如下所示

<?xml version="1.0" encoding="utf-8"?>
<image schemaversion="3.8" name="suse-11.2-web-kiosk-demo">
    <description type="system">
        <author>Robert Schweikert</author>
        <contact>rschweikert at novell dot com</contact>
        <specification>openSUSE 11.2 Web kiosk appliance</specification>
    </description>
    <preferences>
        <type primary="true" filesystem="ext3" boot="vmxboot/suse-11.2" format="vmdk">vmx</type>
        <type filesystem="ext3" boot="oemboot/suse-11.2" format="usb">oem</type>
        <version>1.0.1</version>
        <packagemanager>zypper</packagemanager>
        <rpm-check-signatures>false</rpm-check-signatures>
        <rpm-force>true</rpm-force>
        <locale>en_US</locale>
        <keytable>us.map.gz</keytable>
    </preferences>
    <users group="users">
        <user pwd="$1$wYJUgpM5$RXMMeASDc035eX.NbYWFl0" home="/home/kioskuser" name="kioskuser"/>
    </users>
    <users group="root">
        <user pwd="$1$wYJUgpM5$RXMMeASDc035eX.NbYWFl0" home="/root" name="root"/>
    </users>
    <repository type="yast2">
        <source path="opensuse://11.2/repo/oss/"/>
    </repository>
    <packages type="image" patternType="plusRecommended" patternPackageType="plusRecommended">
        <package name="bootsplash"/>
        <package name="bootsplash-branding-openSUSE" bootinclude="true" bootdelete="true"/>
        <package name="firefox"/>
        <package name="gdm"/>
        <package name="gfxboot-branding-openSUSE" bootinclude="true" bootdelete="true"/>
        <package name="ifplugd"/>
        <package name="iputils"/>
        <package name="kernel-default"/>
        <package name="preload"/>
        <package name="vim"/>
        <package name="xorg-x11-server"/>
        <opensusePattern name="base"/>
    </packages>
    <packages type="vmware">
    </packages>
    <vmwareconfig memory="1024">
        <vmwaredisk controller="ide" id="0"/>
    </vmwareconfig>
    <packages type="bootstrap">
        <package name="filesystem"/> 
        <package name="glibc-locale"/>
    </packages>
</image>
上述 config.xml 文件仅适用于 Kiwi 4.1 以下的版本。在 Kiwi 4.1 中引入了不兼容的更改,并且 config.xml 文件不再自动升级。因此,需要手动干预。

适用于Kiwi 4.1或更高版本的config.xml

<?xml version="1.0" encoding="utf-8"?>
<image schemaversion="4.1" name="suse-11.2-web-kiosk-demo">
        <description type="system">
        <author>Robert Schweikert</author>
        <contact>rschweikert at novell dot com</contact>
        <specification>openSUSE 11.2 Web kiosk appliance</specification>
    </description>
    <preferences>
        <type image="vmx" primary="true" filesystem="ext3" boot="vmxboot/suse-11.2" format="vmdk">
            <vmwareconfig memory="1024">
                <vmwaredisk controller="ide" id="0"/>
            </vmwareconfig>
        </type>
        <type image="oem" filesystem="ext3" boot="oemboot/suse-11.2" format="usb"/>
        <version>1.0.1</version>
        <packagemanager>zypper</packagemanager>
        <rpm-check-signatures>false</rpm-check-signatures>
        <rpm-force>true</rpm-force>
        <locale>en_US</locale>
        <keytable>us.map.gz</keytable>
    </preferences>
    <users group="users">
        <user pwd="$1$wYJUgpM5$RXMMeASDc035eX.NbYWFl0" home="/home/kioskuser" name="kioskuser"/>
    </users>
    <users group="root">
        <user pwd="$1$wYJUgpM5$RXMMeASDc035eX.NbYWFl0" home="/root" name="root"/>
    </users>
    <repository type="yast2">
        <source path="opensuse://11.2/repo/oss/"/>
    </repository>
    <packages type="image" patternType="plusRecommended" patternPackageType="plusRecommended">
        <package name="bootsplash"/>
        <package name="bootsplash-branding-openSUSE" bootinclude="true" bootdelete="true"/>
        <package name="firefox"/>
        <package name="gdm"/>
        <package name="gfxboot-branding-openSUSE" bootinclude="true" bootdelete="true"/>
        <package name="ifplugd"/>
        <package name="iputils"/>
        <package name="kernel-default"/>
        <package name="preload"/>
        <package name="sax2"/>
        <package name="vim"/>
        <package name="xorg-x11-server"/>
        <opensusePattern name="base"/>
    </packages>
    <packages type="vmware">
    </packages>
    <packages type="bootstrap">
        <package name="filesystem"/> 
        <package name="glibc-locale"/>
    </packages>
</image>

创建叠加文件

配置完文件和配置脚本后,现在是时候为我们的Web kiosk创建叠加文件了。

我们需要进一步锁定系统。我们希望禁用键盘快捷键,到目前为止,我们只禁用了 Ctrl-Alt-Delete,并且需要在启动时自动启动 Firefox。

禁用X-Server重启

禁用键盘强制的 X-Server 重启,即 Ctrl-Alt-Backspace 键组合,是通过 /etc/X11 中的 xorg.conf 文件完成的。如前所述,不同发行版版本之间存在差异。在 openSUSE 11.2 及更高版本中,X-Server 使用自动配置,而早期版本具有通过完整的 xorg.conf 文件进行的静态配置。

X-Server自动配置设置 (openSUSE 11.2及更高版本)

使用 X-server 自动配置,/etc/X11/xorg.conf 文件仍然会被解析,但是巧妙之处在于该文件不必完整。这意味着我们只需在文件中创建我们需要的部分,并将其余部分留给自动配置机制。

使用以下内容创建文件 /tmp/web-kiosk/root/etc/X11/xorg.conf

Section "ServerFlags"
  Option  "DontZap"      "yes"
  Option  "DontVTSwitch" "yes"
EndSection

这样,我们禁用了虚拟控制台和 Ctrl-Alt-Backspace 键序列。

X-server静态配置 (openSUSE 11.1及更早版本)

首先,让我们删除可能存在的任何默认配置。编辑 /tmp/web-kiosk/config.sh 并将 rm -f /etc/X11/xorg.conf 添加到 suseConfig 的调用之后。以下是显示新行的文件片段。

baseDisableCtrlAltDel
baseSetRunlevel 5
suseConfig

# Remove the default xorg.conf file
rm -f /etc/X11/xorg.conf

不用担心,我们将在系统最初启动时配置 X-server。下一步就是这样。编辑 /tmp/web-kiosk/root/etc/init.d/boot.local。如果您从 11.1 复制了 suse-min-gnome 示例,则该文件已经存在。我们将在此文件中插入一些 sed 魔术以获得所需的效果。以下显示了带有添加的 sed 命令的文件。

#! /bin/sh
#
# Copyright (c) 2009 Novell Inc.
#
# Author: Robert Schweikert <rschweikert@novell.com>
#

# Create the X-server configuration file if it does not yet exist
if [ ! -f /etc/X11/xorg.conf ]; then
    /usr/sbin/sax2 -c 0 -a -i &>/dev/null
    /usr/bin/sed -i 's/Section "ServerFlags"/Section \
      "ServerFlags"\n  Option "DontZap" "yes"\n  \
      Option "DontVTSwitch" "yes"/' /etc/X11/xorg.conf
注意您的换行符,您可能需要删除转义 (\) 字符并将所有内容放在一行上。插入换行符是为了让 wiki 看起来更漂亮。

GNOME设置

回到 11.x 基于发行版的统一性,欢呼吧。GNOME 行为通过配置树进行配置。对于用户自定义,此配置树位于 $HOME/.gconf。系统范围的配置位于 /etc/gconf/<some-directory>。我们感兴趣的更改是不能由任何人或通过用户界面更改的更改。因此,我们的配置更改最终出现在 gconf.xml.mandatory 中。有关 GNOME 配置,请参阅 Locking down GNOME in SUSE 11 based distributions。在 /tmp/web-kiosk/root/etc/gconf/gconf.xml.mandatory 中,我们希望创建以下树

./apps
./apps/%gconf.xml
./apps/metacity
./apps/metacity/%gconf.xml
./apps/metacity/general
./apps/metacity/general/%gconf.xml
./apps/metacity/global_keybindings
./apps/metacity/global_keybindings/%gconf.xml
./apps/metacity/keybinding_commands
./apps/metacity/keybinding_commands/%gconf.xml
./apps/nautilus
./apps/nautilus/%gconf.xml
./apps/nautilus/preferences
./apps/nautilus/preferences/%gconf.xml
./desktop
./desktop/%gconf.xml
./desktop/gnome
./desktop/gnome/%gconf.xml
./desktop/gnome/lockdown
./desktop/gnome/lockdown/%gconf.xml
./desktop/gnome/session
./desktop/gnome/session/%gconf.xml
./desktop/gnome/session/required_components
./desktop/gnome/session/required_components/%gconf.xml

以下命令将让我们开始

mkdir -p /tmp/web-kiosk/root/etc/gconf/gconf.xml.mandatory
cd /tmp/web-kiosk/root/etc/gconf/gconf.xml.mandatory
mkdir -p apps/metacity/{general,global_keybindings,keybinding_commands}
mkdir -p apps/nautilus/preferences
mkdir -p desktop/gnome/{lockdown,session}
mkdir desktop/gnome/session/required_components
touch apps/%gconf.xml
touch apps/metacity/%gconf.xml
touch apps/nautilus/%gconf.xml
touch desktop/%gconf.xml
touch desktop/gnome/%gconf.xml
touch desktop/gnome/session/%gconf.xml

接下来,我们需要创建非空的 %gconf.xml 文件。

编辑 apps/metacity/global_keybindings/%gconf.xml

在此文件中,我们禁用一些全局键绑定(如位置所示)。将以下内容添加到文件中。名称表示正在禁用的键绑定。

<?xml version="1.0"?>
<gconf>
    <entry name="cycle_panels" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="cycle_panels_backwards" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="panel_main_menu" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="panel_run_dialog" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="run_command_screenshot"  mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="run_command_window_screenshot"  mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="switch_group"  mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="switch_panels" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="switch_to_workspace_down" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="switch_to_workspace_left" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="switch_to_workspace_right" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
    <entry name="switch_to_workspace_up" mtime="1263563592" type="string">
        <stringvalue>disabled</stringvalue>
    </entry>
</gconf>
编辑 apps/metacity/keybinding_commands/%gconf.xml

在此文件中,设置在给定键绑定上执行的命令。由于我们希望锁定系统,因此清除所有命令。在文件中创建以下内容

<?xml version="1.0"?>
<gconf>
    <entry name="command_screenshot" mtime="1263563592" type="string">
        <stringvalue></stringvalue>
    </entry>
    <entry name="command_window_screenshot" mtime="1263563592" type="string">
        <stringvalue></stringvalue>
    </entry>
</gconf>
编辑 apps/nautilus/preferences/%gconf.xml

在此配置中,我们控制 nautilus 的行为,nautilus 不仅仅是 GNOME 中的文件浏览器,它还控制桌面的一部分。

<?xml version="1.0"?>
<gconf>
    <entry name="show_desktop" mtime="1263563592" type="bool" value="false" />
</gconf>

使用此设置,我们禁用与桌面显示混淆的 nautilus 功能。

编辑 desktop/gnome/lockdown/%gconf.xml

现在我们将设置一些 GNOME 全局选项。

<?xml version="1.0"?>
<gconf>
    <entry name="disable_command_line" mtime="1263563592" type="bool" value="true" />
    <entry name="disable_printing" mtime="1263563592" type="int" value="0" />
    <entry name="disable_print_setup" mtime="1263563592" type="bool" value="false"
 />
    <entry name="disable_user_switching" mtime="1263563592" type="bool" value="false" />
</gconf>
编辑 desktop/gnome/session/required_components/%gconf.xml

使用此文件,我们可以控制 GNOME 桌面启动时启动的 GNOME 组件。在我们的例子中,我们将禁用面板。

<gconf>
    <entry name="panel" mtime="1263563592" type="string">
        <stringvalue></stringvalue>
    </entry>
</gconf>

完成

锁定系统后,我们现在希望在系统启动时启动 Firefox,请记住,用户 kioskuser 已经根据我们在 config.sh 中的更改设置为自动登录。

让我们首先创建自动启动 Firefox 的设置。我们需要 autostart 目录和 .desktop 文件。

mkdir -p /tmp/web-kiosk/root/home/kioskuser/.config/autostart
cd /tmp/web-kiosk/root/home/kioskuser/.config/autostart

使用您喜欢的编辑器创建文件 firefox.desktop,内容如下。

[Desktop Entry]
Type=Application
Name=Firefox
Exec=firefox file:///home/kioskuser/kioskdemoHome.html
Icon=
Comment=

同时创建主页文件 /tmp/web-kiosk/root/home/kioskuser/kioskdemoHome.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>KIWI Kiosk Demo</title>
  </head>

    <h1>KIWI Kiosk Demo</h1>

    This is a placeholder page to demo the Kiosk set up. 
    Adding your own page here with a link to the Internet 
    will provide the Internet Kisok setup functionality.

    <p>
    For this demo the Firefox 
    <a href="https://addons.mozilla.org/en-US/firefox/addon/1659">Kiosk Mode plugin</a> 
    has been installed.

  </body>
</html>
您可以将 Firefox 指向任何 URL,如果您希望您的 Web kiosk 将 Google 搜索作为主页,只需在 .desktop 文件中添加 URL,而不是 kioskdemoHome.html 文件位置。

最后,我们需要处理 Firefox。有多种锁定 Firefox 的方法。一种相对简单的方法是使用 Kiosk Mode plugin。当然,问题是如何将插件放入 kioskuser 主目录?

简单直接的方法是在您的运行系统上创建一个新用户,以该用户身份登录,启动 Firefox 并安装插件。然后,以您的身份重新登录,并将 .mozilla 目录从系统上的新用户复制到 /tmp/web-kiosk/root/home/kioskuser。您可以在虚拟机中应用此技巧,如果您不想弄乱您的运行系统,可以使用此技巧。无论如何,想法都是一样的。

完成了。是时候构建和测试 Web kiosk 镜像了。

cd /tmp
kiwi --prepare ./web-kiosk --root /tmp/web-kiosk_unpacked
kiwi --create ./web-kiosk_unpacked -d /tmp/web-kiosk-img

这将创建配置为默认的 VMware 镜像。要创建可自我安装的 USB 驱动器镜像,请将 --type oem 命令行选项添加到 create 命令,如下所示

kiwi --create ./web-kiosk_unpacked -d /tmp/web-kiosk_img --type oem

创建 USB 镜像后,使用 dd 将其转储到驱动器上。

  1. 插入驱动器
  2. 使用 fdisk -l 确定驱动器的 dev
    1. 应该很明显,驱动器最终使用了哪个设备节点
  3. dd if=/tmp/web-kiosk_img/suse-11.2-web-kiosk-demo.x86_64-1.0.1.raw.install.raw of=/dev/<stick-node> bs=32k

然后可以使用 USB 驱动器启动任何系统并安装 Web kiosk 镜像。

之前注意的关于 64 位镜像的注意事项仍然适用