Quick Custom Installation

From ArchWiki

Jump to: navigation, search
Image:Tango-dialog-warning.png This article is out of date.
Please help improve the wiki by updating the article and correcting mistakes.

Installation of Arch Linux to a clean directory or partition using a custom package selection

This is really very out of date. One might consider removing it. Current existing options include the official arch installer and the new framework AIF (available in the Arch repositories - but I think they will probably only normally run on an Arch system), and the successor(s) to the script presented here which are available in the larch package, which should also run on non-Arch systems. You probably need the static build of pacman (AUR) if not running on Arch, which larch should manage more or less automatically.


Please refer to Using_the_quickinst_Script_to_Install_Arch_Linux for more general details about installation using such a script. Install_Arch_from_within_another_distro might also be useful. The method described here allows much easier customization of the package selection, but you need internet access for downloading the packages, or a cache containing them.


The script newarch installs a 'clean', unconfigured Arch Linux system to a convenient location. It gets the required packages using the normal pacman method - downloading, from the cache, etc. - according to configuration and environment. It should run from within any Linux system. If necessary it will download pacman and use the static version, 'pacman.static'. It can be used to create customized installations directly on fresh partitions, for example. The script takes no arguments, most configuration details are in the script itself, at the top. In addition, a pacman.conf file for pacman is required. Here is an example:

#
# pacman.conf - for newarch
#          put it in the same directory as newarch
#
# NOTE: If you find a mirror that is geographically close to you, please
#       move it to the top of the server list, so pacman will choose it
#       first.
#

# See the pacman manpage for option directives

#
# GENERAL OPTIONS
#
[options]
LogFile     = /var/log/pacman.log
NoUpgrade   = etc/passwd etc/group etc/shadow etc/sudoers
NoUpgrade   = etc/fstab etc/raidtab etc/ld.so.conf
NoUpgrade   = etc/rc.conf etc/rc.local
NoUpgrade   = etc/modprobe.d/modprobe.conf etc/modules.conf
NoUpgrade   = etc/lilo.conf boot/grub/menu.lst
HoldPkg     = pacman glibc
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u

#
# REPOSITORIES
#   - can be defined here or included from another file
#   - pacman will search repositories in the order defined here.
#   - local/custom mirrors can be added here or in separate files
#

#[testing]
#Server = ftp://ftp.archlinux.org/testing/os/i686

[core]
# Add your preferred servers here, they will be used first
Server = ftp://ftp.archlinux.org/core/os/i686
Server = ftp://ftp.heanet.ie/mirrors/ftp.archlinux.org/core/os/i686
Server = ftp://ftp.nluug.nl/pub/metalab/distributions/archlinux/core/os/i686

[extra]
# Add your preferred servers here, they will be used first
Server = ftp://ftp.archlinux.org/extra/os/i686
Server = ftp://ftp.heanet.ie/mirrors/ftp.archlinux.org/extra/os/i686
Server = ftp://ftp.nluug.nl/pub/metalab/distributions/archlinux/extra/os/i686

#[unstable]
# Add your preferred servers here, they will be used first
#Server = ftp://ftp.nluug.nl/pub/metalab/distributions/archlinux/unstable/os/i686

#[community]
# Add your preferred servers here, they will be used first
#Server = ftp://ftp.heanet.ie/mirrors/ftp.archlinux.org/community/os/i686
#Server = ftp://ftp.nluug.nl/pub/metalab/distributions/archlinux/community/os/i686

# An example of a custom package repository.  See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#Server = file:///home/custompkgs

Choosing the packages to be installed

If you want more than the base set of packages to be installed, you need to provide the file 'addedpacks'. A simple example of this is also provided below. Pretty well any packages you like can be included in here, and dependencies will be handled automatically by pacman.

# addedpacks - a simple list of packages (just package name, not file
# name, e.g. 'python'), one per line,   _no other content!_ This is the primary
# place for configuring which packages are installed.

# place this file in the same directory as 'newarch'

# You'll need a kernel!
kernel26

# Just some suggestions

#for abs:
cvsup

# generally useful tools which don't require X:
openssh
rsync
dosfstools
lynx
mc
unzip
zip
fakeroot
alsa-lib
alsa-oss
alsa-utils


