Subversion Repositories ALCASAR

Compare Revisions

No changes between revisions

Ignore whitespace Rev 2921 → Rev 2941

/iso/scripts/build-image.sh
File deleted
Property changes:
Deleted: svn:eol-style
-native
\ No newline at end of property
Deleted: svn:executable
-*
\ No newline at end of property
/iso/buildMageiar.sh
File deleted
Property changes:
Deleted: svn:eol-style
-native
\ No newline at end of property
Deleted: svn:executable
-*
\ No newline at end of property
/iso/README.md
1,34 → 1,27
Mageiar ISO builder
Mageia + ALCASAR (Mageiar) ISO builder
===================
 
Goal
----
 
The goal here is to create a minimalist ISO image to install both Mageia and Alcasar with all its dependencies, wth only one command.
The goal is to create a minimalist ISO image to install both Mageia and Alcasar with all its dependencies.
 
How it works
------------
 
The script uses an official Mageia docker image to retrieve a recursive list of dependecies that are downloaded and packaged in the installation ISO. Alcasar dependencies list, as well as its kernel version, are retrieved from the Alcasar tar archive.
The script lists the RPMs installed on a running ALCASAR in order to download them from Internet repository.
Then, it downloads the RPM need to create an ISO file.
Once the ISO is done, one can boot on it and install the OS normally. The ALCASAR archive is copied in /root folder
 
Once the ISO is done, one can boot on it and install the OS normally. The dependencies are installed along the basesystem packages, which means that the Alcasar installer will only download updates.
 
What it needs
-------------
 
The script can be provided with both the Alcasar tar archive as well as the Mageia ISO image.
The Alcasar archive can be given in argument using the `-a` option. Otherwise it will be downloaded automatically in its latest version.
The Mageia ISO image and ALCASAR archive are to be placed in the `ressources` directory before running the script.
 
The Mageia ISO image is to be placed in the `ressources` directory.
If Mageia image has been provided, it will be downloaded in the docker.
This is because the version has to match the one in the docker
 
The script's only dependency is the docker service. All other dependencies, such as the RPM and ISO tools, will be installed within the docker.
 
How to use
----------
 
Usage : buildMageiar [-a alcasar.tar.gz]
Usage : build-iso.sh
 
What can be done
----------------
36,5 → 29,6
The ISO image seems to be already as light as it can be. With all the necessary packages, it weighs around 800Mo.
 
Here is a list of interesting functionnalities:
- if a needed RPM has not been updated, copy it from the Mageia iso file instead of download it from repository
- Use DrakX to install and configure Alcasar graphically
- Propose an automatic partition table suitable for Alcasar
/iso/build-iso.sh
0,0 → 1,231
#!/bin/bash
#
# Build Mageiar (Mageia + ALCASAR) ISO file
# Authors: Hamza ESSAYEGH (Querdos) - Rexy - Laurent Roux - Aurelien Dubois - Pierre Rivault
#
####################################
###### Variables & functions ######
################################################################################
 
CURRENT_DIR="$(readlink -f "$(dirname $0)")"
LOG_FILE="$CURRENT_DIR/build-image.log"
RESSOURCES="$CURRENT_DIR/ressources"
 
# Print the given error message and exit 1
function errorExit()
{
tput bold
echo -e "ERROR : $1 \nAborting\n" >&2
echo "$1" > "$LOG_FILE"
tput sgr0
exit 1
}
#-------------------------------------------------------------------------------
# Print progress bar. $1 is a multiple of five
function printProgress()
{
local a
let "a = $1 / 5"
let "b = 25 - $a"
progressStr=$(printf "%${a}s")
progressStrBlanks=$(printf "%${b}s")
echo -en "Downloading...$1% [${progressStr// /#}${progressStrBlanks// / }]\r"
}
#-------------------------------------------------------------------------------
function printBold()
{
tput bold 2>/dev/null
echo $1
tput sgr0 2>/dev/null
}
 
