SDB:KIWI Cookbook Kiosk System
所有 KIWI 编辑
创建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 示例作为基线。因此,配置树的初始创建只是一个简单的复制。
修改config.sh
首先,我们将修改 config.sh 文件以满足我们的需求。使用您喜欢的编辑器编辑 /tmp/web-kiosk/config.sh 并进行以下修改
- 在文件的“services 部分”中添加
- suseInsertService sshd
- 在 SUSEConfig 部分添加
- baseUpdateSysConfig /etc/sysconfig/displaymanager DISPLAYMANAGER_AUTOLOGIN kioskuser
- 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>
适用于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
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
以下命令将让我们开始
接下来,我们需要创建非空的 %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 文件。
使用您喜欢的编辑器创建文件 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。有多种锁定 Firefox 的方法。一种相对简单的方法是使用 Kiosk Mode plugin。当然,问题是如何将插件放入 kioskuser 主目录?
简单直接的方法是在您的运行系统上创建一个新用户,以该用户身份登录,启动 Firefox 并安装插件。然后,以您的身份重新登录,并将 .mozilla 目录从系统上的新用户复制到 /tmp/web-kiosk/root/home/kioskuser。您可以在虚拟机中应用此技巧,如果您不想弄乱您的运行系统,可以使用此技巧。无论如何,想法都是一样的。
完成了。是时候构建和测试 Web kiosk 镜像了。
这将创建配置为默认的 VMware 镜像。要创建可自我安装的 USB 驱动器镜像,请将 --type oem 命令行选项添加到 create 命令,如下所示
创建 USB 镜像后,使用 dd 将其转储到驱动器上。
- 插入驱动器
- 使用 fdisk -l 确定驱动器的 dev
- 应该很明显,驱动器最终使用了哪个设备节点
- 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 镜像。