The exact location (directory name, DESTDIR) for the installlation can be set as a configuration detail in newarch. It need not be on a separate partition, but if it is, you could use that as the basis for a fresh Arch installation there. If you do use a separate partition, set DESTDIR to the mount point (and remember to mount the partition, with exec and dev options.

When the above files have been set up to meet your requirements, simply run newarch (as root) and you should end up with an (unconfigured, pristine) Arch system at the selected location. If you set up your configuration wrong (or if you or I made some other mistake ...), you might find you have destroyed some important data and/or your system doesn't work any more. If everything went well, you will be asked if you want to make a tar-ball of the installed system, which might be useful for subsequent installations.

Remember the system which gets installed here is completely unconfigured. As an absolute bare minimum you would need to edit its /etc/fstab (put the root partition in it), but probably several other things too (/etc/rc.conf, lilo/grub, etc.).


#! /bin/bash
#
# newarch
#
# Author: gradgrind <mt.42@web.de>
#
# This file is part of the larch project.
#
#    larch 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.
#
#    larch 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 larch; if not, write to the Free Software
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA #
#----------------------------------------------------------------------------
#

#----------------------------- CONFIGURATION ------------------

# WARNING! Relative paths (those not starting with /) are relative
# to the directory containing this file, and should be processed
# with 'readlink -f' in order to make them absolute, e.g.:
#      VAR1=$( readlink -f ../dir/file )

# Allows customizing of the cache for downloaded packages, default:
#PKGCACHE=/var/cache/pacman/pkg
# setting it to "" will cause the cache to be built and left in
# the destination directory
#PKGCACHE=""
PKGCACHE=/var/cache/pacman/pkg

# directory to contain the freshly installed Arch Linux
DESTDIR=/home/ArchImage

# pacman version, for ease of maintaining in case it get's updated.
PACVER="3.0.6-2"

# choose method for acquiring list of base packages
#getbasepacks=basepacks_cvs
getbasepacks=basepacks_ftp

# list of base packages which should NOT be installed
# e.g. BASEVETO="pkga pkgb"
BASEVETO="devfsd lshwd"
# devfsd is deprecated, but apparently still in base
# lshwd is buggy and not usually needed any more

#----------------------------- END OF CONFIGURATION -----------

# Get path to directory containing this script
SCRIPTDIR="`dirname \`readlink -f $0\``"

echo "Changing current directory to $SCRIPTDIR"
cd $SCRIPTDIR

echo
echo "newarch will do an automated Archlinux installation to the directory"
echo "            $DESTDIR"
echo
echo "It only installs the packages, without configuration."
echo
echo "It runs two stages:"
echo "                    install base packages - should generally be left unaltered"
echo "       (optional)   install additional packages - main point of customization"
echo

if [ "$(whoami)" != 'root' ]; then
       echo "You must run this as 'root'"
       exit 1
fi

if [ -z "`echo $DESTDIR | grep '^/'`" ]; then
       DESTDIR=`pwd`/$DESTDIR
fi

echo "**********************************************************"
echo "This will delete EVERYTHING under"
echo
echo "       $DESTDIR"
echo
echo "I really mean it ... Are you sure you want to do this?"
echo "**********************************************************"
# Await yes or no
read -p "[y/N]: " ans
if [ -z "`echo $ans | grep '^ *[yY]'`" ]; then exit 0; fi

echo
echo "Downloaded packages will be cached at      $PKGCACHE"
echo
# Await yes or no
read -p "OK? [y/N]: " ans
if [ -z "`echo $ans | grep '^ *[yY]'`" ]; then exit 0; fi

if [ ! -d $DESTDIR ]; then
       mkdir -p $DESTDIR
else
       rm -rf $DESTDIR/*
       if [ $? -ne 0 ]; then
               echo "ERROR: couldn't remove $DESTDIR"
               exit 1
       fi
fi

if [ -x /usr/bin/pacman ]; then
    PACMAN="pacman --config pacman.conf --noconfirm"
else
    echo
    echo "Downloading pacman"
    echo
    # use wget to download pacman
    # Updated to core and removed the setup/ subdir as noted in the discussion.
    # Please note: Apparently somebody removed the 'pacman.pkg.tar.gz' file, I'm
    # changing to it's current version. I would appreciate if somebody re-upload
    # the pacman.pkg.tar.gz or give me a better solution. :-) -- Felipe Mendes
    wget ftp://ftp.archlinux.org/core/os/i686/pacman-$PACVER-i686.pkg.tar.gz
    (($? > 0)) && echo 'Looks like your pacman download failed. Please ensure the PACVER \
                   variable is set to the latest pacman version and release.' && exit 1
    tar -xzf pacman-$PACVER-i686.pkg.tar.gz -O usr/bin/pacman.static >pacman.static
    chmod 755 pacman.static
    PACMAN="./pacman.static --config pacman.conf --noconfirm"
fi

# Generate the list of base packages using cvs.archlinux.org
basepacks_cvs ()
{
    echo
    echo "*********** Getting base package list from cvs.archlinux.org ***********"
    echo
    # Download index.html file for current/base
    rm -f index.html
    wget http://cvs.archlinux.org/cgi-bin/viewcvs.cgi/base/
    # bad style, but working thou
    # There was a problem with this function. Somebody forgot to close sed quotes:
    cat index.html | grep '^<a name="[^A]' | sed 's|.*name="\(.\+\)" h.*|\1|' > packages.temp
    BASEPKGS=`cat packages.temp | sed 's|-|[^-]\+-[0-9].[0-9]\+\.pkg.*||'`
}

# Generate the list of base packages from ftp.archlinux.org/.../packages.txt
basepacks_ftp ()
{
    echo
    echo "** Getting base package list from ftp.archlinux.org/.../packages.txt **"
    echo
    rm -f packages.txt
    wget ftp://ftp.archlinux.org/core/os/i686/packages.txt
    # The sed regexp didn't worked with versions such as:
    # pam-0.99.8.1-3.1.pkg.tar.gz
    # and gcc-4.2.1-3.1.pkg.tar.gz
    # So I adapted it.
    BASEPKGS=`cat packages.txt | egrep '^base/' | \
            sed 's|^.*/||;s/-[0-9]\+.*//'`
}