ISO_IN=`ls $RESSOURCES | grep '^Mageia.*iso'`
MAGEIA_VERSION=`echo $ISO_IN|cut -d"-" -f2`
ARCH=`echo $ISO_IN |cut -d"-" -f3|cut -d"." -f1`
ALCASAR_TARBALL=`ls $RESSOURCES| grep '^alcasar.*gz'`
ALCASAR_EXTRACTED_DIR=$(echo $ALCASAR_TARBALL | rev | cut -d '.' -f 3- | rev)
ALCASAR_VERSION=`echo $ALCASAR_EXTRACTED_DIR | cut -d"-" -f2`
MAGEIA_NEW_DIR=/var/tmp/mageia_new
MAGEIA_OFFICIAL_DIR=/var/tmp/mageia_official
MAGEIA_OFFICIAL_DIR_EFI=/var/tmp/mageia_official_efi
coreDir=${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/core
nonFreeDir=${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/nonfree
coreDirNew=${MAGEIA_NEW_DIR}/${ARCH}/media/core/
nonFreeDirNew=${MAGEIA_NEW_DIR}/${ARCH}/media/nonfree
plopFilePath=${MAGEIA_NEW_DIR}/${ARCH}/media/plop.idx
ISO_OUT=/var/tmp/iso
RPM_DIR=/var/tmp/rpms
 
 
# Drake installer
INSTALLER_DIR="${MAGEIA_NEW_DIR}/${ARCH}/install/alcasar"
EFI_GRUB_CFG="${MAGEIA_NEW_DIR}/boot/grub2/grub.cfg"
ADVERT_DIR="${MAGEIA_NEW_DIR}/${ARCH}/install/extra/advertising"
AUTO_INSTALL_CFG="${ISO_OUT}/auto_inst.cfg.pl"
 
# RPMs needed during an install stage
BASE_RPM_LIST="acpi acpid alsa-utils aoss arp-scan basesystem bash-completion coreutils-doc cpupower curl dhcp-client dmraid dnf dnf-plugins-core dosfstools dracut drakx-net-text gpm grub2 grub2-efi grub2-mageia-theme harddrake hdparm hexedit info iwlwifi-agn-ucode ldetect lftp lib64alsa-plugins lib64glib-networking-gnutls locales-en locales-fr lsof lvm2 mageia-theme-Default man-db mandi-ifw man-pages microcode microcode_ctl mtools ntfs-3g numlock os-prober p11-kit perl-Hal-Cdroms plymouth procmail python3 python3-dbus radeon-firmware ralink-firmware rtlwifi-firmware sharutils shorewall-ipv6 strace sysfsutils tmpwatch tree vim-minimal vnstat xdg-user-dirs-gtk sudo socat"
 
#######################
###### Main ######
################################################################################
 
# Some checks
[[ $(whoami) != 'root' ]] && errorExit 'Please run as root'
[[ $ISO_IN == "" ]] && errorExit "No Mageia iso file in $RESSOURCES"
[[ ! -f "$RESSOURCES/auto_inst.cfg.pl_template" ]] && errorExit "No auto_inst.cfg.pl_template file in $RESSOURCES"
[[ $ALCASAR_TARBALL == "" ]] && errorExit "No ALCASAR tarball file in $RESSOURCES"
for directory in $MAGEIA_NEW_DIR $MAGEIA_OFFICIAL_DIR $MAGEIA_OFFICIAL_DIR_EFI $ISO_OUT $RPM_DIR
do
[ -d $directory ] || mkdir -p $directory
done
printBold "Mageiar will be build with Mageia-$MAGEIA_VERSION-$ARCH and $ALCASAR_EXTRACTED_DIR"
 
# Retrieve list of Alcasar dependencies
tar -xf $RESSOURCES/$ALCASAR_TARBALL -C /tmp/ || errorExit "could not extract alcasar tar archive"
alcasarRpmList="$(grep -oP "(?<=PACKAGES=\").*?(?=\")" /tmp/$ALCASAR_EXTRACTED_DIR/scripts/alcasar-rpm.sh)"
alcasarKernel="$(grep -oP "(?<=KERNEL=\").*?(?=\")" /tmp/$ALCASAR_EXTRACTED_DIR/scripts/alcasar-rpm.sh)"
alcasarRpmList="$alcasarRpmList $alcasarKernel"
 
# Make clean rpm list
rpmList=$(echo $BASE_RPM_LIST $alcasarRpmList | sed "s/ /\n/g" | sort | uniq | sed "s/\n/ /g")
 
# Insert list into AUTO_INSTALL_CFG
formattedList=$(echo $rpmList | sed "s/[^ ]*/\'\0\'/g" | sed "s/ /,\n/g" | sed "/kernel-server/d")
cp $RESSOURCES/auto_inst.cfg.pl_template $AUTO_INSTALL_CFG -f
insertLineNumber=$(grep -n "'default_packages' => " "$AUTO_INSTALL_CFG" | cut -d ':' -f1)
fileTop=$(head -n "+$insertLineNumber" "$AUTO_INSTALL_CFG")
fileBottom=$(tail -n "+$insertLineNumber" "$AUTO_INSTALL_CFG" | tail -n +2)
cat /dev/null > "$AUTO_INSTALL_CFG"
echo "$fileTop" > "$AUTO_INSTALL_CFG"
echo "$formattedList" >> "$AUTO_INSTALL_CFG"
echo "$fileBottom" >> "$AUTO_INSTALL_CFG"
 
# Installing tools to create the iso
printBold "Installing necessary tools"
dnf install 'dnf-command(download)' -y || errorExit "could not install necessary packages"
#dnf install 'dnf-command(config-manager)' -y || errorExit "could not install necessary packages"
#dnf config-manager --set-enabled mageia-x86_64-nonfree updates-x86_64-nonfree || errorExit "could not install necessary packages"
dnf install -y lftp wget cdrkit-genisoimage xorriso rpmtools syslinux || errorExit "could not install necessary packages"
 
# Mounting the ISO image
printBold "Mounting the image"
mount -o ro,loop $RESSOURCES/$ISO_IN $MAGEIA_OFFICIAL_DIR || errorExit "failed mounting $ISO_IN."
sleep 1 # wait for mounting process
[ -d ${MAGEIA_OFFICIAL_DIR}/x86_64 ] || umount $MAGEIA_OFFICIAL_DIR || errorExit "The ISO file isn't in the target architecture ($ARCH)"
 
# Copying main files except core and nonfree directories
echo "Extracting base image..."
cd $MAGEIA_OFFICIAL_DIR && \
tar cf - --exclude=${ARCH}/media . | (cd $MAGEIA_NEW_DIR && tar xf - ) && cd "${CURRENT_DIR}"
 
# Creating new directories core and nonfree and dir for alcasar stufs
mkdir -p ${MAGEIA_NEW_DIR}/${ARCH}/{media/{core,nonfree},install/alcasar}
 
# Adding Alcasar image advert to the installer
cp -f $RESSOURCES/install_slideshow/* "$ADVERT_DIR"
 
# Create the installed RPM list excluding those brought with alcasar archive (they aren't in repository)
installedList="$(dnf list installed | cut -d ' ' -f1 | rev | cut -d . -f2- | rev | grep -Ev 'coova-chilli|gammu|lib64gammu8|ipt-netflow|nfdump|wkhtmltopdf' | tail -n +2 | tr '\n' ' ')"
nbInstalled=$(echo $installedList | wc -w)
rpmList="$installedList $BASE_RPM_LIST"
total=`echo $rpmList | wc -w`
count=0
# Copying the RPM in core and clearing the plop.idx file
echo "Copying RPMS in ISO ..."
echo /dev/null > ${plopFilePath}
for rpm in ${rpmList}; do
let percent="${count} * 100 / ${total}"
if [[ $count -lt $nbInstalled ]] ; then
dnf download -y --downloadonly --downloaddir $coreDirNew $rpm 1> /dev/null || errorExit "could not download $rpm"
else
dnf install -y --downloadonly --downloaddir $coreDirNew $rpm 1> /dev/null || errorExit "could not download $rpm"
fi
printProgress ${percent}
count=$(expr ${count} + 1)
done
echo "STOP"; exit 1
 
# Sorting the plop file alphabetically
cat ${plopFilePath} | sort > /tmp/tmpFileMageia && mv /tmp/tmpFileMageia ${plopFilePath}
 
# Informations
printBold "$count RPMs copied"
 
# Downloading rpms needed by Alcasar
cd "$CURRENT_DIR"
printBold "Downloading Alcasar dependencies"
tar -xf /var/iso/$ALCASAR_TARBALL
 
# Copying the Alcasar tar to be put into the ISO
cp /var/iso/$ALCASAR_TARBALL $INSTALLER_DIR/
 
# Add automatic install options
mkdir -p $INSTALLER_DIR || errorExit "could not create directory $INSTALLER_DIR"
cp $AUTO_INSTALL_CFG $INSTALLER_DIR || errorExit "could not copy $AUTO_INSTALL_CFG to $INSTALLER_DIR"
 
# Generating media info for core
echo "Generating media_info for core..."
genhdlist2 ${coreDirNew} --allow-empty-media --quiet
 
echo "Generating media_info for nonfree..."
genhdlist2 ${nonFreeDirNew} --allow-empty-media --quiet
 
# Puting pubkeys in media_info
cp ${coreDir}/media_info/pubkey ${coreDirNew}/media_info/
cp ${nonFreeDir}/media_info/pubkey ${nonFreeDirNew}/media_info/
 
# Retrieving media.cfg & compssUsers.pl depending on the arch
mkdir ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info
cp ${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/media_info/compssUsers.pl ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info/compssUsers.pl
cp ${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/media_info/media.cfg ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info/media.cfg
 
# Specify install configuration
#sed -i -e 's*rdz*rdz kickstart=/tmp/media/x86_64/install/alcasar/auto_inst.cfg.pl*g' ${MAGEIA_NEW_DIR}/isolinux/isolinux.cfg
sed -i -e 's*noiswmd*noiswmd kickstart=/tmp/media/x86_64/install/alcasar/auto_inst.cfg.pl*g' $EFI_GRUB_CFG
 
# Generating distr
echo "Generating mirror tree..."
gendistrib -s ${MAGEIA_NEW_DIR}/${ARCH}
 
# Creating the new iso file
echo "Creating the isofile..."
newIsoName=Mageia-$MAGEIA_VERSION-${ARCH}-Alcasar-$ALCASAR_VERSION.iso
 
# Generating the iso file
# Parameters for xorriso found using the following command on the original mageia iso
# xorriso -indev Mageia-7-x86_64.iso -report_el_torito as_mkisofs
cd ${MAGEIA_NEW_DIR} && xorriso -as mkisofs \
-V 'Mageia-7.1-x86_64' \
--grub2-mbr --interval:local_fs:0s-15s:zero_mbrpt:${ISO_IN} \
-partition_cyl_align off \
-partition_offset 0 \
--mbr-force-bootable \
-append_partition 2 0xef --interval:local_fs:8785156d-8793347d::${ISO_IN} \
-iso_mbr_part_type 0x00 \
-c '/boot.catalog' \
-b '/boot/grub2/eltorito.img' \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
--grub2-boot-info \
-eltorito-alt-boot \
-e '--interval:appended_partition_2_start_2196289s_size_8192d:all::' \
-no-emul-boot \
-boot-load-size 8192 \
-o ${CURRENT_DIR}/${newIsoName} .
 
 
# Unmounting & Removing temporary dir
echo "Umounting..."
umount $MAGEIA_OFFICIAL_DIR
for directory in $MAGEIA_NEW_DIR $MAGEIA_OFFICIAL_DIR $MAGEIA_OFFICIAL_DIR_EFI $ISO_OUT $RPM_DIR
do
[ -d $directory ] && rm -rf $directory
done
 
mv ${CURRENT_DIR}/${newIsoName} /var/iso/
 
# Finished
rm -f "$AUTO_INSTALL_CFG"
echo "Done."
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
Added: svn:executable
+*
\ No newline at end of property
/iso/ressources/install_slideshow/02_IM_mageia.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
Property changes:
Deleted: svn:mime-type
-image/png
\ No newline at end of property
/iso/ressources/install_slideshow/02_IM_mageia.pl
File deleted
Property changes:
Deleted: svn:executable
-*
\ No newline at end of property
/iso/ressources/install_slideshow/list
1,2 → 1,3
01_IM_mageia.png
02_IM_mageia.png
alcasar.png