[ostree/wip/fedora] Experimental Fedora support



commit 0fdf25f3cc8f12fa7c70a56794d97965aec56b87
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Oct 28 09:36:06 2011 -0400

    Experimental Fedora support
    
    Experimental support for creating a gnomeos tree based
    on the F16 desktop spin.
    
    This is the result of playing with this for one evening,
    so don't expect wonders. It boots, but doesn't actually
    get to the login prompt.

 fedora/0001-Support-OSTree.patch |  149 +++++
 fedora/Makefile                  |    8 +
 fedora/chroot_break.c            |  117 ++++
 fedora/fedora-setup.sh           |   61 +++
 fedora/gnomeos-install.sh        |   41 ++
 fedora/gnomeos-make-image.sh     |  187 +++++++
 fedora/gnomeos-run.sh            |   48 ++
 fedora/ostree_switch_root.c      |  303 +++++++++++
 fedora/package-list              | 1104 ++++++++++++++++++++++++++++++++++++++
 9 files changed, 2018 insertions(+), 0 deletions(-)
---
diff --git a/fedora/0001-Support-OSTree.patch b/fedora/0001-Support-OSTree.patch
new file mode 100644
index 0000000..81fa4d4
--- /dev/null
+++ b/fedora/0001-Support-OSTree.patch
@@ -0,0 +1,149 @@
+From e9cb0f0c6ef13773c823610f27a562bd54b2acd3 Mon Sep 17 00:00:00 2001
+From: Colin Walters <walters verbum org>
+Date: Mon, 24 Oct 2011 22:01:17 -0400
+Subject: [PATCH] Support OSTree
+
+See http://git.gnome.org/browse/ostree
+---
+ modules.d/95rootfs-block/mount-root.sh |   12 ++++++------
+ modules.d/99base/init                  |   32 ++++++++++++++++++++++----------
+ 2 files changed, 28 insertions(+), 16 deletions(-)
+
+diff --git a/modules.d/95rootfs-block/mount-root.sh b/modules.d/95rootfs-block/mount-root.sh
+index 2c89431..4f411da 100755
+--- a/modules.d/95rootfs-block/mount-root.sh
++++ b/modules.d/95rootfs-block/mount-root.sh
+@@ -34,8 +34,8 @@ mount_root() {
+ 
+     READONLY=
+     fsckoptions=
+-    if [ -f "$NEWROOT"/etc/sysconfig/readonly-root ]; then
+-        . "$NEWROOT"/etc/sysconfig/readonly-root
++    if [ -f "$NEWROOT_PREFIX"/etc/sysconfig/readonly-root ]; then
++        . "$NEWROOT_PREFIX"/etc/sysconfig/readonly-root
+     fi
+ 
+     if getargbool 0 "readonlyroot=" -y readonlyroot; then
+@@ -57,7 +57,7 @@ mount_root() {
+     if [ -f "$NEWROOT"/forcefsck ] || getargbool 0 forcefsck ; then
+         fsckoptions="-f $fsckoptions"
+     elif [ -f "$NEWROOT"/.autofsck ]; then
+-        [ -f "$NEWROOT"/etc/sysconfig/autofsck ] && . "$NEWROOT"/etc/sysconfig/autofsck
++        [ -f "$NEWROOT_PREFIX"/etc/sysconfig/autofsck ] && . "$NEWROOT_PREFIX"/etc/sysconfig/autofsck
+         if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then
+             AUTOFSCK_OPT="$AUTOFSCK_OPT -f"
+         fi
+@@ -73,8 +73,8 @@ mount_root() {
+     rootopts=
+     if getargbool 1 rd.fstab -n rd_NO_FSTAB \
+         && ! getarg rootflags \
+-        && [ -f "$NEWROOT/etc/fstab" ] \
+-        && ! [ -L "$NEWROOT/etc/fstab" ]; then
++        && [ -f "$NEWROOT_PREFIX/etc/fstab" ] \
++        && ! [ -L "$NEWROOT_PREFIX/etc/fstab" ]; then
+         # if $NEWROOT/etc/fstab contains special mount options for
+         # the root filesystem,
+         # remount it with the proper options
+@@ -89,7 +89,7 @@ mount_root() {
+                 rootopts=$opts
+                 break
+             fi
+-        done < "$NEWROOT/etc/fstab"
++        done < "$NEWROOT_PREFIX/etc/fstab"
+ 
+         rootopts=$(filter_rootopts $rootopts)
+     fi
+diff --git a/modules.d/99base/init b/modules.d/99base/init
+index 36b2152..9636990 100755
+--- a/modules.d/99base/init
++++ b/modules.d/99base/init
+@@ -275,6 +275,13 @@ unset queuetriggered
+ unset main_loop
+ unset RDRETRY
+ 
++ostree=$(getarg ostree=)
++if test -n $ostree; then
++    NEWROOT_PREFIX=${NEWROOT}/ostree/$ostree
++else
++    NEWROOT_PREFIX=$NEWROOT
++fi
++
+ # pre-mount happens before we try to mount the root filesystem,
+ # and happens once.
+ getarg 'rd.break=pre-mount' 'rdbreak=pre-mount' && emergency_shell -n pre-mount "Break pre-mount"
+@@ -287,14 +294,15 @@ getarg 'rd.break=mount' 'rdbreak=mount' && emergency_shell -n mount "Break mount
+ i=0
+ while :; do
+     if ismounted "$NEWROOT"; then
+-        usable_root "$NEWROOT" && break;
++        echo "Checking usable $NEWROOT_PREFIX"
++        usable_root "$NEWROOT_PREFIX" && break;
+         umount "$NEWROOT"
+     fi
+     for f in $hookdir/mount/*.sh; do
+         [ -f "$f" ] && . "$f"
+         if ismounted "$NEWROOT"; then
+-            usable_root "$NEWROOT" && break;
+-            warn "$NEWROOT has no proper rootfs layout, ignoring and removing offending mount hook"
++            usable_root "$NEWROOT_PREFIX" && break;
++            warn "$NEWROOT_PREFIX has no proper rootfs layout, ignoring and removing offending mount hook"
+             umount "$NEWROOT"
+             rm -f "$f"
+         fi
+@@ -320,11 +328,11 @@ unset __usr_found
+ for i in "$(getarg real_init=)" "$(getarg init=)" /sbin/init /etc/init /init /bin/sh; do
+     [ -n "$i" ] || continue
+ 
+-    __p=$(readlink -m "$NEWROOT$i")
++    __p=$(readlink -m "$NEWROOT_PREFIX$i")
+     if [ -n "$__p" ] \
+         && [ "x$__usr_found" = "x" ] \
+         && [ ! -x "$__p" ] \
+-        && strstr "$__p" "$NEWROOT/usr" \
++        && strstr "$__p" "$NEWROOT_PREFIX/usr" \
+         ; then
+         # we have to mount /usr
+         while read dev mp fs opts rest; do
+@@ -333,14 +341,14 @@ for i in "$(getarg real_init=)" "$(getarg init=)" /sbin/init /etc/init /init /bi
+                 __usr_found="1"
+                 break
+             fi
+-        done < "$NEWROOT/etc/fstab" >> /etc/fstab
++        done < "$NEWROOT_PREFIX/etc/fstab" >> /etc/fstab
+         if [ "x$__usr_found" != "x" ]; then
+             info "Mounting /usr"
+-            mount "$NEWROOT/usr" 2>&1 | vinfo
++            mount "$NEWROOT_PREFIX/usr" 2>&1 | vinfo
+         fi
+     fi
+ 
+-    __p=$(readlink -f "$NEWROOT$i")
++    __p=$(readlink -f "$NEWROOT_PREFIX$i")
+     if [ -x "$__p" ]; then
+         INIT="$i"
+         break
+@@ -445,7 +453,11 @@ info "Switching root"
+ unset PS4
+ 
+ CAPSH=$(command -v capsh)
+-SWITCH_ROOT=$(command -v switch_root)
++if test -n "${ostree}"; then
++    SWITCH_ROOT=$(command -v ostree_switch_root)
++else
++    SWITCH_ROOT=$(command -v switch_root)
++fi
+ PATH=$OLDPATH
+ export PATH
+ 
+@@ -463,7 +475,7 @@ if [ -f /etc/capsdrop ]; then
+     }
+ else
+     unset RD_DEBUG
+-    exec $SWITCH_ROOT "$NEWROOT" "$INIT" $initargs || {
++    exec $SWITCH_ROOT "$NEWROOT" $ostree "$INIT" $initargs || {
+ 	warn "Something went very badly wrong in the initramfs.  Please "
+ 	warn "file a bug against dracut."
+ 	emergency_shell
+-- 
+1.7.6.4
+
diff --git a/fedora/Makefile b/fedora/Makefile
new file mode 100644
index 0000000..97ec6c0
--- /dev/null
+++ b/fedora/Makefile
@@ -0,0 +1,8 @@
+
+all: ostree_switch_root chroot_break
+
+ostree_switch_root: ostree_switch_root.c Makefile
+	gcc -Wall -o $@ $<
+
+chroot_break: chroot_break.c Makefile
+	gcc -Wall -o $@ $<
diff --git a/fedora/chroot_break.c b/fedora/chroot_break.c
new file mode 100644
index 0000000..2a34716
--- /dev/null
+++ b/fedora/chroot_break.c
@@ -0,0 +1,117 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * chroot_break: Exit out of active chroot(2) if any.  Requires root privileges.
+ *
+ * Copyright (C) 2011 Colin Walters <walters verbum org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int
+usage (const char *self,
+       int         ecode)
+{
+  fprintf (stderr, "usage: %s PROGRAM [ARGS...]\n", self);
+
+  return ecode;
+}
+
+int
+main (int  argc,
+      char **argv)
+{
+  const char *template = "/tmp/chroot.XXXXXX";
+  char *tmpdir;
+  DIR *tmp;
+  struct stat current;
+  struct stat up;
+
+  if (argc < 2)
+    return usage (argv[0], 1);
+
+  tmpdir = strdup (template);
+  if (!mkdtemp (tmpdir))
+    {
+      perror ("mkdtemp");
+      return 1;
+    }
+
+  tmp = opendir ("/tmp");
+  if (!tmp)
+    {
+      perror ("opening /tmp");
+      return 1;
+    }
+
+  if (chroot (tmpdir) < 0)
+    {
+      perror ("chroot into tempdir");
+      return 1;
+    }
+
+  do 
+    {
+      if (stat (".", &current) < 0)
+	{
+	  perror ("stat");
+	  return 1;
+	}
+      if (stat ("..", &up) < 0)
+	{
+	  perror ("stat");
+	  return 1;
+	}
+      if (current.st_dev == up.st_dev
+	  && current.st_ino == up.st_ino)
+	break;
+      if (chdir ("..") < 0)
+	{
+	  perror ("chdir");
+	  return 1;
+	}
+    } while (1);
+
+  if (chroot (".") < 0)
+    {
+      perror ("chroot into real root");
+      return 1;
+    }
+
+  if (unlinkat (dirfd (tmp), strrchr (tmpdir, '/') + 1, AT_REMOVEDIR) < 0)
+    {
+      perror ("cleaning up tmpdir");
+      return 1;
+    }
+
+  closedir (tmp);
+
+  if (execv (argv[1], &argv[1]) < 0)
+    {
+      perror ("Running child process");
+      return 1;
+    }
+  /* Should not be reached */
+  return 1;
+}
diff --git a/fedora/fedora-setup.sh b/fedora/fedora-setup.sh
new file mode 100755
index 0000000..9dd07a7
--- /dev/null
+++ b/fedora/fedora-setup.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+# This script sets up things we want to ship with the OS tree.  It should
+# NOT set up caches.  For example, do NOT run ldconfig in here.
+
+set -e
+set -x
+
+echo gnomeos > /etc/hostname
+
+cat > /etc/locale.conf <<EOF
+LANG="en_US.UTF-8"
+EOF
+
+chpasswd <<EOF
+root:root
+EOF
+
+# dbus
+groupadd -r -g 81 dbus || :
+useradd -u 81 -g 81 -s /sbin/nologin -r -d '/' dbus || :
+
+# util-linux
+rm -f /etc/mtab
+ln -s /proc/mounts /etc/mtab
+
+# initscripts
+groupadd -g 22 -r -f utmp || :
+# touch /var/log/wtmp /var/run/utmp /var/log/btmp
+# chown root:utmp /var/log/wtmp /var/run/utmp /var/log/btmp
+# chmod 664 /var/log/wtmp /var/run/utmp
+# chmod 600 /var/log/btmp
+
+# usbmuxd
+groupadd -r usbmuxd -g 113 || :
+useradd -r -g usbmuxd -d / -s /sbin/nologin -u 113 usbmuxd || :
+
+# pa
+groupadd -f -r pulse || :
+useradd -r -s /sbin/nologin -d /var/run/pulse -g pulse pulse || :
+
+# gdm
+useradd -M -u 42 -d /var/lib/gdm -s /sbin/nologin -r gdm || :
+usermod -d /var/lib/gdm -s /sbin/nologin gdm || :
+
+# rtkit
+groupadd -r -g 172 rtkit || :
+useradd -r -l -u 172 -g rtkit -d /proc -s /sbin/nologin rtkit || :
+
+# avahi
+groupadd -r -g 70 avahi || :
+useradd -r -l -u 70 -g avahi -d /var/run/avahi-daemon -s /sbin/nologin avahi || :
+
+# NetworkManager-openconnect
+groupadd -r nm-openconnect || :
+useradd  -r -s /sbin/nologin -d / -M -g nm-openconnect nm-openconnect || :
+
+# /etc/fstab ?
+# /etc/machine-id ?
+
+# create users and groups
+# groups: dialout floppy cdrom tape
diff --git a/fedora/gnomeos-install.sh b/fedora/gnomeos-install.sh
new file mode 100755
index 0000000..24752df
--- /dev/null
+++ b/fedora/gnomeos-install.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+# -*- indent-tabs-mode: nil; -*-
+# Install built ostree image to current system
+#
+# Copyright (C) 2011 Colin Walters <walters verbum org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+set -e
+set -x
+
+SRCDIR=`dirname $0`
+WORKDIR=`pwd`
+
+OBJ=gnomeos-initrd.img
+if ! test -f ${OBJ}; then
+    echo "Error: couldn't find '$OBJ'. Run gnomeos-make-image.sh"
+    exit 1
+fi
+
+if test -d /ostree; then
+    echo "/ostree already exists"
+    exit 1
+fi
+
+cp -a gnomeos-fs/ostree /
+initrd=`readlink gnomeos-initrd.img`
+cp ${initrd} /boot
+grubby --title "GNOME OS" --add-kernel=$kernel --copy-default --initrd=/boot/${initrd}
diff --git a/fedora/gnomeos-make-image.sh b/fedora/gnomeos-make-image.sh
new file mode 100755
index 0000000..e5dc687
--- /dev/null
+++ b/fedora/gnomeos-make-image.sh
@@ -0,0 +1,187 @@
+#!/bin/sh
+# -*- indent-tabs-mode: nil; -*-
+# Generate a root filesystem image
+#
+# Copyright (C) 2011 Colin Walters <walters verbum org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+set -e
+set -x
+
+SRCDIR=`dirname $0`
+WORKDIR=`pwd`
+
+DEPENDS="yumdownloader rpm2cpio cpio qemu-img grubby"
+
+for x in $DEPENDS; do
+    if ! command -v $x; then
+        cat <<EOF
+Couldn't find required dependency $x
+EOF
+        exit 1
+    fi
+done
+
+if test $(id -u) != 0; then
+    cat <<EOF
+This script must be run as root.
+EOF
+    exit 1
+fi
+
+if test -z "${OSTREE}"; then
+    OSTREE=`command -v ostree || true`
+fi
+if test -z "${OSTREE}"; then
+    cat <<EOF
+ERROR:
+Couldn't find ostree; you can set the OSTREE environment variable to point to it
+e.g.: OSTREE=~user/checkout/ostree/ostree $0
+EOF
+    exit 1
+fi
+
+if test -z "$DRACUT"; then
+    if ! test -d dracut; then
+        cat <<EOF
+Checking out and patching dracut...
+EOF
+        git clone git://git.kernel.org/pub/scm/boot/dracut/dracut.git
+        (cd dracut; git am $SRCDIR/0001-Support-OSTree.patch)
+        (cd dracut; make)
+    fi
+    DRACUT=`pwd`/dracut/dracut
+fi
+
+case `uname -p` in
+    x86_64)
+        ARCH=amd64
+        ;;
+    *)
+        echo "Unsupported architecture"
+        ;;
+esac;
+
+FEDTARGET=f16
+
+INITRD_MOVE_MOUNTS="dev proc sys"
+TOPROOT_BIND_MOUNTS="boot home root tmp"
+OSTREE_BIND_MOUNTS="var"
+MOVE_MOUNTS="selinux mnt media"
+READONLY_BIND_MOUNTS="bin etc lib lib32 lib64 sbin usr"
+
+OBJ=$FEDTARGET-pkgs
+if ! test -d ${OBJ} ; then
+    echo "Creating ${OBJ}"
+    mkdir -p ${OBJ}.tmp
+    for p in `cat ${SRCDIR}/package-list`; do
+      yumdownloader --destdir ${OBJ}.tmp $p
+    done
+    mv ${OBJ}.tmp ${OBJ}
+fi
+
+OBJ=$FEDTARGET-fs
+if ! test -d ${OBJ}; then
+    if false; then
+    rm -rf ${OBJ}.tmp
+    mkdir ${OBJ}.tmp
+
+    (cd ${OBJ}.tmp;
+        for p in ../$FEDTARGET-pkgs/*.rpm; do
+            rpm2cpio $p | cpio -dium --no-absolute-filenames
+        done
+    )
+    fi
+
+    (cd ${OBJ}.tmp;
+     if false; then
+        mkdir ostree
+        mkdir ostree/repo
+        mkdir ostree/gnomeos-origin
+        for d in $INITRD_MOVE_MOUNTS $TOPROOT_BIND_MOUNTS; do
+            mkdir -p ostree/gnomeos-origin/$d
+            chmod --reference $d ostree/gnomeos-origin/$d
+        done
+        for d in $OSTREE_BIND_MOUNTS; do
+            mkdir -p ostree/gnomeos-origin/$d
+            chmod --reference $d ostree/gnomeos-origin/$d
+            mv $d ostree
+        done
+        for d in $READONLY_BIND_MOUNTS $MOVE_MOUNTS; do
+            if test -d $d; then
+                mv $d ostree/gnomeos-origin
+            fi
+        done
+     fi
+
+        $OSTREE init --repo=ostree/repo
+        (cd ostree/gnomeos-origin; find . '!' -type p | grep -v '^.$' | $OSTREE commit -s 'Initial import' --repo=../repo --from-stdin)
+    )
+    if test -d ${OBJ}; then
+        mv ${OBJ} ${OBJ}.old
+    fi
+    mv ${OBJ}.tmp ${OBJ}
+    rm -rf ${OBJ}.old
+fi
+
+# TODO download source for above
+# TODO download build dependencies for above
+
+OBJ=gnomeos-fs
+if ! test -d ${OBJ}; then
+    rm -rf ${OBJ}.tmp
+    cp -al $FEDTARGET-fs ${OBJ}.tmp
+    (cd ${OBJ}.tmp;
+
+        cp ${SRCDIR}/fedora-setup.sh ostree/gnomeos-origin/
+        chroot ostree/gnomeos-origin ./fedora-setup.sh
+        rm ostree/gnomeos-origin/fedora-setup.sh
+        (cd ostree/gnomeos-origin; find . '!' -type p | grep -v '^.$' | $OSTREE commit -s 'Run fedora-setup.sh' --repo=../repo --from-stdin)
+
+        cp -p ${SRCDIR}/chroot_break ostree/gnomeos-origin/sbin/chroot_break
+        (cd ostree/gnomeos-origin; $OSTREE commit -s 'Add chroot_break' --repo=../repo --add=sbin/chroot_break)
+
+        (cd ostree;
+            rev=`cat repo/HEAD`
+            $OSTREE checkout --repo=repo HEAD gnomeos-${rev}
+            $OSTREE run-triggers --repo=repo gnomeos-${rev}
+            ln -s gnomeos-${rev} current)
+    )
+    if test -d ${OBJ}; then
+        mv ${OBJ} ${OBJ}.old
+    fi
+    mv ${OBJ}.tmp ${OBJ}
+    rm -rf ${OBJ}.old
+fi
+
+cp ${SRCDIR}/ostree_switch_root ${WORKDIR}
+
+kv=`uname -r`
+kernel=/boot/vmlinuz-${kv}
+if ! test -f "${kernel}"; then
+    cat <<EOF
+Failed to find ${kernel}
+EOF
+fi
+
+OBJ=gnomeos-initrd.img
+VOBJ=gnomeos-initrd-${kv}.img
+if ! test -f ${OBJ}; then
+    rm -f ${OBJ}.tmp ${VOBJ}.tmp
+    $DRACUT -l -v --include `pwd`/ostree_switch_root /sbin/ostree_switch_root ${VOBJ}.tmp
+    mv ${VOBJ}.tmp ${VOBJ}
+    ln -sf ${VOBJ} gnomeos-initrd.img
+fi
diff --git a/fedora/gnomeos-run.sh b/fedora/gnomeos-run.sh
new file mode 100755
index 0000000..73fb6bf
--- /dev/null
+++ b/fedora/gnomeos-run.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+# -*- indent-tabs-mode: nil; -*-
+# Run built image in QEMU 
+#
+# Copyright (C) 2011 Colin Walters <walters verbum org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+set -e
+set -x
+
+SRCDIR=`dirname $0`
+WORKDIR=`pwd`
+
+if ! test -d gnomeos-fs; then
+    echo "Error: couldn't find gnomeos-fs. Run gnomeos-make-image.sh"
+    exit 1
+fi
+
+OBJ=gnomeos-fs.img
+if (! test -f ${OBJ}) || test gnomeos-fs -nt ${OBJ}; then
+    rm -f ${OBJ}.tmp
+    qemu-img create ${OBJ}.tmp 4G
+    mkfs.ext4 -q -F ${OBJ}.tmp
+    mkdir -p fs
+    umount fs || true
+    mount -o loop ${OBJ}.tmp fs
+    cp -a gnomeos-fs/* fs
+    umount fs
+    mv ${OBJ}.tmp ${OBJ}
+fi
+
+kv=`uname -r`
+kernel=/boot/vmlinuz-${kv}
+
+exec qemu-kvm -m 768 -kernel ${kernel} -initrd gnomeos-initrd.img -hda gnomeos-fs.img -append "root=/dev/sda rd_NO_PLYMOUTH ostree=current"
diff --git a/fedora/ostree_switch_root.c b/fedora/ostree_switch_root.c
new file mode 100644
index 0000000..fb750f2
--- /dev/null
+++ b/fedora/ostree_switch_root.c
@@ -0,0 +1,303 @@
+/* -*- c-file-style: "linux" -*-
+ * ostree_switch_root.c - switch to new root directory and start init.
+ * Copyright 2011 Colin Walters <walters verbum org>
+ *
+ * Based of switch_root.c from util-linux.
+ * Copyright 2002-2009 Red Hat, Inc.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ *	Peter Jones <pjones redhat com>
+ *	Jeremy Katz <katzj redhat com>
+ *	Colin Walters <walters verbum org>
+ */
+#define _GNU_SOURCE
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <dirent.h>
+
+static int
+perrorv (const char *format, ...) __attribute__ ((format (printf, 1, 2)));
+
+static int
+perrorv (const char *format, ...)
+{
+	va_list args;
+	char buf[PATH_MAX];
+	char *p;
+
+	p = strerror_r (errno, buf, sizeof (buf));
+
+	va_start (args, format);
+
+	vfprintf (stderr, format, args);
+	fprintf (stderr, ": %s\n", p);
+	fflush (stderr);
+
+	va_end (args);
+
+	sleep (3);
+	
+	return 0;
+}
+
+/* remove all files/directories below dirName -- don't cross mountpoints */
+static int recursiveRemove(int fd)
+{
+	struct stat rb;
+	DIR *dir;
+	int rc = -1;
+	int dfd;
+
+	if (!(dir = fdopendir(fd))) {
+		perrorv("failed to open directory");
+		goto done;
+	}
+
+	/* fdopendir() precludes us from continuing to use the input fd */
+	dfd = dirfd(dir);
+
+	if (fstat(dfd, &rb)) {
+		perrorv("failed to stat directory");
+		goto done;
+	}
+
+	while(1) {
+		struct dirent *d;
+
+		errno = 0;
+		if (!(d = readdir(dir))) {
+			if (errno) {
+				perrorv("failed to read directory");
+				goto done;
+			}
+			break;	/* end of directory */
+		}
+
+		if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+			continue;
+
+		if (d->d_type == DT_DIR) {
+			struct stat sb;
+
+			if (fstatat(dfd, d->d_name, &sb, AT_SYMLINK_NOFOLLOW)) {
+				perrorv("failed to stat %s", d->d_name);
+				continue;
+			}
+
+			/* remove subdirectories if device is same as dir */
+			if (sb.st_dev == rb.st_dev) {
+				int cfd;
+
+				cfd = openat(dfd, d->d_name, O_RDONLY);
+				if (cfd >= 0) {
+					recursiveRemove(cfd);
+					close(cfd);
+				}
+			} else
+				continue;
+		}
+
+		if (unlinkat(dfd, d->d_name,
+			     d->d_type == DT_DIR ? AT_REMOVEDIR : 0))
+			perrorv("failed to unlink %s", d->d_name);
+	}
+
+	rc = 0;	/* success */
+
+done:
+	if (dir)
+		closedir(dir);
+	return rc;
+}
+
+static int make_readonly(const char *tree)
+{
+	struct stat stbuf;
+	/* Ignore nonexistent directories for now;
+	 * some installs won't have e.g. lib64
+	 */
+	if (stat (tree, &stbuf) < 0)
+		return 0;
+	if (mount(tree, tree, NULL, MS_BIND, NULL) < 0) {
+		perrorv("Failed to do initial RO bind mount %s", tree);
+		return -1;
+	}
+	if (mount(tree, tree, NULL, MS_BIND | MS_REMOUNT | MS_RDONLY, NULL) < 0) {
+		perrorv("Failed to remount RO bind mount %s", tree);
+		return -1;
+	}
+	return 0;
+}
+
+
+static int switchroot(const char *newroot, const char *subroot)
+{
+	const char *initrd_move_mounts[] = { "/dev", "/proc", "/sys", NULL };
+	const char *toproot_bind_mounts[] = { "/boot", "/home", "/root", "/tmp", NULL };
+	const char *ostree_bind_mounts[] = { "/var", NULL };
+	const char *readonly_bind_mounts[] = { "/bin", "/etc", "/lib",
+					       "/lib32", "/lib64", "/sbin",
+					       "/usr",
+					       NULL };
+	int i;
+	int orig_cfd;
+	int new_cfd;
+	int subroot_cfd;
+	pid_t pid;
+	char subroot_path[PATH_MAX];
+	char srcpath[PATH_MAX];
+	char destpath[PATH_MAX];
+
+	fprintf (stderr, "switching to root %s subroot: %s\n", newroot, subroot);
+
+	orig_cfd = open("/", O_RDONLY);
+	new_cfd = open(newroot, O_RDONLY);
+
+	/* For now just remount the rootfs r/w.  Should definitely
+	 * handle this better later... (famous last words)
+	 */
+	if (mount(newroot, newroot, NULL, MS_REMOUNT, NULL) < 0) {
+		perrorv("failed to remount %s read/write", newroot);
+		return -1;
+	}
+
+	snprintf(subroot_path, sizeof(subroot_path), "%s/ostree/%s", newroot, subroot);
+	subroot_cfd = open(subroot_path, O_RDONLY);
+	if (subroot_cfd < 0) {
+		perrorv("failed to open subroot %s", subroot_path);
+		return -1;
+	}
+
+	for (i = 0; initrd_move_mounts[i] != NULL; i++) {
+		snprintf(destpath, sizeof(destpath), "%s%s", subroot_path, initrd_move_mounts[i]);
+
+		if (mount(initrd_move_mounts[i], destpath, NULL, MS_MOVE, NULL) < 0) {
+			perrorv("failed to move initramfs mount %s to %s",
+				initrd_move_mounts[i], destpath);
+			umount2(initrd_move_mounts[i], MNT_FORCE);
+		}
+	}
+
+	for (i = 0; toproot_bind_mounts[i] != NULL; i++) {
+		snprintf(srcpath, sizeof(srcpath), "%s%s", newroot, toproot_bind_mounts[i]);
+		snprintf(destpath, sizeof(destpath), "%s/%s", subroot_path, toproot_bind_mounts[i]);
+		if (mount(srcpath, destpath, NULL, MS_BIND & ~MS_RDONLY, NULL) < 0) {
+			perrorv("failed to bind mount (class:toproot) %s to %s", srcpath, destpath);
+			return -1;
+		}
+	}
+
+	for (i = 0; ostree_bind_mounts[i] != NULL; i++) {
+		snprintf(srcpath, sizeof(srcpath), "%s/ostree%s", newroot, ostree_bind_mounts[i]);
+		snprintf(destpath, sizeof(destpath), "%s%s", subroot_path, ostree_bind_mounts[i]);
+		if (mount(srcpath, destpath, NULL, MS_BIND & ~MS_RDONLY, NULL) < 0) {
+			perrorv("failed to bind mount (class:bind) %s to %s", srcpath, destpath);
+			return -1;
+		}
+	}
+
+	if (chdir(newroot)) {
+		perrorv("failed to change directory to %s", newroot);
+		return -1;
+	}
+
+	if (mount(newroot, "/", NULL, MS_MOVE, NULL) < 0) {
+		perrorv("failed to mount moving %s to /", newroot);
+		return -1;
+	}
+
+	if (fchdir (new_cfd) < 0) {
+		perrorv("failed to fchdir back to root");
+		return -1;
+	}
+
+	snprintf(destpath, sizeof(destpath), "ostree/%s", subroot);
+	if (chroot(destpath) < 0) {
+		perrorv("failed to change root to %s", destpath);
+		return -1;
+	}
+
+	if (chdir ("/") < 0) {
+		perrorv("failed to chdir to subroot");
+		return -1;
+	}
+
+	for (i = 0; readonly_bind_mounts[i] != NULL; i++) {
+		if (make_readonly(readonly_bind_mounts[i]) < 0) {
+			return -1;
+		}
+	}
+
+	if (orig_cfd >= 0) {
+		pid = fork();
+		if (pid <= 0) {
+			recursiveRemove(orig_cfd);
+			if (pid == 0)
+				exit(EXIT_SUCCESS);
+		}
+		close(orig_cfd);
+	}
+	close(new_cfd);
+	return 0;
+}
+
+static void usage(FILE *output)
+{
+	fprintf(output, "usage: %s <newrootdir> <init> <args to init>\n",
+			program_invocation_short_name);
+	exit(output == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+
+int main(int argc, char *argv[])
+{
+	char *newroot, *subroot, *init, **initargs;
+
+	fflush (stderr);
+	if (argc < 4)
+		usage(stderr);
+
+	if ((!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")))
+		usage(stdout);
+
+	newroot = argv[1];
+	subroot = argv[2];
+	init = argv[3];
+	initargs = &argv[3];
+
+	if (!*newroot || !*subroot || !*init)
+		usage(stderr);
+
+	if (switchroot(newroot, subroot))
+		exit(1);
+
+	if (access(init, X_OK))
+		perrorv("cannot access %s", init);
+
+	execv(init, initargs);
+	perrorv("Failed to exec init '%s'", init);
+	exit(1);
+}
+
diff --git a/fedora/package-list b/fedora/package-list
new file mode 100644
index 0000000..72fa85b
--- /dev/null
+++ b/fedora/package-list
@@ -0,0 +1,1104 @@
+telepathy-butterfly
+tmpwatch
+bash-completion
+paps-libs
+ca-certificates
+telepathy-salut
+gstreamer
+policycoreutils-restorecond
+pbm2l7k
+bind-license
+pptp
+elfutils-libs
+lsof
+mingetty
+un-core-fonts-common
+xorg-x11-drv-penmount
+libXxf86dga
+lohit-punjabi-fonts
+libcdaudio
+adwaita-gtk2-theme
+xorg-x11-drv-dummy
+dvb-apps
+wqy-zenhei-fonts
+libkate
+libsepol
+xorg-x11-drv-cirrus
+ibus-pinyin-db-android
+liberation-sans-fonts
+gtk2
+libxml2
+xorg-x11-drv-mouse
+libcdio
+talk
+libglade2
+audit-libs
+xorg-x11-drv-nv
+dirac-libs
+ethtool
+iok
+libgpg-error
+xorg-x11-drv-vmware
+psutils
+iwl3945-firmware
+python-virtkey
+libgnome-keyring
+openvpn
+cracklib
+zd1211-firmware
+plymouth-plugin-two-step
+libogg
+crontabs
+python-libs
+gstreamer-plugins-bad-free
+sed
+pm-utils
+libarchive
+device-mapper-libs
+libX11
+libmtp
+libimobiledevice
+systemd-units
+libXtst
+libgpod
+gjs
+plymouth-scripts
+libexif
+gnome-themes-standard
+yum-metadata-parser
+cogl
+speex
+control-center
+logrotate
+dbus-x11
+libplist
+yelp-libs
+python-telepathy
+at-spi2-core
+bluez-libs
+gnome-panel
+python-crypto
+farsight2
+libao
+empathy
+python-GnuPGInterface
+ConsoleKit-libs
+gmp
+gnome-games
+liblouis-python
+geoclue
+libiec61883
+NetworkManager-gnome
+python-cups
+python-slip-dbus
+celt051
+xorg-x11-drivers
+libwvstreams
+gtk3
+grep
+gvfs-gphoto2
+ghostscript-fonts
+brasero-libs
+gvnc
+ibus-hangul
+nss
+evolution-data-server
+libXmu
+sushi
+rpm
+gtksourceview3
+celt
+gutenprint-cups
+gmime
+dmraid
+mtools
+wvdial
+libcacard
+brasero
+xorg-x11-server-common
+rp-pppoe
+usermode
+gtk-vnc2
+libdvdread
+irqbalance
+python-pycurl
+xorg-x11-xinit
+libpcap
+b43-openfwwf
+gnupg
+xdg-user-dirs
+dosfstools
+paps
+wodim
+gnome-disk-utility
+syslinux
+sudo
+linux-atm-libs
+glx-utils
+festival
+mcpp
+xkeyboard-config
+lvm2-libs
+dump
+schroedinger
+dmidecode
+tzdata
+abrt-addon-ccpp
+unzip
+libdc1394
+pbm2l2030
+basesystem
+libmash
+liberation-serif-fonts
+xfsprogs
+device-mapper-multipath-libs
+verne-backgrounds-single
+xorg-x11-drv-i128
+un-core-dotum-fonts
+nss-myhostname
+libnfnetlink
+nss-softokn-freebl
+xorg-x11-drv-elographics
+lohit-devanagari-fonts
+gnome-video-effects
+ustr
+libcap
+xorg-x11-drv-void
+paktype-naqsh-fonts
+fftw
+librsvg2
+info
+xorg-x11-drv-openchrome
+symlinks
+libmodplug
+unique
+popt
+xorg-x11-drv-rendition
+traceroute
+rest
+libgnomecanvas
+gamin
+gvfs-fuse
+libertas-usb8388-firmware
+ncurses
+gutenprint
+gobject-introspection
+rsyslog
+ipw2100-firmware
+cairo
+libdhash
+libusb
+NetworkManager
+pygobject2
+libref_array
+libvorbis
+crda
+libselinux-python
+udev
+libXdamage
+fxload
+jack-audio-connection-kit
+iptables
+gawk
+libpeas
+poppler-glib
+kernel
+libbluray
+gnome-settings-daemon
+pyOpenSSL
+ibus-libs
+lua
+file-roller
+libhbalinux
+device-mapper-event-libs
+redhat-menus
+simple-scan
+libutempter
+pyparted
+flac
+gnome-disk-utility-nautilus
+pyxf86config
+mdadm
+libatasmart
+shotwell
+python-xlib
+GConf2
+lcms2
+NetworkManager-vpnc
+python-mako
+pyatspi
+xorg-x11-xkb-utils
+policycoreutils-sandbox
+net-snmp-libs
+lockdev
+bzip2
+grub2
+fipscheck
+webkitgtk3
+libdb
+ibus-pinyin
+sound-theme-freedesktop
+ghostscript-cups
+festival-speechtools-libs
+gnome-system-monitor
+libreport
+vte3
+telepathy-logger
+gnome-terminal
+shared-color-profiles
+eekboard-python
+abrt-libs
+gtk3-immodule-xim
+samba-winbind-clients
+device-mapper-multipath
+libicu
+gnome-media
+rpm-build-libs
+unique3
+procps
+iptstate
+libreport-plugin-logger
+speech-dispatcher-python
+libhbaapi
+iwl6000-firmware
+createrepo
+imsettings-gnome
+anthy
+iwl6000g2a-firmware
+brltty
+fprintd-pam
+cdparanoia
+yum-langpacks
+rasqal
+rtkit
+xorg-x11-xauth
+sos
+libmcpp
+cyrus-sasl-gssapi
+fontpackages-filesystem
+telepathy-haze
+enca
+less
+telepathy-filesystem
+makebootfat
+file
+dejavu-fonts-common
+ntfsprogs
+pulseaudio-utils
+iso-codes
+pcsc-lite-libs
+libxml++
+mozilla-filesystem
+libdv
+libgadu
+khmeros-fonts-common
+libaio
+desktop-backgrounds-gnome
+fedora-bookmarks
+neon
+xsel
+mobile-broadband-provider-info
+passwdqc-lib
+xz
+ncurses-base
+opencc
+libisofs
+ncurses-libs
+hostname
+llvm-libs
+libattr
+libthai
+librsync
+zlib
+pygtk2
+libofa
+nspr
+usermode-gtk
+diffutils
+nss-util
+grilo
+gettext-libs
+libudev
+gnome-themes
+libproxy
+sqlite
+system-config-users
+m17n-lib
+libffi
+python-slip-gtk
+dash
+shared-mime-info
+poppler-utils
+coreutils-libs
+json-glib
+pinentry-gtk
+coreutils
+libSM
+matchbox-window-manager
+cairo-gobject
+libusb1
+libpath_utils
+shadow-utils
+telepathy-glib
+fuse-libs
+hicolor-icon-theme
+libtdb
+kbd-misc
+hwdata
+libXau
+netxen-firmware
+libxml2-python
+libXfixes
+iproute
+python-slip
+libXrandr
+dbus
+cracklib-python
+gsettings-desktop-schemas
+initscripts
+libXft
+libsigc++20
+dracut
+gnome-icon-theme-legacy
+libXt
+mesa-libGL
+pycairo
+libasyncns
+NetworkManager-glib
+bind-libs-lite
+libXv
+gupnp
+dvd+rw-tools
+libraw1394
+abrt
+pciutils
+e2fsprogs-libs
+avahi-glib
+festival-freebsoft-utils
+krb5-libs
+parted
+util-linux
+libXxf86misc
+gupnp-igd
+python-tempita
+pulseaudio-libs-glib2
+mesa-libGLU
+python-BeautifulSoup
+libcroco
+openssh-clients
+python-magic
+which
+ConsoleKit
+python-chardet
+file-libs
+PackageKit-yum
+python-boto
+plymouth-core-libs
+webkitgtk
+gettext
+libxklavier
+gstreamer-plugins-good
+python-iniparse
+exiv2-libs
+system-config-date
+telepathy-idle
+js
+sane-backends-libs
+openconnect
+gdk-pixbuf2
+clutter-gtk
+cyrus-sasl-md5
+pciutils-libs
+libnotify
+libspectre
+openjpeg-libs
+avahi-ui-gtk3
+groff
+mpfr
+libgnomekbd
+libcurl
+libXvMC
+evince-libs
+curl
+libXres
+gnome-python2-gnomekeyring
+libuser
+openobex
+eekboard-libs
+gnupg2
+tar
+gtkhtml3
+libgdata
+pinentry
+python-pyblock
+libsmbclient
+libconfig
+ptouch-driver
+dhcp-common
+libfontenc
+libchamplain-gtk
+rpm-python
+checkpolicy
+gtkmm30
+setuptool
+p11-kit
+gnome-utils-libs
+libreport-plugin-bugzilla
+gsm
+PackageKit-device-rebind
+yum
+btparser
+im-chooser-common
+smolt
+pth
+ibus-gtk2
+vorbis-tools
+lzo
+fprintd
+brlapi
+newt
+gvfs
+smp_utils
+xorg-x11-font-utils
+gvfs-afc
+redland
+obex-data-server
+duplicity
+lx
+festival-lib
+stunnel
+xorg-x11-utils
+lvm2
+lftp
+system-config-firewall-tui
+bc
+abrt-addon-python
+foomatic-filters
+grilo-plugins
+dejavu-serif-fonts
+xorg-x11-server-Xephyr
+paktype-tehreer-fonts
+xorg-x11-drv-vesa
+dejavu-sans-fonts
+xorg-x11-drv-sisusb
+lohit-oriya-fonts
+xorg-x11-drv-fbdev
+lohit-bengali-fonts
+xorg-x11-drv-fpit
+lohit-assamese-fonts
+xorg-x11-drv-aiptek
+dejavu-sans-mono-fonts
+xorg-x11-drv-mutouch
+smc-meera-fonts
+xorg-x11-drv-hyperpen
+b43-fwcutter
+xorg-x11-drv-v4l
+zip
+xorg-x11-drv-tdfx
+rdist
+xorg-x11-drv-siliconmotion
+iwl5000-firmware
+lldpad
+atmel-firmware
+plymouth-theme-charge
+mailcap
+iscsi-initiator-utils
+iwl4965-firmware
+cronie-anacron
+setroubleshoot-plugins
+alsa-utils
+gnome-session
+wireless-tools
+usb_modeswitch-data
+alsa-firmware
+cryptsetup-luks
+totem
+cheese-libs
+gdm
+bluez
+evolution
+tigervnc-license
+evolution-NetworkManager
+gdm-plugin-fingerprint
+brasero-nautilus
+gnome-screensaver
+gedit
+system-config-network-tui
+alsa-plugins-pulseaudio
+NetworkManager-openvpn
+sendmail
+abrt-desktop
+pulseaudio-module-gconf
+gvfs-archive
+ibus-anthy
+gnome-utils
+printer-filters
+system-config-printer
+nautilus-sendto
+seahorse
+gcalctool
+PackageKit-command-not-found
+openssh-server
+microcode_ctl
+psacct
+chrony
+iwl100-firmware
+aic94xx-firmware
+nspluginwrapper
+passwdqc
+yum-presto
+system-config-printer-udev
+usbutils
+papyon
+libgcc
+cyrus-sasl-plain
+c2050
+filesystem
+libshout
+hesiod
+liberation-fonts-common
+gstreamer-tools
+ntfs-3g
+xml-common
+keyutils
+libburn
+poppler-data
+libffado
+min12xxw
+smc-fonts-common
+iw
+dotconf
+fedora-release
+libdmx
+pakchois
+libX11-common
+libXpm
+libvisual
+mesa-dri-filesystem
+ModemManager
+libhangul
+glibc
+vim-minimal
+libbsd
+libselinux
+nss-softokn
+libsemanage-python
+dbus-libs
+libss
+gstreamer-plugins-base
+libstdc++
+liblouis
+libreport-gtk
+libcom_err
+m4
+pygtk2-libglade
+bzip2-libs
+taglib
+pangomm
+readline
+glib-networking
+authconfig-gtk
+libgcrypt
+abattis-cantarell-fonts
+gnome-python2-desktop
+glib2
+libpipeline
+kasumi
+libgudev1
+gzip
+gnome-python2-libwnck
+libuuid
+pam
+libmatchbox
+tcp_wrappers-libs
+openssl
+c-ares
+dbus-glib
+alsa-lib
+gnome-dvb-daemon
+pixman
+gnome-icon-theme
+yelp-xsl
+libtool-ltdl
+newt-python
+cryptsetup-luks-libs
+libXext
+usbmuxd
+kbd
+libXrender
+authconfig
+systemd-sysv
+libgee
+cairomm
+iputils
+libtiff
+genisoimage
+plymouth
+libXcursor
+audit-libs-python
+xorg-x11-server-Xorg
+gnutls
+python-ethtool
+clutter
+glibmm24
+libevent
+gssdp
+libcap-ng
+portaudio
+ppp
+libxslt
+gnome-icon-theme-extras
+avahi
+keyutils-libs
+flite
+dconf
+libXxf86vm
+python-cloudfiles
+device-mapper-event
+pulseaudio-libs
+python-paste
+libchamplain
+imsettings-libs
+python-httplib2
+openssh
+cpio
+python-bugzilla
+polkit
+xmlrpc-c
+python-kitchen
+PackageKit-glib
+libXdmcp
+pycryptopp
+accountsservice
+libxkbfile
+libproxy-python
+libsocialweb
+startup-notification
+gdb
+speech-dispatcher
+libgtop2
+wpa_supplicant
+sane-backends
+jasper-libs
+bind-libs
+libcanberra-gtk3
+psmisc
+urw-fonts
+notification-daemon
+lcms-libs
+gd
+zenity
+plymouth-graphics-libs
+nss-sysinit
+notify-python
+libtevent
+xmlrpc-c-client
+folks
+grubby
+rpm-libs
+gnome-keyring-pam
+exempi
+libuser-python
+libwnck3
+rsync
+gpgme
+gnome-bluetooth-libs
+setools-libs
+quvi
+dmraid-events
+libunistring
+dhcp-libs
+evince
+enchant
+python-smbc
+abrt-gui
+libselinux-utils
+passwd
+spice-gtk3
+libedit
+python-deltarpm
+gnome-panel-libs
+libdaemon
+libreport-newt
+accountsservice-libs
+tcl
+anaconda-yum-plugins
+im-chooser
+libvpx
+pykickstart
+ibus-gtk3
+libcollection
+icedax
+libfprint
+slang
+python-brlapi
+gnome-disk-utility-libs
+libdvdnav
+yajl
+gvfs-obexftp
+obexd
+slv2
+cups-pk-helper
+libfreebob
+libdiscid
+farsight2-python
+tcpdump
+telepathy-farsight
+fedora-release-notes
+os-prober
+btrfs-progs
+libdmapsharing
+tcp_wrappers
+abrt-addon-kerneloops
+ed
+pyclutter
+vlgothic-fonts
+xorg-x11-drv-i740
+lohit-telugu-fonts
+xorg-x11-drv-nouveau
+khmeros-base-fonts
+xorg-x11-drv-s3virge
+stix-fonts
+xorg-x11-drv-qxl
+sil-abyssinica-fonts
+xorg-x11-drv-intel
+jomolhari-fonts
+xorg-x11-drv-ati
+thai-scalable-waree-fonts
+xorg-x11-drv-apm
+sil-padauk-fonts
+xorg-x11-drv-vmmouse
+tree
+xorg-x11-drv-voodoo
+lrzsz
+xorg-x11-drv-synaptics
+setserial
+xorg-x11-drv-trident
+gnome-backgrounds
+fcoe-utils
+rootfiles
+mesa-dri-drivers
+ql2500-firmware
+libcgroup
+ivtv-firmware
+cronie
+setroubleshoot-server
+vpnc
+gnome-session-xsession
+python-iwlib
+hplip-common
+alsa-tools-firmware
+gnome-js-common
+adwaita-cursor-theme
+nautilus-extensions
+pulseaudio-gdm-hooks
+gnome-bluetooth
+gnome-user-docs
+tigervnc-server-minimal
+file-roller-nautilus
+evince-nautilus
+deja-dup
+eog
+rhythmbox
+gnome-packagekit
+NetworkManager-openconnect
+setroubleshoot
+plymouth-system-theme
+selinux-policy-targeted
+pulseaudio-module-x11
+xdg-user-dirs-gtk
+ibus-chewing
+vinagre
+firstboot
+libproxy-mozjs
+bluez-cups
+totem-mozplugin
+gucharmap
+PackageKit-gstreamer-plugin
+nss-mdns
+sssd
+at
+biosdevname
+iwl6000g2b-firmware
+iwl6050-firmware
+gtk2-immodule-xim
+pam_pkcs11
+cifs-utils
+prelink
+mlocate
+xorg-x11-server-utils
+setup
+telepathy-gabble
+libgexiv2
+efibootmgr
+sysvinit-tools
+comps-extras
+selinux-policy
+rmt
+time
+libchewing
+thai-scalable-fonts-common
+caribou
+libmount
+lohit-gujarati-fonts
+hdparm
+verne-backgrounds-gnome
+xorg-x11-drv-wacom
+db4-utils
+lklug-fonts
+libnetfilter_conntrack
+glibc-common
+xorg-x11-drv-keyboard
+meanwhile
+liberation-mono-fonts
+libsemanage
+freetype
+xorg-x11-drv-mach64
+e2fsprogs
+lohit-tamil-fonts
+gstreamer-python
+libICE
+xorg-x11-drv-r128
+cryptopp
+eject
+gtk2-engines
+chkconfig
+xorg-x11-drv-evdev
+libsoup
+rdate
+gnome-python2-canvas
+pkgconfig
+fuse
+ncftp
+rt61pci-firmware
+libwnck
+desktop-file-utils
+policycoreutils-python
+fontconfig
+gpg-pubkey
+pnm2ppa
+expat
+dnsmasq
+dbus-python
+libini_config
+db4
+media-player-info
+libpciaccess
+linux-firmware
+libXcomposite
+hplip-libs
+gnome-icon-theme-symbolic
+net-tools
+libblkid
+seed
+xdg-utils
+system-setup-keyboard
+libtasn1
+nautilus
+setools-libs-python
+clutter-gst
+libtalloc
+gnome-shell
+espeak
+policycoreutils
+libical
+anaconda
+avahi-autoipd
+avahi-gobject
+libsndfile
+totem-nautilus
+python-markupsafe
+dhclient
+findutils
+gnome-contacts
+python-feedparser
+gnome-python2-gconf
+orc
+gnome-power-manager
+python-beaker
+libsocialweb-keys
+xcb-util
+man-db
+pkcs11-helper
+libgphoto2
+libv4l
+system-config-firewall
+fipscheck-lib
+gnome-keyring
+cyrus-sasl-lib
+ibus-rawcode
+sssd-client
+cups
+libavc1394
+sound-juicer
+libreport-python
+xulrunner
+telepathy-mission-control
+firefox
+color-filesystem
+eekboard
+libassuan
+mousetweaks
+totem-pl-parser
+metacity
+hunspell
+PackageKit-gtk-module
+pygpgme
+adwaita-gtk3-theme
+vpnc-script
+rng-tools
+libreport-plugin-kerneloops
+pywebkitgtk
+wavpack
+iwl5150-firmware
+yum-utils
+imsettings
+libart_lgpl
+ar9170-firmware
+python-nss
+udisks
+squashfs-tools
+smolt-firstboot
+raptor2
+pulseaudio
+libldb
+memtest86+
+c2070
+libpurple
+fpaste
+apg
+libass
+control-center-filesystem
+at-spi2-atk
+m17n-contrib
+cdrdao
+libsilc
+m17n-db
+gupnp-av
+attr
+elfutils
+libsysfs
+vlgothic-fonts-common
+xorg-x11-drv-acecad
+cjkuni-uming-fonts
+libXevie
+libmusicbrainz3
+polkit-desktop-policy
+xorg-x11-drv-sis
+paratype-pt-sans-fonts
+acl
+cjet
+bash
+xorg-x11-drv-savage
+lohit-kannada-fonts
+isomd5sum
+pango
+libpng
+xorg-x11-drv-mga
+mcelog
+make
+gnome-python2
+libjpeg-turbo
+xorg-x11-drv-glint
+vconfig
+libmodman
+fedora-icon-theme
+avahi-libs
+xorg-x11-drv-ast
+rt73usb-firmware
+procmail
+gstreamer-rtsp
+atk
+cyrus-sasl
+ipw2200-firmware
+cracklib-dicts
+plymouth-plugin-label
+libacl
+audit
+python
+libmpcdec
+xz-libs
+upower
+module-init-tools
+device-mapper
+libxcb
+usb_modeswitch
+fedora-logos
+systemd
+libXi
+python-cryptsetup
+poppler
+libdrm
+libnl
+gnome-desktop3
+pyxdg
+libcanberra
+elfutils-libelf
+pulseaudio-module-bluetooth
+pygobject3
+libmx
+libXinerama
+yelp
+sox
+system-config-firewall-base
+cups-libs
+orca
+python-simplejson
+libnice
+libsamplerate
+cheese
+python-decorator
+python-meh
+libidn
+libsane-hpaio
+python-IPy
+PackageKit
+gnome-menus
+NetworkManager-pptp
+system-config-printer-libs
+polkit-gnome
+libtheora
+gnome-color-manager
+libssh2
+colord
+pcre
+gvfs-smb
+ghostscript
+gnome-online-accounts
+gdbm
+ibus-m17n
+openldap
+libgweather
+atkmm
+transmission-gtk
+deltarpm
+libcanberra-gtk2
+usbredir
+vino
+liboauth
+kpartx
+libgomp
+PackageKit-yum-plugin
+spice-glib
+mutter
+libXfont
+pcmciautils
+system-config-keyboard
+libgnome-media-profiles
+sg3_utils-libs
+irda-utils
+python-urlgrabber
+ConsoleKit-x11
+libieee1284
+iwl1000-firmware
+transmission-common
+ibus
+cdparanoia-libs
+nc
+dialog
+gnome-disk-utility-ui-libs
+libipa_hbac
+bind-utils
+sgpio
+libGLEW
+festvox-slt-arctic-hts



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]