单文件实现livecd自动升级

Ubuntu各种衍生版本
回复
头像
citydream
帖子: 130
注册时间: 2007-04-30 22:28

单文件实现livecd自动升级

#1

帖子 citydream » 2014-12-21 21:47

#!/bin/bash

# Ubuntu LiveCD Auto-updater V1.0, Dec 21st,2014
# Copyright (C) 2014 citydream <citydream@163.com>

# 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>.
ISONAME=ubuntu-12.04.5-desktop-i386.iso #需更新的ISO文件,置于home目录
NEWISO=ubuntu-12.04.5-new-desktop-i386.iso #更新后的iso文件名,自动保存在WORK目录
ROOTREE=casper #root目录
tempdir=ubuntu-livecd #livecd 临时目录
ubuntufs=ubuntu-fs.ext4 #loop文件
livecdfs=filesystem.squashfs #livecd中主文件
ISOLABLE="Ubuntu LTS Live CD" #ISO卷标,建议不超过16个字符
export WORK=~/diy_ubuntu #设定工作目录,保证空闲空间在10G以上
if [ ! -d $WORK ] ;then mkdir -p $WORK; fi #若工作目录不存在则建立
cd $WORK #进入工作目录
if [ ! -d $WORK/$tempdir ] ;then mkdir $WORK/$tempdir; fi #若目录不存在则建立
if [ $(du -sx $WORK/$tempdir | cut -f1) -lt 600000 ] ;then sudo mount -t iso9660 -o loop ~/$ISONAME /mnt && cp -a /mnt/. $tempdir && chmod -R u+w $tempdir && sudo umount /mnt; fi #将livecd内容复制到解压目录,卸载livecd
if [ ! -d $WORK/old ] ;then mkdir $WORK/old; fi #若目录不存在则建立
if [ ! -f $WORK/$ubuntufs ] ;then sudo mount -t squashfs -o loop,ro $WORK/$tempdir/$ROOTREE/$livecdfs $WORK/old;sudo dd if=/dev/zero of=$WORK/$ubuntufs bs=1M count=5500; echo y | sudo mkfs.ext4 $WORK/$ubuntufs; fi #建立临时目录并挂载$livecdfs文件,新建loop文件(5.5G)并将loop文件格式化为ext4格式
if [ ! -d $WORK/new ] ;then mkdir $WORK/new; fi #若目录不存在则建立
sudo mount -o loop $WORK/$ubuntufs $WORK/new #将loop文件挂载到工作目录
if [ $(sudo du -sx $WORK/new | cut -f1) -le 20 ] ;then sudo cp -a $WORK/old/. $WORK/new && sudo umount $WORK/old; fi #解压$livecdfs文件到工作目录并卸载临时目录
if [ $(du -sx $WORK/old | cut -f1) -gt 0 ] ;then umount $WORK/old; fi #卸载old目录
export Sourceurl=http://mirrors.aliyun.com/ubuntu/ #用阿里源覆盖livecd默认源,提升下载速度
export Listclass="main restricted universe multiverse"
export Codename=precise #以ubuntu 12.04举例
sourceslist(){
echo "deb $Sourceurl $Codename $Listclass
deb-src $Sourceurl $Codename $Listclass
deb $Sourceurl $Codename-updates $Listclass
deb-src $Sourceurl $Codename-updates $Listclass
deb $Sourceurl $Codename-backports $Listclass
deb-src $Sourceurl $Codename-backports $Listclass
deb $Sourceurl $Codename-security $Listclass
deb-src $Sourceurl $Codename-security $Listclass
# deb http:\\archive.canonical.com\ubuntu $Codename partner
# deb-src http:\\archive.canonical.com\ubuntu $Codename partner
# deb http:\\extras.ubuntu.com\ubuntu $Codename main
# deb-src http:\\extras.ubuntu.com\ubuntu $Codename main"
}
sourceslist>sources.list && sudo mv sources.list $WORK/new/etc/apt/
cat > autoupdate.sh <<EOF
#!/bin/bash
mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts; export HOME=/root; export LC_ALL=C; dbus-uuidgen > /var/lib/dbus/machine-id; dpkg-divert --local --rename --add /sbin/initctl; ln -s /bin/true /sbin/initctl #挂载一些必须目录
apt-get update
apt-get upgrade -y #更新系统
apt-get autoremove; apt-get clean; apt-get autoclean; dpkg -l | grep ^rc|awk '{print $2}' | sudo xargs dpkg -P; apt-get check
rm /etc/NetworkManager/system-connections/*; rm /var/crash/*; rm -rf ~/.local/share/recently-used.xbel; rm -rf ~/.thumbnails/fail/gnome-thumbnail-factory/*; rm -rf /tmp/*; rm -rf ~/.bash_history; rm /home/*.* && rm /home/*; rm /etc/hosts; rm /etc/resolv.conf; rm /var/lib/dbus/machine-id; rm /sbin/initctl; dpkg-divert --rename --remove /sbin/initctl; umount /proc || umount -lf /proc; umount /sys; umount /dev/pts; exit #删除临时文件,退出chroot
EOF
chmod 755 autoupdate.sh #设定为可执行文件
sudo mv autoupdate.sh $WORK/new/ #移动到系统中
sudo cp /etc/resolv.conf $WORK/new/etc/; sudo mount -t proc -o bind /proc $WORK/new/proc; sudo chroot $WORK/new /bin/bash ./autoupdate.sh #choot到系统并执行自动升级
sudo rm $WORK/new/autoupdate.sh; sudo umount $WORK/new/proc -l; sudo fuser -m -v -i -k $WORK/new/proc; sudo rm $WORK/new/etc/resolv.conf #清理垃圾
cd $WORK/new; sudo chroot $WORK/new dpkg-query -W --showformat='${Package} ${Version}\n' > $WORK/$tempdir/$ROOTREE/filesystem.manifest #更新系统软件清单
printf $(sudo du -sx --block-size=1 $WORK/new | cut -f1) > $WORK/$tempdir/$ROOTREE/filesystem.size #计算安装到硬盘所需空间
while true
do
echo "continue mkfs?(y/n/q)"
read yn
if [ "$yn" = "y" ];then #按y则继续制作压缩文件
sudo mksquashfs $WORK/new $WORK/$tempdir/$ROOTREE/$livecdfs -noappend -b 1048576 -comp xz #更新系统
break;
elif [ "$yn" = "n" ];then #按n则跳过直接执行后续命令(无新更新时可以节约打包时间)
break;
else #按其他键直接退出程序
cd ~ && sudo umount $WORK/new && exit
fi
done
today=`date +%Y%m%d%H%M%S`; sed -i "s/(.*.)/(${today})/" $WORK/$tempdir/.disk/info #修改系统更新时间
cd $WORK/$tempdir; rm md5sum.txt; find . -type f -print0 |xargs -0 md5sum | grep -v ./md5sum.txt | tee md5sum.txt #更新ISO内文件md5
cd $WORK
if [ -f $NEWISO ] ;then mv $NEWISO $NEWISO."$today"; fi #如果新ISO文件已存在则改名
mkisofs -o $NEWISO -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -r -V "$ISOLABLE" -cache-inodes -J -l $tempdir; find $NEWISO -type f -print0 |xargs -0 md5sum | tee $NEWISO.md5 #重新打包iso文件
sudo umount $WORK/new #卸载工作目录
echo "$WORK/$ubuntufs still there"
cd ~
附件
ubuntu-livecd-autoupdater.zip
(2.9 KiB) 已下载 241 次
Citydream is always by your side...
回复