# Fetch the list of packages from core/base to BASEPKGS
$getbasepacks
# Build basepacks by filtering BASEPKGS
echo -n "" > basepacks
#
# I'm sure this next bit (filter out vetoed packages) can be done better,
# any ideas? bash has so much weird syntax ... too complicated for me.
#
for p in $BASEPKGS; do
       for v in $BASEVETO; do
               if [ "$v" == "$p" ]; then
                       p=""
                       break
               fi
       done
       if [ -n "$p" ]; then
               echo $p >> basepacks
       fi
done

doInstall() {
    echo "Installing following packages:"
    echo $PKGLIST
    $PACMAN -r $DESTDIR -S $PKGLIST
    if [ $? -gt 0 ]; then
       echo
       echo "Package installation from $pklist FAILED."
       echo
       exit 1
    fi
}

# This redirects the package cache, so that an existing one can be used.
if [ -n "$PKGCACHE" ]; then
    mkdir -p $DESTDIR/var/cache/pacman
    mkdir -p $PKGCACHE
    ln -s $PKGCACHE $DESTDIR/var/cache/pacman/pkg
fi

echo
echo "************** Synchronising package dbs **************"
echo
$PACMAN -r $DESTDIR -Sy

echo
echo "************** Installing base package set **************"
echo
pklist="basepacks"
PKGLIST=`cat $pklist | grep -v "#"`
doInstall

echo
echo "************** Additional packages **************"
echo
pklist="addedpacks"
if [ -f $pklist ]; then
    PKGLIST=`cat $pklist | grep -v "#"`
    doInstall
else
    echo " ... package list file 'addedpacks' not found"
    echo
fi

if [ -n "$PKGCACHE" ]; then
# Remove the package cache redirection
    rm $DESTDIR/var/cache/pacman/pkg
fi

echo
echo "Would you like to create a 'tar.gz' of the installation?"
# Await yes or no
read -p "[y/N]: " ans
if [ -z "`echo $ans | grep '^ *[yY]'`" ]; then exit 0; fi
echo "Doing     tar -czf archiball.tar.gz -C $DESTDIR ."
echo "This could take a while ..."
tar -czf archiball.tar.gz -C $DESTDIR .
echo
echo "+++ All done! +++"
echo
Personal tools