[原创]Archlive安装程序archlive-installer 完成3rd版本
时间:2009-06-28
来源:互联网
选择目标分区后,使用--move选项重新挂载到$INSTALL目录下,以避免出现一些错误.
----------------2009-07-07----更新------------
改用pacman.static来安装软件包,以使在非Arch环境下也可以按照清单快速安装Arch GNU/Linux。。。
----------------2009-06-29----更新------------
目前功能:
1、全新安装
本安装程序会根据自定义的软件清单快速安装Arch。
如果没有指定软件清单,则自动从googlecode上下载现成的清单;
可以自定义软件仓;
自定义软件源镜像清单;
2、从archlive启动运行本程序可以复制安装正在运行的archlive到目标分区。
支持自定义安装分区——/ /home /var /etc 可以分别分区;
自定义 menu.lst 。。。。
-------------------------------------------------
源码: http://archlive.googlecode.com/hg/archlive-installer/
使用办法: 用archlive启动,下载脚本,sudo sh ./archlive-installer 按照提示安装就可以了!
欢迎大家勘误, 提出宝贵意见!
#!/bin/bash
# 本脚本是Carbon Jiao制作的Archlive安装程序,基于shell Xdialog的图形界面。
# 目前支持两种安装方式:
# 1、用archlive启动时,复制运行的archlive安装到目标分区;
# 2、根据指定的软件清单来快速安装Arch GNU/Linux;
# 待加强:
# 1、优化、勘误;
# 2、加入Arch官方安装方式(爱好者自行加入);
# 3、多语言支持;
#
#2009-07-09 更新:选择目标分区后,采用--move挂载到$INSTALL目录下对应位置
#2009-07-07 更新:如果启动前插入了U盘或者移动硬盘导致盘符错乱(sdb...)也可以正常安装.
# 使用pamcan.static来安装arch软件包,以使在非Arch环境下也可以采用本安装程序根据软件清单快速安装Arch GNU/Linux。
#
if [ "$EUID" != "0" ]; then
echo "错误: 必须以root用户运行本制作脚本."
exit 1
fi
#if [ "x$(whereis Xdialog)" = "x" ]; then
# echo "错误,本安装程序须要xdialog的支持,请先安装此程序。"
# exit 1
#fi
Xdialog --version 2>&1 >/dev/null
if [ $? -ne 0 ]; then
echo "错误,本安装程序须要xdialog的支持,请先安装此程序。"
exit 1
fi
if [ ! -f /usr/lib/liblinuxlive ]; then
wget http://archlive.googlecode.com/hg/mkarchlive/linux-live/archlive/liblinuxlive
. ./liblinuxlive
else
. /usr/lib/liblinuxlive
fi
APPNAME=$(basename "${0}")
NEW_INSTALL="全新安装Arch GNU/Linux(暂未支持)——按照官方安装指南一步步安装"
NEW_QUICKINSTALL="全新快速安装Arch GNU/Linux(暂未支持)——利用软件清单快速自定义安装"
COPY_INSTALL="复制安装Archlive——将目前运行的这个Archlive系统复制安装到目标分区"
#INSTALL_LOG=/tmp/install.log_$$
# 修正后可以用随机数
INSTALL_LOG=/tmp/install.log
# 安装分区挂载位置
if [ ! -d /tmp/install ]; then mkdir -p /tmp/install; fi
INSTALL=/tmp/install
warnlogo="/usr/share/icons/gOS3_Icons/scalable/actions/process-stop.svg"
# 没有此功能的提示
function no_this_function ()
{
Xdialog --title "没有此功能" --backtitle "没有此功能" --no-close \
--icon $warnlogo \
--yesno "目前还没有该功能,是否重新选择安装方式?" 0 0
if [ $? -eq 0 ]; then
echo "提示: 目前没有此功能,请重新选择安装方式:" >>${INSTALL_LOG}
mainmenu
else
echo "$(date +%D" "%T) 没有重新选择安装方式,选择退出安装程序" >>${INSTALL_LOG}
fi
}
# 选择关闭或者取消程序的提示
function closed_prog ()
{
echo "$(date +%D" "%T) 选择了取消,现在退出程序." >>${INSTALL_LOG}
Xdialog --title "警告!" --time-out 20 --no-cancel --no-buttons \
--infobox "选择了取消,现在退出程序。" 5 40
exit 1
}
# 功能模块:错误提示
function errors ()
{
if [ $? -ne 0 ]; then
Xdialog --title "$BOX_TITLE" --backtitle "$BACKTITLE" --no-close \
--icon $warnlogo \
--yesno "出现错误, 查看详情?" 0 0
if [ $? -eq 0 ]; then
Xdialog --title "$BOX_TITLE" --backtitle "错误信息:" --no-cancel \
--textbox ${INSTALL_LOG} 20 64
fi
exit 1
fi
}
# 准备快速安装的软件清单
function prepare_softlist ()
{
if [ -f /tmp/soft.list ]; then rm -f /tmp/soft.list; fi
if [ -f $(pwd)/soft.list }; then
cp $(pwd)/soft.list /tmp/soft.list
else
wget http://archlive.googlecode.com/files/soft.list
cp soft.list /tmp/soft.list
fi
SOFT_LIST=/tmp/soft.list
Xdialog --stdout --title "编辑softlist" --no-close \
--yesno "编辑预安装的软件清单?" 0 0
if [ $? -eq 0 ]; then
Xdialog --title "编辑softlist" --fixed-font \
--editbox $SOFT_LIST 0 0 2>$SOFT_LIST$$
if [ $? -eq 0 ]; then
mv -f $SOFT_LIST$$ $SOFT_LIST
fi
fi
echo "$(date +%D" "%T) $SOFT_LIST编辑完成!结果如下: " >>${INSTALL_LOG}
cat $SOFT_LIST >>${INSTALL_LOG}
echo "--------------- $SOFT_LIST --------------------" >>${INSTALL_LOG}
}
function prepare_installer ()
{
#使用pacman.static作为安装程序,可以在非Arch下快速安装Arch了
[ -f /tmp/usr/bin/pacman.static ] && PACMAN=/tmp/usr/bin/pacman.static
[ -f /usr/bin/pacman.static ] && PACMAN=/usr/bin/pacman.static
if [ "$(uname -m)" = "x86_64" ]; then
PKGARG="http://repo.archlinux.fr/x86_64"
else
PKGARG="http://repo.archlinux-br.org/i686"
fi
if [ "$PACMAN" = "" ]; then
cd /tmp
echo "$(date +%D" "%T) 系统无pacman.static现在开始下载" >>${INSTALL_LOG}
wget -c $PKGARG/$(links -dump $PKGARG | grep "pacman-static-" | cut -d " " -f 1) 2>&1 >>${INSTALL_LOG}
if [ $? -gt 0 ]; then
echo "错误: 下载失败" >>${INSTALL_LOG}
Xdialog --title "无法下载pacman安装程序包!" --timeout 20 --no-close \
--infobox "无法下载pacman安装程序包!请确认网络是否正常连接,然后再使用本程序!" 0 0
fi
tar -xzvf pacman-static*.pkg.tar.gz 2>&1 >>${INSTALL_LOG}
fi
[ -f /tmp/usr/bin/pacman.static ] && PACMAN=/tmp/usr/bin/pacman.static
[ -f /tmp/usr/bin/repo-add ] && REPO-ADD=/tmp/usr/bin/repo-add
if [ "$PACMAN" = "" -o "${REPO-ADD} ]; then
echo "错误: 无法找到pacman.static程序,请确认下载的包是否完整!" >>${INSTALL_LOG}
exit 1
fi
}
# 功能函数:在文件夹$1下创建软件仓$2
function create_repo ()
{
echo "$(date +%D" "%T) 在文件夹$1下创建软件仓$2" >>${INSTALL_LOG}
for pkgfile in $(ls $1/*.pkg.tar.gz); do
REPO-ADD $1/$2.db.tar.gz $pkgfile 2>&1 >>${INSTALL_LOG}
done
}
# 功能函数:判断某一软件仓是否已经在pacman.conf中定义
function is_in_pacmanconf ()
{
if [ "x$(cat ${PACMANCONF} | sed -r "s/#.*//" | egrep "\[*${REPO_NAME}\]")" = "x" ]; then echo "0"; fi
}
# 功能函数:将指定自定义软件仓配置加入到pacman.conf
function add_customrepo2pacmanconf ()
{
if [ "$(is_in_pacmanconf ${REPO_NAME} ${PACMANCONF})" = "0" ]; then
sudo sed -i "/# uncommented to enable the repo./ a\
\ \n#本地自定义软件仓\n[${REPO_NAME}]\
\nServer = file://${REPO_DIR} \n" ${PACMANCONF}
if [ $? -eq 0 ]; then
echo "添加${REPO_DIR}下的软件仓${REPO_NAME}成功!" >>${INSTALL_LOG}
else
echo "添加${REPO_DIR}下的软件仓${REPO_NAME}添加错误!请查看${PACMANCONF}!" >>${INSTALL_LOG}
edit_pacmanconf
add_customrepo2pacmanconf
fi
else
echo "该软件仓已经添加到${PACMANCONF},请检查${PACMANCONF}:" >>${INSTALL_LOG}
fi
}
# 是否使用自定义repo,如果使用,则将软件仓配置加入到pacman.conf
function use_my_repo ()
{
Xdialog --title "使用自定义软件" --no-close --yesno "是否使用自己编译的软件?" 0 0
if [ $? -eq 0 ]; then
echo "$(date +%D" "%T) 选择了使用自定义软件仓" >>${INSTALL_LOG}
REPO_DIR=$(Xdialog --stdout --title "请选择自定义软件存放的文件夹" --dselect /mnt 0 0)
REPO_NAME=$(Xdialog --stdout --title "安装GRUB的位置" --inputbox "输入自定义软件仓的名(方便以后使用):" 0 0 "archlive")
create_repo ${REPO_DIR} ${REPO_NAME}
fi
add_customrepo2pacmanconf
}
# 编辑pacman.conf 及软件源清单文件
function edit_pacmanconf ()
{
Xdialog --stdout --title "编辑Arch源清单" --no-close \
--yesno "编辑Arch源清单mirrorlist?" 0 0
if [ $? -eq 0 ]; then
cp /etc/pacman.d/mirrorlist /tmp/mirrorlist
MIRROR_LIST=/tmp/mirrorlist
Xdialog --title "编辑Arch源清单mirrorlist" --fixed-font \
--editbox $MIRROR_LIST 0 0 2>$MIRROR_LIST$$
if [ $? -eq 0 ]; then
mv -f $MIRROR_LIST$$ $MIRROR_LIST
sed -i "s#Include = /etc/pacman.d/mirrorlist#Include = /tmp/mirrorlist#g" $PACMANCONF
fi
fi
Xdialog --stdout --title "编辑pacman.conf" --no-close \
--yesno "编辑Arch软件仓配置文件pacman.conf?" 0 0
if [ $? -eq 0 ]; then
Xdialog --title "编辑pacman.conf" --fixed-font \
--editbox $PACMANCONF 0 0 2>$PACMANCONF$$
if [ $? -eq 0 ]; then
mv -f $PACMANCONF$$ $PACMANCONF
fi
fi
echo "$(date +%D" "%T) $PACMANCONF编辑完成!结果如下: " >>${INSTALL_LOG}
cat $PACMANCONF >>${INSTALL_LOG}
echo "--------------- $PACMANCONF --------------------" >>${INSTALL_LOG}
}
# 功能模块:准备pacman.conf文件
function prepare_pacmanconf ()
{
if [ -f /tmp/pacman.conf ]; then rm -f /tmp/pacman.conf; fi
if [ -f $(pwd)/pacman.conf }; then
cp $(pwd)/pacman.conf /tmp/pacman.conf
else
cp /etc/pacman.conf /tmp/pacman.conf
fi
PACMANCONF=/tmp/pacman.conf
use_my_repo
edit_pacmanconf
}
# 功能模块:自定义软件包存储位置
function prepare_cache ()
{
Xdialog --title "软件包缓存位置" --no-close \
--yesno "是否另外指定Arch软件包缓存位置?\n——如果以前安装Arch时保存过软件包,\n选择该文件夹,可以加快安装速度。" 0 0
if [ $? -eq 0 ]; then
CACHE=$(Xdialog --stdout --title "请选择软件存放位置" --dselect /mnt/ 0 0)
# 将目标系统的/var/cache/pacman/pkg指向刚刚指定的软件包存储位置
if [ ! -d ${INSTALL}/var/cache/pacman ]; then mkdir -p ${INSTALL}/var/cache/pacman; fi
PWD=$(pwd)
cd ${INSTALL}/var/cache/pacman
if [ -d ${INSTALL}/var/cache/pacman/pkg ]; then rm -rf ${INSTALL}/var/cache/pacman/pkg; fi
ln -sfv $CACHE ./pkg
cd $PWD
else
CACHE=${INSTALL}/var/cache/pacman/pkg
if [ ! -d $CACHE ]; then mkdir -p $CACHE; fi
fi
}
# 功能模块:根据指定的软件清单,根据自定义的pacman.conf及自定义软件仓安装软件到目标文件夹
function install_per_list ()
{
mkdir -p "${INSTALL}/var/lib/pacman"
mkdir -p "${INSTALL}/dev"
mknod -m 660 ${INSTALL}/dev/console c 5 1 >/dev/null
mknod -m 660 ${INSTALL}/dev/null c 1 3 >/dev/null
mknod -m 660 ${INSTALL}/dev/zero c 1 5 >/dev/null
[ -e "${INSTALL}/var/lib/pacman/db.lck" ] && (rm -f ${INSTALL}/var/lib/pacman/db.lck)
echo "$(date +%D" "%T) 开始安装程序,先更新软件仓库信息:" >>${INSTALL_LOG}
$PACMAN -Sy --noconfirm --config "${PACMANCONF}" --cachedir "${CACHE}" -fr "${INSTALL}" 2>&1 >>${INSTALL_LOG}
cat "$SOFT_LIST" | grep -v "^#" | while read pkgname; do
echo "$(date +%D" "%T) 安装 $pkgname" >>${INSTALL_LOG}
$PACMAN -S -f --needed --noconfirm --config "${PACMANCONF}" --cachedir "$CACHE" \
-r "${INSTALL}" $pkgname 2>&1 >>${INSTALL_LOG}
done
echo "$(date +%D" "%T) 软件包安装完成!" >>${INSTALL_LOG}
}
# 功能模块:挂载所有分区
function mount_all_partitions ()
{
echo "$(date +%D" "%T) 挂载还没有挂载的分区" >>${INSTALL_LOG}
#Xdialog --title "挂载分区" --timeout 20 --no-close \
# --progress "挂载还没有挂载的分区到/mnt下,请稍候" 0 0
# 想做个进度条,不太清除progress对应用法, 帮助不够全
#
Xdialog --title "挂载分区!" --timeout 20 --no-close \
--infobox "挂载还没有挂载的分区到/mnt下,请稍候!" 0 0
local FSTAB FSTABTMP
FSTAB="/etc/fstab"
if [ -f $FSTAB ]; then rm -f $FSTAB; fi
list_partition_devices | while read DEVICE; do
MNT=$(device_mountdir $DEVICE)
FS=$(device_filesystem $DEVICE)
OPT=$(fs_options $FS fstab)
if [ "$FS" = "swap" ]; then
fstab_add_line $FSTAB $DEVICE $MNT $FS $OPT
fi
if is_supported_filesystem "$FS"; then
if [ "x$OPT" != "x" ]; then
if [ ! -d /mnt/live/mnt/$(basename $DEVICE) ] || [ "x$(ls /mnt/live/mnt/$(basename $DEVICE))" = "x" ]; then
fstab_add_line $FSTAB $DEVICE $MNT $FS $OPT
if [ ! -d /$MNT ]; then mkdir -p "/$MNT"; fi
fi
fi
fi
done
umount -a > /dev/null 2>&1
mount -a > /dev/null 2>&1
if [ $? -eq 0 ]; then
Xdialog --title "挂载分区完成!" --timeout 20 --no-close \
--infobox "挂载分区完成,现在进行下一步" 0 0
echo "$(date +%D" "%T) 挂载分区完成!" >>${INSTALL_LOG}
else
Xdialog --title "挂载部分分区失败" --timeout 50 --no-close \
--icon $warnlogo \
--infobox "请确认是否所有分区格式被目前系统所支持,!\n请更新系统后再运行本安装程序!" 0 0
echo "$(date +%D" "%T) 挂载部分分区失败,请确认是否所有分区被目前系统所支持!\n\
请更新系统后再运行本安装程序!" >>${INSTALL_LOG}
exit 1
fi
}
# 功能函数:选择分区并判断选择的分区是否符合要求
function select_partition ()
{
while true; do
partition=$(Xdialog --stdout --title "请选择$1分区" --dselect /mnt 0 0)
if [ $? -ne 0 ]; then
closed_prog
break
else
if [ "x$(blkid | cut -d ":" -f 1 | grep "$(basename $partition)")" != "x" ] &&\
[ ! -d /mnt/live$partition ] || [ "x$(ls /mnt/live$partition)" = "x" ]; then
echo $partition
break
else
Xdialog --title "!" --time-out 20 --no-cancel --no-buttons \
--infobox "错误!选择的分区无法作为安装的目标分区,\n请重新选择目标分区!" 5 40
fi
fi
done
}
# 功能模块:选择安装的目标分区,/ /home /var /etc
function select_target_partitions ()
{
Xdialog --title "选择安装的目标分区" --timeout 30 --no-close \
--infobox "选择安装的目标分区, 可以将 / /home /var /etc 独立分区,\n\
如果所有的安装到一个分区,则选择分区位置时候选择根分区的位置即可。 " 0 0
echo "$(date +%D" "%T) ***现在选择安装的目标分区:" >>${INSTALL_LOG}
target_root=$(select_partition root)
echo "$(date +%D" "%T) 选择的目标系统root分区为${target_root}" >>${INSTALL_LOG}
target_boot=$(select_partition /boot)
echo "$(date +%D" "%T) 选择的目标系统/boot分区为${target_boot}" >>${INSTALL_LOG}
target_home=$(select_partition /home)
echo "$(date +%D" "%T) 选择的目标系统/home分区为${target_home}" >>${INSTALL_LOG}
target_var=$(select_partition /var)
echo "$(date +%D" "%T) 选择的目标系统/var分区为${target_var}" >>${INSTALL_LOG}
target_etc=$(select_partition /etc)
echo "$(date +%D" "%T) 选择的目标系统/etc分区为${target_etc}" >>${INSTALL_LOG}
}
# 功能模块:是否已经准备好分区,如果没有则调用gparted分区
function prepare_partitions ()
{
Xdialog --title "准备分区" --yesno "\n是否已经准备好安装的目标分区?\n如果还没有分区或者没有将目标分区格式化为需要的文件系统\n\
则选NO调用Gparted进行分区、格式化" 0 0
if [ $? -ne 0 ]; then
echo "$(date +%D" "%T) 选择调用分区软件Gparted进行分区" >>${INSTALL_LOG}
gparted >>${INSTALL_LOG} 2>&1
echo "$(date +%D" "%T) Gparted分区完成" >>${INSTALL_LOG}
fi
}
# 功能函数:文件夹拷贝
# $1 需要复制的目录
# ${INSTALL}安装的目标分区挂载的目录,例如/tmp/install
function copydir ()
{
d=$( dirname $1 )
if [ "${d}" == "/" ]; then
cp -af $1 ${INSTALL}
echo "$(date +%D" "%T) 复制$1到${INSTALL}" >>${INSTALL_LOG}
else
mkdir -p ${INSTALL}${d}
cp -af $1 ${INSTALL}${d}
echo "$(date +%D" "%T) 复制$1到${INSTALL}${d}" >>${INSTALL_LOG}
fi
}
# 功能函数,挂载分区到指定目录
function mount_target_partition ()
{
#umount -l /dev/$(basename $1)
#mount /dev/$(basename $1) $INSTALL/${2}
mount --move $1 $INSTALL/${2}
echo "$(date +%D" "%T) 挂载目标${targetpartition#target_}分区$1到$INSTALL/${2}" >>${INSTALL_LOG}
}
# 功能模块: 重新挂载目标分区
function remount_target_partitions ()
{
echo "$(date +%D" "%T) 挂载相应分区到$INSTALL" >>${INSTALL_LOG}
mkdir -p $INSTALL/{boot,home,var,etc}
# 这步花了些时间,不过最后查到bash的新的变量间接引用功能才得以优化!
for targetpartition in target_root target_boot target_var target_home target_etc; do
if [ "$targetpartition" = "target_root" ]; then
mount_target_partition ${!targetpartition} ""
else
if [ "${!targetpartition}" != "${target_root}" ]; then
mount_target_partition ${!targetpartition} ${targetpartition#target_}
fi
fi
done
echo "$(date +%D" "%T) 创建pacman需要的目录" >>${INSTALL_LOG}
! [ -d $INSTALL/var/lib/pacman ] && mkdir -p $INSTALL/var/lib/pacman
! [ -d /var/lib/pacman ] && mkdir -p /var/lib/pacman
echo "$(date +%D" "%T) 挂载proc sys dev以使mkinitcpio正常工作" >>${INSTALL_LOG}
! [ -d $INSTALL/proc ] && mkdir $INSTALL/proc
! [ -d $INSTALL/sys ] && mkdir $INSTALL/sys
! [ -d $INSTALL/dev ] && mkdir $INSTALL/dev
mount -t proc none $INSTALL/proc
mount -t sysfs none $INSTALL/sys
mount -o bind /dev $INSTALL/dev
}
# 功能模块:复制安装
function copyall ()
{
echo "$(date +%D" "%T) 复制文件到$INSTALL" >>${INSTALL_LOG}
Xdialog --title "复制文件" --time-out 20 --no-cancel --no-buttons \
--infobox "正在复制文件到目标分区" 5 40
for dir in /boot /usr /home /bin /etc /root /sbin /srv /lib /opt /home /var; do
copydir $dir
done
}
# 功能模块:提示安装成功
function finished_installation ()
{
Xdialog --title "恭喜,安装完成!" --time-out 10 --no-cancel --no-buttons \
--infobox "恭喜, 安装完成!如果要看安装日志\n请直接打开文件${INSTALL_LOG}" 5 40
echo "$(date +%D" "%T) 安装完成,自动退出安装程序! " >>${INSTALL_LOG}
}
# 功能函数:获取指定设备的UUID
# $1 设备名 比如/dev/sda1
# 如果获取成功则返回设备的UUID,否则返回空
getuuid()
{
if [ "${1%%/[hs]d?[0-9]}" != "${1}" ]; then
echo "$(blkid -s UUID -o value ${1})"
fi
}
# 功能函数:更新fstab条目
function add_fstab ()
{
if [ "$uuid" = "n" ]; then $DEVICE=/dev/$(basename $1); else $DEVICE=$(getuuid /dev/$(basename $1)); fi
MNT=$(device_mountdir /dev/$(basename $1))
FS=$(device_filesystem /dev/$(basename $1))
OPT=$(fs_options $FS fstab)
if [ "x$OPT" != "x" ]; then fstab_add_line $FSTAB $DEVICE $MNT $FS $OPT; fi
}
# 功能模块: 更新fstab
function update_target_fstab ()
{
useuuid=$(Xdialog --stdout --screen-center --backtitle "选择fstab中设备描述方式" --title "fstab中设备描述用UUID还是设备名比如/dev/sda1" \
--radiolist "Select methods in fstab:" 15 80 0 \
"1" "使用UUID" off \
"2" "直接使用设备名" ON)
if [ "$useuuid" = 1 ]; then uuid="y"; else uuid="n"; fi
mkdir $INSTALL/mnt
if [ -f $INSTALL/etc/fstab ]; then rm -f $INSTALL/etc/fstab; fi
echo "#### 以下内容为Archlive installer自动添加 ####" >$INSTALL/etc/fstab
FSTAB="$INSTALL/etc/fstab"
for targetpartition in target_root target_boot target_var target_home target_etc; do
if [ "$targetpartition" = "target_root" ]; then
add_fstab ${!targetpartition} ""
else
if [ "${!targetpartition}" != "${target_root}" ]; then
add_fstab ${!targetpartition}
fi
fi
done
list_cdrom_devices | while read DEVICE; do
MNT=$(device_mountdir $DEVICE)
FS=$(device_filesystem $DEVICE)
if [ "$FS" = "" ]; then FS=iso9660; fi
fstab_add_line $FSTAB "#$DEVICE" $MNT $FS $(fs_options $FS fstab)
done
list_partition_devices | while read DEVICE; do
MNT=$(device_mountdir $DEVICE)
FS=$(device_filesystem $DEVICE)
OPT=$(fs_options $FS fstab)
if [ "$FS" = "swap" ]; then fstab_add_line $FSTAB $DEVICE $MNT $FS $OPT; fi
# If the partition has a valid filesystem, add it to fstab
if is_supported_filesystem "$FS"; then
if [ "x$OPT" != "x" ]; then fstab_add_line $FSTAB $DEVICE $MNT $FS $OPT; fi
fi
done
fstab_add_line $FSTAB none /proc proc defaults
fstab_add_line $FSTAB none /sys sysfs defaults
fstab_add_line $FSTAB none /dev/pts devpts gid=5,mode=620
fstab_add_line $FSTAB tmpfs /dev/shm tmpfs defaults
fstab_add_line $FSTAB tmpfs /tmp tmpfs defaults
fstab_add_line $FSTAB tmpfs /tmp tmpfs defaults,mode=1777
fstab_add_line $FSTAB tmpfs /var/tmp tmpfs defaults,mode=1777
fstab_add_line $FSTAB tmpfs /var/log tmpfs defaults,mode=0755,size=1M
echo "$(date +%D" "%T) 修正目标系统fstab中的盘符sdb sdc到sda(如果启动前出入了U盘启动可能就需要修正)" >>${INSTALL_LOG}
sed -i "s%sd[b-z]%sda%g" $FSTAB
Xdialog --title "编辑、查看目标系统的fstab" --fixed-font \
--editbox $FSTAB 0 0 2>$FSTAB$$
if [ $? -eq 0 ]; then mv -f $FSTAB$$ $FSTAB; fi
echo "$(date +%D" "%T) 目标系统fstab更新完成!结果如下: " >>${INSTALL_LOG}
cat $FSTAB >>${INSTALL_LOG}
echo "-------- fstab --------------------" >>${INSTALL_LOG}
}
# 功能模块:创建启动内核镜像
function mkinitrdimg ()
{
idir=${INSTALL}/etc/mkinitcpio.d
presets=$( ls ${idir} | grep "^kernel.*\.preset$" )
echo "将mkinitcpio.conf中的ide替换为pata" >>${INSTALL_LOG}
if egrep "^HOOKS=.* pata" ${INSTALL}/etc/mkinitcpio.conf &>/dev/null; then
rplc=""
else
rplc=" pata"
fi
sed -i "s|\(^HOOKS=.*\) ide|\1${rplc}|" ${INSTALL}/etc/mkinitcpio.conf 2>&1 >>${INSTALL_LOG}
echo "$(date +%D" "%T) 重新以 --bind 方式挂载proc sys dev以使mkinitcpio正常工作:" >>${INSTALL_LOG}
mount --bind /proc ${INSTALL}/proc 2>&1 >>${INSTALL_LOG}
mount --bind /sys ${INSTALL}/sys 2>&1 >>${INSTALL_LOG}
mount --bind /dev ${INSTALL}/dev 2>&1 >>${INSTALL_LOG}
echo "$(date +%D" "%T) 开始创建目标系统的启动内核镜像: " >>${INSTALL_LOG}
cat /proc/mounts | grep ${INSTALL} | sed "s|${INSTALL}|/|" | \
sed "s|//|/|" >${INSTALL}/etc/mtab 2>&1 >>${INSTALL_LOG}
#创建启动内核镜像
chroot ${INSTALL} /sbin/mkinitcpio -p ${presets%.preset} 2>&1 >>${INSTALL_LOG}
:>${INSTALL}/etc/mtab
umount ${INSTALL}/dev
umount ${INSTALL}/sys
umount ${INSTALL}/proc
Xdialog --title "启动内核镜像创建完成!" --time-out 10 --no-cancel --no-buttons \
--infobox "启动内核镜像创建完成,现在进行下一步。" 5 40
echo "$(date +%D" "%T) 启动内核镜像创建完成。" >>${INSTALL_LOG}
}
#功能函数:初始化menu.lst
function init_menu_list ()
{
menulist=${INSTALL}/boot/grub/menu.lst
echo "$(date +%D" "%T) 初始化$menulist文件" >>${INSTALL_LOG}
if [ -f $menulist ]; then rm -f $menulist; fi
echo "###### menu.lst由archlive-installer于$(date +%D" "%T)初始化 ######" > $menulist
echo "timeout 300" >> $menulist
echo "default 0" >>$menulist
echo "" >>$menulist
kernels=( $( ls ${INSTALL}/boot/vmlinuz* 2>/dev/null ) )
if [ ${#kernels[@]} -ne 1 ]; then
echo " 警告:在${INSTALL}/boot/下发现两个内核文件。" >>${INSTALL_LOG}
Xdialog --title "警告!" --time-out 20 --no-cancel --no-buttons \
--infobox "警告:在${INSTALL}/boot/下发现两个内核文件,\n请选择一个内核作为启动内核。" 5 40
kernel=$(Xdialog --stdout --title "请选择一个内核文件(vmlinuz或者vmlinuz26作为启动内核" \
--fselect "${INSTALL}/boot/vmlinuz26" 0 0)
echo "$(date +%D" "%T) 选择了$kernel作为最终的启动内核。" >>${INSTALL_LOG}
boot_kernel=$(basename ${kernel})
else
boot_kernel=$(basename ${kernels})
fi
presets=$(ls ${INSTALL}/etc/mkinitcpio.d | grep "^kernel.*\.preset$" )
source ${INSTALL}/etc/mkinitcpio.d/$presets
imgname=$(basename ${default_image})
fallbackimgname=$(basename ${fallback_image})
bootindex=${target_boot#/dev/sd[a-z]}
let bootindex-=1
if [ "${target_boot}" != "${target_root}" ]; then bootdir=""; else bootdir="/boot"; fi
echo "title Arch Linux (Installed by Archlive-installer)" >>$menulist
echo "root (hd0,$bootindex)" >>$menulist
echo "kernel $bootdir/${boot_kernel} root=/dev/sda${target_root#/dev/sd[a-z]} ro vga=791" >>$menulist
echo "initrd $bootdir/$imgname" >>$menulist
echo "" >>$menulist
echo "title Arch Linux (Safemode, Installed by Archlive-installer)" >>$menulist
echo "root (hd0,$bootindex)" >>$menulist
echo "kernel $bootdir/${boot_kernel} root=/dev/sda${target_root#/dev/sd[a-z]} ro vga=791" >>$menulist
echo "initrd $bootdir/$fallbackimgname" >>$menulist
echo "" >>$menulist
if [ -f /mnt/sd[a-z]1/ntldr ]; then
echo " ---> 发现/dev/sda1下安装有Windows系统(WinXp Win 2003...)" >>${INSTALL_LOG}
echo "title MS Windwos OS" >>$menulist
echo "rootnoverify (hd0,0)" >>$menulist
echo "makeactive" >>$menulist
echo "chainloader +1" >>$menulist
fi
echo "###### List above was created by Archlive-installer ######" >>$menulist
echo "$(date +%D" "%T) 初始化$menulist文件完成,内容如下:" >>${INSTALL_LOG}
cat $menulist >>${INSTALL_LOG}
}
# 功能函数:安装grub
function installgrub ()
{
echo "$(date +%D" "%T) 开始安装GRUB到$1:" >>${INSTALL_LOG}
mount --bind /proc ${INSTALL}/proc
mount --bind /sys ${INSTALL}/sys
mount --bind /dev ${INSTALL}/dev
cat /proc/mounts | grep ${INSTALL} | sed "s|${INSTALL}|/|" | \
sed "s|//|/|" >${INSTALL}/etc/mtab
chroot ${INSTALL} /sbin/grub-install --no-floppy $1 2>&1 >>${INSTALL_LOG}
: >${INSTALL}/etc/mtab
umount ${INSTALL}/dev
umount ${INSTALL}/sys
umount ${INSTALL}/proc
echo "$(date +%D" "%T) 安装GRUB到$1完成。" >>${INSTALL_LOG}
Xdialog --title "GRUB已经成功安装" --time-out 20 --no-cancel --no-buttons \
--infobox "GRUB已经成功安装到$1,现在进行下一步。" 5 40
}
#功能模块: 安装配置bootloader
function prepare_bootloader ()
{
# 以下步骤非必须,但为了有人自己编辑菜单,就先复制相关文件,避免安装grub出错.
if [ ! -d ${INSTALL}/boot/grub ]; then
mkdir -p ${INSTALL}/boot/grub
cp -af ${INSTALL}/usr/lib/grub/i386-pc/* ${INSTALL}/boot/grub/
fi
# 初始化menu.lst
init_menu_list
Xdialog --title "是否安装GRUB?" --no-close --yesno "是否安装GRUB?" 0 0
if [ $? -eq 0 ]; then
location=$(Xdialog --stdout --title "安装GRUB的位置" --inputbox "输入安装GRUB的位置\n(如果启动前已经插入U盘,实际硬盘盘符可能是/dev/sdb或者/dev/sdc...请小心输入):" 0 0 "/dev/sda")
installgrub $location
fi
Xdialog --stdout --title "编辑menu.lst?" --no-close \
--yesno "编辑GRUB的启动菜单配置文件menu.lst?" 0 0
if [ $? -eq 0 ]; then
menulist=$(Xdialog --stdout --title "选择预编辑的Menu.lst" --fselect "${INSTALL}/boot/grub/menu.lst" 0 0)
Xdialog --title "编辑menu.lst" --fixed-font \
--editbox $menulist 0 0 2>$menulist$$
if [ $? -eq 0 ]; then
mv -f $menulist$$ $menulist
echo "$(date +%D" "%T) menu.lst编辑完成!结果如下: " >>${INSTALL_LOG}
cat $menulist >>${INSTALL_LOG}
echo "--------------- $menulist --------------------" >>${INSTALL_LOG}
fi
fi
}
function newinstall ()
{
echo "$(date +%D" "%T)----${NEW_INSTALL}----开始----" >>${INSTALL_LOG}
no_this_function
#finished_installation
}
function newquickinstall ()
{
echo "$(date +%D" "%T)----${NEW_QUICKINSTALL}----开始----" >>${INSTALL_LOG}
prepare_partitions #分区
mount_all_partitions #挂载分区以选择目标分区,挂载于/mnt下
select_target_partitions #选择目标安装分区
remount_target_partitions #重新挂载目标安装分区到$INSTALL下
prepare_installer #准备安装程序
prepare_pacmanconf #准备pacman.conf文件,是否自定义repo,是否自定义mirrorlist
prepare_cache #自定义安装过程中下载的软件包存储位置
prepare_softlist #自定义预安装的软件清单
install_per_list #按照定义的软件清单安装到目标分区
update_target_fstab #更新目标系统的fstab文件
prepare_bootloader #编辑menu.lst,安装grub
finished_installation #完成安装的提示
}
function copyinstall ()
{
echo "$(date +%D" "%T)----${COPY_INSTALL}----开始----" >>${INSTALL_LOG}
prepare_partitions #分区
mount_all_partitions #挂载分区以选择目标分区,挂载于/mnt下
select_target_partitions #选择目标安装分区
remount_target_partitions #重新挂载目标安装分区到$INSTALL下
copyall #将archlive的各个目录复制到目标系统
update_target_fstab #更新目标系统的fstab文件
mkinitrdimg #创建目标系统的内核镜像文件
prepare_bootloader #编辑menu.lst,安装grub
finished_installation #完成安装的提示
}
############################
# 主程序
###########################
function mainmenu ()
{
selection=$(Xdialog --stdout --screen-center --backtitle "Archlive 安装程序 " --title "选择安装方式" \
--radiolist "请在如下列表中选择安装方式(安装日志文件保存于${INSTALL_LOG}):" 15 80 0 \
"1" "${NEW_INSTALL}" off \
"2" "${NEW_QUICKINSTALL}" off \
"3" "${COPY_INSTALL}" ON)
case $? in
0)
#选择安装方式程序正常执行
if [ ! -f ${INSTALL_LOG} ]; then touce ${INSTALL_LOG}; fi
if [ "x$(grep "重新选择安装方式" ${INSTALL_LOG})" != "x" -a "x$(grep "安装完成" ${INSTALL_LOG})" = "x" ]; then
echo "-->$(date +%D" "%T) 选择了安装方式$selection" >>${INSTALL_LOG}
else
echo "$(date +%D" "%T) 选择了安装方式$selection" >${INSTALL_LOG}
fi
case $selection in
1) newinstall ;;
2) newquickinstall ;;
3) copyinstall ;;
esac
;;
1)
echo "$(date +%D" "%T) 选择了取消退出程序." >>${INSTALL_LOG} ;;
255)
echo "$(date +%D" "%T) 关闭程序." >>${INSTALL_LOG} ;;
esac
}
mainmenu
作者: carbonjiao 发布时间: 2009-06-28
作者: omegao 发布时间: 2009-06-29
作者: gza633 发布时间: 2009-06-29
作者: jarryson 发布时间: 2009-06-29
欢迎大家提出宝贵意见。。。
作者: carbonjiao 发布时间: 2009-06-29
|
作者: jarryson
惨无人道的围观
|
作者: imagelife 发布时间: 2009-06-29
呵呵
作者: athurg 发布时间: 2009-07-01
|
作者: athurg
carbon兄老这样骗精华不厚道了哈!
呵呵 |
名副其实的自主知识产权阿。。。!哈
作者: carbonjiao 发布时间: 2009-07-01
大家都喜欢聊聊天,不大做实事的。
script收下了,测试测试。
作者: seekcalma 发布时间: 2009-07-03
修补前一版本的bug——系统启动时已经插入U盘或者移动硬盘导致盘符非/dev/sda的时候无法正确确定menu.lst fstab设备名的问
题。同时加入Xdialog程序是否在系统存在的判断。
新加入功能: 在非Arch环境下,也可以利用该脚本根据软件清单快速定制安装Arch GNU/Linux。。。
http://archlive.googlecode.com/files/archlive-installer
作者: carbonjiao 发布时间: 2009-07-07
作者: 月魄孤魂 发布时间: 2009-07-08
作者: iMocu 发布时间: 2009-07-09
作者: sokoo 发布时间: 2009-07-11
作者: vacuumboby 发布时间: 2010-04-16
作者: lmguy 发布时间: 2010-04-16
作者: blance 发布时间: 2010-04-17
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28















