Skip to content

Instantly share code, notes, and snippets.

@rmanalan
Last active May 13, 2016 19:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rmanalan/60cf362c5bd185ffcd748127f4499e6b to your computer and use it in GitHub Desktop.
Save rmanalan/60cf362c5bd185ffcd748127f4499e6b to your computer and use it in GitHub Desktop.
usage()
{
cat << EOF
usage: $0 options
ChrUbuntu installation script.
OPTIONS:
-h show help.
-m Ubuntu metapackage to install such as xubuntu-desktop, kubuntu-desktop or ubuntu-minimal. Default is ubuntu-desktop
-a Architecture to install (i386, amd64). Default is amd64 (64-bit).
-t Target drive to install to (/dev/mmcblk1, /dev/sdb, etc). Default is the builtin SSD.
-u Ubuntu version to install (lts, dev, 10.10, etc). Default is latest stable release.
EOF
}
echo_red()
{
echo -e "\E[1;31m$1"
echo -e '\e[0m'
}
echo_green()
{
echo -e "\E[1;32m$1"
echo -e '\e[0m'
}
echo_yellow()
{
echo -e "\E[1;33m$1"
echo -e '\e[0m'
}
target_disk=""
ubuntu_arch="amd64"
ubuntu_metapackage="ubuntu-desktop"
ubuntu_version="latest"
while getopts "hm:a:t:u:" OPTION
do
case $OPTION in
h)
usage
exit
;;
m)
ubuntu_metapackage=$OPTARG
;;
a)
ubuntu_arch=$OPTARG
;;
t)
target_disk=$OPTARG
;;
u)
ubuntu_version=$OPTARG
;;
?)
usage
exit
;;
esac
done
echo_green "Determining support for legacy boot..."
LEGACY_LOCATION="`mosys -k eeprom map | grep RW_LEGACY`"
if [ "$LEGACY_LOCATION" = "" ]; then
echo_red "Error: this Chrome device does not seem to support CTRL+L Legacy SeaBIOS booting. Use the old ChrUbuntu script please..."
exit 1
fi
echo_green "This system supports legacy boot. Good."
powerd_status="`initctl status powerd`"
if [ ! "$powerd_status" = "powerd stop/waiting" ]
then
echo_green "Stopping powerd to keep display from timing out..."
initctl stop powerd
fi
setterm -blank 0
if [ "$target_disk" != "" ]; then
echo_green "Got ${target_disk} as target drive"
echo ""
echo_yellow "WARNING! All data on this device will be wiped out! Continue at your own risk!"
echo ""
read -p "Press [Enter] to install ChrUbuntu on ${target_disk} or CTRL+C to quit"
ext_size="`blockdev --getsz ${target_disk}`"
aroot_size=$((ext_size - 65600 - 33))
parted --script ${target_disk} "mktable gpt"
cgpt create ${target_disk}
cgpt add -i 6 -b 64 -s 32768 -S 1 -P 5 -l GRUB-BOOT -t "reserved" ${target_disk}
cgpt add -i 7 -b 65600 -s $aroot_size -l ROOT-A -t "rootfs" ${target_disk}
sync
blockdev --rereadpt ${target_disk}
partprobe ${target_disk}
crossystem dev_boot_usb=1
parted ${target_disk} set 6 bios_grub on
else
target_disk="`rootdev -d -s`"
# Do partitioning (if we haven't already)
ckern_size="`cgpt show -i 6 -n -s -q ${target_disk}`"
croot_size="`cgpt show -i 7 -n -s -q ${target_disk}`"
state_size="`cgpt show -i 1 -n -s -q ${target_disk}`"
max_ubuntu_size=$(($state_size/1024/1024/2))
rec_ubuntu_size=$(($max_ubuntu_size - 1))
# If KERN-C and ROOT-C are one, we partition, otherwise assume they're what they need to be...
if [ "$ckern_size" = "1" -o "$croot_size" = "1" ]
then
while :
do
read -p "Enter the size in gigabytes you want to reserve for Ubuntu. Acceptable range is 5 to $max_ubuntu_size but $rec_ubuntu_size is the recommended maximum: " ubuntu_size
if [ ! $ubuntu_size -ne 0 2>/dev/null ]
then
echo_red "\n\nNumbers only please...\n\n"
continue
fi
if [ $ubuntu_size -lt 5 -o $ubuntu_size -gt $max_ubuntu_size ]
then
echo_red "\n\nThat number is out of range. Enter a number 5 through $max_ubuntu_size\n\n"
continue
fi
break
done
# We've got our size in GB for ROOT-C so do the math...
#calculate sector size for rootc
rootc_size=$(($ubuntu_size*1024*1024*2))
#kernc is always 16mb
kernc_size=32768
#new stateful size with rootc and kernc subtracted from original
stateful_size=$(($state_size - $rootc_size - $kernc_size))
#start stateful at the same spot it currently starts at
stateful_start="`cgpt show -i 1 -n -b -q ${target_disk}`"
#start kernc at stateful start plus stateful size
kernc_start=$(($stateful_start + $stateful_size))
#start rootc at kernc start plus kernc size
rootc_start=$(($kernc_start + $kernc_size))
#Do the real work
echo_green "\n\nModifying partition table to make room for Ubuntu."
echo_green "Your Chromebook will reboot, wipe your data and then"
echo_green "you should re-run this script..."
umount -f /mnt/stateful_partition
# stateful first
cgpt add -i 1 -b $stateful_start -s $stateful_size -l STATE ${target_disk}
# now kernc
cgpt add -i 6 -b $kernc_start -s $kernc_size -l KERN-C -t "kernel" ${target_disk}
# finally rootc
cgpt add -i 7 -b $rootc_start -s $rootc_size -l ROOT-C ${target_disk}
reboot
exit
fi
fi
if [ "$ubuntu_version" = "lts" ]
then
ubuntu_version=`wget --quiet -O - http://changelogs.ubuntu.com/meta-release | grep "^Version:" | grep "LTS" | tail -1 | sed -r 's/^Version: ([^ ]+)( LTS)?$/\1/'`
tar_file="http://cdimage.ubuntu.com/ubuntu/releases/$ubuntu_version/release/ubuntu-$ubuntu_version-core-$ubuntu_arch.tar.gz"
elif [ "$ubuntu_version" = "latest" ]
then
ubuntu_version=`wget --quiet -O - http://changelogs.ubuntu.com/meta-release | grep "^Version: " | tail -1 | sed -r 's/^Version: ([^ ]+)( LTS)?$/\1/'`
tar_file="http://cdimage.ubuntu.com/ubuntu/releases/$ubuntu_version/release/ubuntu-$ubuntu_version-core-$ubuntu_arch.tar.gz"
elif [ $ubuntu_version = "dev" ]
then
ubuntu_version=`wget --quiet -O - http://changelogs.ubuntu.com/meta-release-development | grep "^Version: " | tail -1 | sed -r 's/^Version: ([^ ]+)( LTS)?$/\1/'`
ubuntu_animal=`wget --quiet -O - http://changelogs.ubuntu.com/meta-release-development | grep "^Dist: " | tail -1 | sed -r 's/^Dist: (.*)$/\1/'`
tar_file="http://cdimage.ubuntu.com/ubuntu/daily/current/$ubuntu_animal-core-$ubuntu_arch.tar.gz"
else
tar_file="http://cdimage.ubuntu.com/ubuntu/releases/$ubuntu_version/release/ubuntu-$ubuntu_version-core-$ubuntu_arch.tar.gz"
fi
echo_green "Installing Ubuntu ${ubuntu_version} with metapackage ${ubuntu_metapackage}\n"
echo_green "Installing Ubuntu Arch: $ubuntu_arch\n"
read -p "Press [Enter] to continue..."
if [[ "${target_disk}" =~ "mmcblk" ]]
then
target_rootfs="${target_disk}p7"
target_kern="${target_disk}p6"
else
target_rootfs="${target_disk}7"
target_kern="${target_disk}6"
fi
echo_green "Target Kernel Partition: $target_kern Target Root FS: ${target_rootfs}"
if mount|grep ${target_rootfs}
then
echo_red "Refusing to continue since ${target_rootfs} is formatted and mounted. Try rebooting"
exit
fi
mkfs.ext4 ${target_rootfs}
if [ ! -d /tmp/urfs ]
then
mkdir /tmp/urfs
fi
mount -t ext4 ${target_rootfs} /tmp/urfs
wget -O - $tar_file | tar xzvvp -C /tmp/urfs/
mount -o bind /proc /tmp/urfs/proc
mount -o bind /dev /tmp/urfs/dev
mount -o bind /dev/pts /tmp/urfs/dev/pts
mount -o bind /sys /tmp/urfs/sys
if [ -f /usr/bin/old_bins/cgpt ]
then
cp /usr/bin/old_bins/cgpt /tmp/urfs/usr/bin/
else
cp /usr/bin/cgpt /tmp/urfs/usr/bin/
fi
chmod a+rx /tmp/urfs/usr/bin/cgpt
cp /etc/resolv.conf /tmp/urfs/etc/
echo chrubuntu > /tmp/urfs/etc/hostname
echo -e "\n127.0.1.1 chrubuntu" >> /tmp/urfs/etc/hosts
cr_install="wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
add-apt-repository \"deb http://dl.google.com/linux/chrome/deb/ stable main\"
apt-get update
apt-get -y install google-chrome-stable"
echo -e "export DEBIAN_FRONTEND=noninteractive
apt-get -y update
apt-get -y dist-upgrade
apt-get -y install ubuntu-minimal
apt-get -y install wget
apt-get -y install software-properties-common
add-apt-repository main
add-apt-repository universe
add-apt-repository restricted
add-apt-repository multiverse
apt-get update
apt-get -y install $ubuntu_metapackage
$cr_install
apt-get -y install linux-generic
apt-get -y install grub-pc
grub-mkconfig -o /boot/grub/grub.cfg
grub-install ${target_disk} --force
mykern=\`ls /boot/vmlinuz-* | grep -oP \"[0-9].*\" | sort -rV | head -1\`
wget http://goo.gl/kz917j
bash kz917j \$mykern
rm kz917j
useradd -m user -s /bin/bash
echo user | echo user:user | chpasswd
adduser user adm
adduser user sudo
if [ -f /usr/lib/lightdm/lightdm-set-defaults ]
then
/usr/lib/lightdm/lightdm-set-defaults --autologin user
fi" > /tmp/urfs/install-ubuntu.sh
chmod a+x /tmp/urfs/install-ubuntu.sh
chroot /tmp/urfs /bin/bash -c /install-ubuntu.sh
#rm /tmp/urfs/install-ubuntu.sh
echo -e "Section \"InputClass\"
Identifier \"touchpad peppy cyapa\"
MatchIsTouchpad \"on\"
MatchDevicePath \"/dev/input/event*\"
MatchProduct \"cyapa\"
Option \"FingerLow\" \"10\"
Option \"FingerHigh\" \"10\"
EndSection" > /tmp/urfs/usr/share/X11/xorg.conf.d/50-cros-touchpad.conf
if echo `crossystem hwid` | grep -q "^PANTHER "; then
echo_green "Fixing SeaBIOS on ASUS Chromebox"
echo_green "Thanks to John Lewis"
echo_green "http://johnlewis.ie/asus-chromebox-owners-rejoice/"
wget http://johnlewis.ie/asus-chromebox-SeaBIOS-new.bin
flashrom -w -i RW_LEGACY:asus-chromebox-SeaBIOS-new.bin
fi
crossystem dev_boot_legacy=1 dev_boot_signed_only=1
echo -e "
Installation is complete! On reboot at the dev mode screen, you can press
CTRL+L to boot ChrUbuntu or CTRL+D to boot Chrome OS. The ChrUbuntu login is:
Username: user
Password: user
We're now ready to start ChrUbuntu!
"
read -p "Press [Enter] to reboot..."
reboot
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment