最終更新:2015-09-03 (木) 02:28:04 (3166d)
CB5/ChrUbuntu/chrubuntu.sh
http://svn.clifford.at/handicraft/2014/chrbook13/chrubuntu.sh
set -e # fw_type will always be developer for Mario. # Alex and ZGB need the developer BIOS installed though. fw_type="`crossystem mainfw_type`" if [ ! "$fw_type" = "developer" ] then echo -e "\nYou're Chromebook is not running a developer BIOS!" echo -e "You need to run:" echo -e "" echo -e "sudo chromeos-firmwareupdate --mode=todev" echo -e "" echo -e "and then re-run this script." exit fi powerd_status="`initctl status powerd`" if [ ! "$powerd_status" = "powerd stop/waiting" ] then echo -e "Stopping powerd to keep display from timing out..." initctl stop powerd fi setterm -blank 0 if [ "$3" != "" ]; then target_disk=$3 echo "Got ${target_disk} as target drive" echo "" echo "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 KERN-A -t "kernel" ${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 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 -e "\n\nNumbers only please...\n\n" continue fi if [ $ubuntu_size -lt 5 -o $ubuntu_size -gt $max_ubuntu_size ] then echo -e "\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 -e "\n\nModifying partition table to make room for Ubuntu." echo -e "Your Chromebook will reboot, wipe your data and then" echo -e "you should re-run this script..." umount -l /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 ${target_disk} # finally rootc cgpt add -i 7 -b $rootc_start -s $rootc_size -l ROOT-C ${target_disk} reboot exit fi fi # hwid lets us know if this is a Mario (Cr-48), Alex (Samsung Series 5), ZGB (Acer), etc hwid="`crossystem hwid`" chromebook_arch="`uname -m`" ubuntu_metapackage=${1:-default} latest_ubuntu=`wget --quiet -O - http://changelogs.ubuntu.com/meta-release | grep "^Version: " | tail -1 | sed -r 's/^Version: ([^ ]+)( LTS)?$/\1/'` ubuntu_version=${2:-14.04.1} 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/'` elif [ "$ubuntu_version" = "latest" ] then ubuntu_version=$latest_ubuntu fi if [ "$chromebook_arch" = "x86_64" ] then ubuntu_arch="amd64" if [ "$ubuntu_metapackage" = "default" ] then ubuntu_metapackage="ubuntu-desktop" fi elif [ "$chromebook_arch" = "i686" ] then ubuntu_arch="i386" if [ "$ubuntu_metapackage" = "default" ] then ubuntu_metapackage="ubuntu-desktop" fi elif [ "$chromebook_arch" = "armv7l" ] then ubuntu_arch="armhf" if [ "$ubuntu_metapackage" = "default" ] then ubuntu_metapackage="ubuntu-desktop" fi else echo -e "Error: This script doesn't know how to install ChrUbuntu on $chromebook_arch" exit fi echo -e "\nChrome device model is: $hwid\n" echo -e "Installing Ubuntu ${ubuntu_version} with metapackage ${ubuntu_metapackage}\n" echo -e "Kernel Arch is: $chromebook_arch Installing Ubuntu Arch: $ubuntu_arch\n" read -p "Press [Enter] to continue..." if [ ! -d /mnt/stateful_partition/ubuntu ] then mkdir /mnt/stateful_partition/ubuntu fi cd /mnt/stateful_partition/ubuntu 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 "Target Kernel Partition: $target_kern Target Root FS: ${target_rootfs}" if mount|grep ${target_rootfs} then echo "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 tar_file="http://cdimage.ubuntu.com/ubuntu-core/releases/$ubuntu_version/release/ubuntu-core-$ubuntu_version-core-$ubuntu_arch.tar.gz" if [ $ubuntu_version = "dev" ] then 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-core/daily/current/$ubuntu_animal-core-$ubuntu_arch.tar.gz" fi 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 if [ ! -d /tmp/urfs/run/resolvconf/ ] then mkdir /tmp/urfs/run/resolvconf/ fi cp /etc/resolv.conf /tmp/urfs/run/resolvconf/ ln -s -f /run/resolvconf/resolv.conf /tmp/urfs/etc/resolv.conf echo chrubuntu > /tmp/urfs/etc/hostname #echo -e "127.0.0.1 localhost echo -e "\n127.0.1.1 chrubuntu" >> /tmp/urfs/etc/hosts # The following lines are desirable for IPv6 capable hosts #::1 localhost ip6-localhost ip6-loopback #fe00::0 ip6-localnet #ff00::0 ip6-mcastprefix #ff02::1 ip6-allnodes #ff02::2 ip6-allrouters" > /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" if [ $ubuntu_arch = 'armhf' ] then cr_install='apt-get -y install chromium-browser' fi add_apt_repository_package='software-properties-common' ubuntu_major_version=${ubuntu_version:0:2} ubuntu_minor_version=${ubuntu_version:3:2} if [ $ubuntu_major_version -le 12 ] && [ $ubuntu_minor_version -lt 10 ] then add_apt_repository_package='python-software-properties' fi echo -e "apt-get -y update apt-get -y dist-upgrade apt-get -y install ubuntu-minimal apt-get -y install wget apt-get -y install $add_apt_repository_package 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 if [ -f /usr/lib/lightdm/lightdm-set-defaults ] then /usr/lib/lightdm/lightdm-set-defaults --autologin user fi useradd -m user -s /bin/bash echo user | echo user:user | chpasswd adduser user adm adduser user sudo update-alternatives --set x-www-browser /usr/bin/chromium-browser locale-gen en_US en_US.UTF-8 echo -e 'LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8' > /etc/default/locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 dpkg-reconfigure locales" > /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 KERN_VER=`uname -r` mkdir -p /tmp/urfs/lib/modules/$KERN_VER/ cp -ar /lib/modules/$KERN_VER/* /tmp/urfs/lib/modules/$KERN_VER/ if [ ! -d /tmp/urfs/lib/firmware/ ] then mkdir /tmp/urfs/lib/firmware/ fi cp -ar /lib/firmware/* /tmp/urfs/lib/firmware/ # copy adobe flash player plugin cp /opt/google/chrome/pepper/libpepflashplayer.so /tmp/urfs/usr/lib/chromium-browser # tell chromium-browser where to find flash plugin echo -e 'CHROMIUM_FLAGS="${CHROMIUM_FLAGS} --ppapi-flash-path=/usr/lib/chromium-browser/libpepflashplayer.so"' >> /tmp/urfs/etc/chromium-browser/default # flash plugin requires a new version of libstdc++6 from test repository cat > /tmp/urfs/install-flash.sh <<EOF add-apt-repository -y ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y libstdc++6 EOF chmod a+x /tmp/urfs/install-flash.sh chroot /tmp/urfs /bin/bash -c /install-flash.sh rm /tmp/urfs/install-flash.sh # hack for removing uap0 device on startup (avoid freeze) echo 'install mwifiex_sdio /sbin/modprobe --ignore-install mwifiex_sdio && sleep 1 && iw dev uap0 del' > /tmp/urfs/etc/modprobe.d/mwifiex.conf # BIG specific files here cp /etc/X11/xorg.conf.d/tegra.conf /tmp/urfs/usr/share/X11/xorg.conf.d/ l4tdir=`mktemp -d` l4t=Tegra124_Linux_R21.4.0_armhf.tbz2 wget -P ${l4tdir} http://developer.download.nvidia.com/embedded/L4T/r21_Release_v4.0/${l4t} cd ${l4tdir} tar xvpf ${l4t} cd Linux_for_Tegra/rootfs/ tar xvpf ../nv_tegra/nvidia_drivers.tbz2 tar cf - usr/lib | ( cd /tmp/urfs ; tar xvf -) # cuda symlinks ln -s libcuda.so.1 /tmp/urfs/usr/lib/arm-linux-gnueabihf/libcuda.so ln -s tegra/libcuda.so.1 /tmp/urfs/usr/lib/arm-linux-gnueabihf/libcuda.so.1 ln -s tegra/libcuda.so.1.1 /tmp/urfs/usr/lib/arm-linux-gnueabihf/libcuda.so.1.1 echo "/usr/lib/arm-linux-gnueabihf/tegra" > /tmp/urfs/etc/ld.so.conf.d/nvidia-tegra.conf echo "/usr/lib/arm-linux-gnueabihf/tegra-egl" > /tmp/urfs/usr/lib/arm-linux-gnueabihf/tegra-egl/ld.so.conf echo "/usr/lib/arm-linux-gnueabihf/tegra" > /tmp/urfs/usr/lib/arm-linux-gnueabihf/tegra/ld.so.conf cat >/tmp/urfs/etc/udev/rules.d/99-tegra-lid-switch.rules <<EOF ACTION=="remove", GOTO="tegra_lid_switch_end" SUBSYSTEM=="input", KERNEL=="event*", SUBSYSTEMS=="platform", KERNELS=="gpio-keys.4", TAG+="power-switch" LABEL="tegra_lid_switch_end" EOF # nvidia device node permissions cat > /tmp/urfs/lib/udev/rules.d/51-nvrm.rules <<EOF KERNEL=="knvmap", GROUP="video", MODE="0660" KERNEL=="nvhdcp1", GROUP="video", MODE="0660" KERNEL=="nvhost-as-gpu", GROUP="video", MODE="0660" KERNEL=="nvhost-ctrl", GROUP="video", MODE="0660" KERNEL=="nvhost-ctrl-gpu", GROUP="video", MODE="0660" KERNEL=="nvhost-dbg-gpu", GROUP="video", MODE="0660" KERNEL=="nvhost-gpu", GROUP="video", MODE="0660" KERNEL=="nvhost-msenc", GROUP="video", MODE=0660" KERNEL=="nvhost-prof-gpu", GROUP="video", MODE=0660" KERNEL=="nvhost-tsec", GROUP="video", MODE="0660" KERNEL=="nvhost-vic", GROUP="video", MODE="0660" KERNEL=="nvmap", GROUP="video", MODE="0660" KERNEL=="tegra_dc_0", GROUP="video", MODE="0660" KERNEL=="tegra_dc_1", GROUP="video", MODE="0660" KERNEL=="tegra_dc_ctrl", GROUP="video", MODE="0660" EOF # alsa mixer settings to enable internal speakers cat > /tmp/urfs/var/lib/alsa/asound.state <<EOF state.HDATegra { control.1 { iface CARD name 'HDMI/DP,pcm=3 Jack' value false comment { access read type BOOLEAN count 1 } } control.2 { iface MIXER name 'IEC958 Playback Con Mask' value '0fff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' comment { access read type IEC958 count 1 } } control.3 { iface MIXER name 'IEC958 Playback Pro Mask' value '0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' comment { access read type IEC958 count 1 } } control.4 { iface MIXER name 'IEC958 Playback Default' value '0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' comment { access 'read write' type IEC958 count 1 } } control.5 { iface MIXER name 'IEC958 Playback Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.6 { iface PCM device 3 name ELD value '' comment { access 'read volatile' type BYTES count 0 } } control.7 { iface PCM device 3 name 'Playback Channel Map' value.0 0 value.1 0 value.2 0 value.3 0 value.4 0 value.5 0 value.6 0 value.7 0 comment { access 'read write' type INTEGER count 8 range '0 - 36' } } } state.Venice2 { control.1 { iface MIXER name 'MIC Bias VCM Bandgap' value 'High Performance' comment { access 'read write' type ENUMERATED count 1 item.0 'Low Power' item.1 'High Performance' } } control.2 { iface MIXER name 'DMIC MIC Comp Filter Config' value 6 comment { access 'read write' type INTEGER count 1 range '0 - 15' } } control.3 { iface MIXER name 'MIC1 Boost Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 2' dbmin 0 dbmax 3000 dbvalue.0 0 } } control.4 { iface MIXER name 'MIC2 Boost Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 2' dbmin 0 dbmax 3000 dbvalue.0 0 } } control.5 { iface MIXER name 'MIC1 Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 20' dbmin 0 dbmax 2000 dbvalue.0 0 } } control.6 { iface MIXER name 'MIC2 Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 20' dbmin 0 dbmax 2000 dbvalue.0 0 } } control.7 { iface MIXER name 'LINEA Single Ended Volume' value 1 comment { access 'read write' type INTEGER count 1 range '0 - 1' dbmin -600 dbmax 0 dbvalue.0 0 } } control.8 { iface MIXER name 'LINEB Single Ended Volume' value 1 comment { access 'read write' type INTEGER count 1 range '0 - 1' dbmin -600 dbmax 0 dbvalue.0 0 } } control.9 { iface MIXER name 'LINEA Volume' value 2 comment { access 'read write' type INTEGER count 1 range '0 - 5' dbmin -600 dbmax 2000 dbvalue.0 0 } } control.10 { iface MIXER name 'LINEB Volume' value 2 comment { access 'read write' type INTEGER count 1 range '0 - 5' dbmin -600 dbmax 2000 dbvalue.0 0 } } control.11 { iface MIXER name 'LINEA Ext Resistor Gain Mode' value false comment { access 'read write' type BOOLEAN count 1 } } control.12 { iface MIXER name 'LINEB Ext Resistor Gain Mode' value false comment { access 'read write' type BOOLEAN count 1 } } control.13 { iface MIXER name 'ADCL Boost Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 7' dbmin 0 dbmax 4200 dbvalue.0 0 } } control.14 { iface MIXER name 'ADCR Boost Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 7' dbmin 0 dbmax 4200 dbvalue.0 0 } } control.15 { iface MIXER name 'ADCL Volume' value 12 comment { access 'read write' type INTEGER count 1 range '0 - 15' dbmin -1200 dbmax 300 dbvalue.0 0 } } control.16 { iface MIXER name 'ADCR Volume' value 12 comment { access 'read write' type INTEGER count 1 range '0 - 15' dbmin -1200 dbmax 300 dbvalue.0 0 } } control.17 { iface MIXER name 'ADC Oversampling Rate' value '128*fs' comment { access 'read write' type ENUMERATED count 1 item.0 '64*fs' item.1 '128*fs' } } control.18 { iface MIXER name 'ADC Quantizer Dither' value true comment { access 'read write' type BOOLEAN count 1 } } control.19 { iface MIXER name 'ADC High Performance Mode' value 'High Performance' comment { access 'read write' type ENUMERATED count 1 item.0 'Low Power' item.1 'High Performance' } } control.20 { iface MIXER name 'DAC Mono Mode' value false comment { access 'read write' type BOOLEAN count 1 } } control.21 { iface MIXER name 'SDIN Mode' value false comment { access 'read write' type BOOLEAN count 1 } } control.22 { iface MIXER name 'SDOUT Mode' value false comment { access 'read write' type BOOLEAN count 1 } } control.23 { iface MIXER name 'SDOUT Hi-Z Mode' value true comment { access 'read write' type BOOLEAN count 1 } } control.24 { iface MIXER name 'Filter Mode' value Music comment { access 'read write' type ENUMERATED count 1 item.0 Voice item.1 Music } } control.25 { iface MIXER name 'Record Path DC Blocking' value false comment { access 'read write' type BOOLEAN count 1 } } control.26 { iface MIXER name 'Playback Path DC Blocking' value false comment { access 'read write' type BOOLEAN count 1 } } control.27 { iface MIXER name 'Digital BQ Volume' value 15 comment { access 'read write' type INTEGER count 1 range '0 - 15' dbmin -1500 dbmax 0 dbvalue.0 0 } } control.28 { iface MIXER name 'Digital Sidetone Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 30' dbmin 0 dbmax 3000 dbvalue.0 0 } } control.29 { iface MIXER name 'Digital Coarse Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 3' dbmin 0 dbmax 1800 dbvalue.0 0 } } control.30 { iface MIXER name 'Digital Volume' value 15 comment { access 'read write' type INTEGER count 1 range '0 - 15' dbmin -1500 dbmax 0 dbvalue.0 0 } } control.31 { iface MIXER name 'EQ Coefficients' value '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' comment { access 'read write' type BYTES count 105 } } control.32 { iface MIXER name 'Digital EQ 3 Band Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.33 { iface MIXER name 'Digital EQ 5 Band Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.34 { iface MIXER name 'Digital EQ 7 Band Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.35 { iface MIXER name 'Digital EQ Clipping Detection' value true comment { access 'read write' type BOOLEAN count 1 } } control.36 { iface MIXER name 'Digital EQ Volume' value 15 comment { access 'read write' type INTEGER count 1 range '0 - 15' dbmin -1500 dbmax 0 dbvalue.0 0 } } control.37 { iface MIXER name 'ALC Enable' value false comment { access 'read write' type BOOLEAN count 1 } } control.38 { iface MIXER name 'ALC Attack Time' value '0.5ms' comment { access 'read write' type ENUMERATED count 1 item.0 '0.5ms' item.1 '1ms' item.2 '5ms' item.3 '10ms' item.4 '25ms' item.5 '50ms' item.6 '100ms' item.7 '200ms' } } control.39 { iface MIXER name 'ALC Release Time' value '8s' comment { access 'read write' type ENUMERATED count 1 item.0 '8s' item.1 '4s' item.2 '2s' item.3 '1s' item.4 '0.5s' item.5 '0.25s' item.6 '0.125s' item.7 '0.0625s' } } control.40 { iface MIXER name 'ALC Make Up Volume' value 0 comment { access 'read write' type INTEGER count 1 range '0 - 12' dbmin 0 dbmax 1200 dbvalue.0 0 } } control.41 { iface MIXER name 'ALC Compression Ratio' value '1:1' comment { access 'read write' type ENUMERATED count 1 item.0 '1:1' item.1 '1:1.5' item.2 '1:2' item.3 '1:4' item.4 '1:INF' } } control.42 { iface MIXER name 'ALC Expansion Ratio' value '1:1' comment { access 'read write' type ENUMERATED count 1 item.0 '1:1' item.1 '2:1' item.2 '3:1' } } control.43 { iface MIXER name 'ALC Compression Threshold Volume' value 31 comment { access 'read write' type INTEGER count 1 range '0 - 31' dbmin -3100 dbmax 0 dbvalue.0 0 } } control.44 { iface MIXER name 'ALC Expansion Threshold Volume' value 31 comment { access 'read write' type INTEGER count 1 range '0 - 31' dbmin -6600 dbmax -3500 dbvalue.0 -3500 } } control.45 { iface MIXER name 'DAC HP Playback Performance Mode' value 'High Performance' comment { access 'read write' type ENUMERATED count 1 item.0 'High Performance' item.1 'Low Power' } } control.46 { iface MIXER name 'DAC High Performance Mode' value 'High Performance' comment { access 'read write' type ENUMERATED count 1 item.0 'Low Power' item.1 'High Performance' } } control.47 { iface MIXER name 'Headphone Left Mixer Volume' value 3 comment { access 'read write' type INTEGER count 1 range '0 - 3' dbmin -1200 dbmax 0 dbvalue.0 0 } } control.48 { iface MIXER name 'Headphone Right Mixer Volume' value 3 comment { access 'read write' type INTEGER count 1 range '0 - 3' dbmin -1200 dbmax 0 dbvalue.0 0 } } control.49 { iface MIXER name 'Speaker Left Mixer Volume' value 3 comment { access 'read write' type INTEGER count 1 range '0 - 3' dbmin -1200 dbmax 0 dbvalue.0 0 } } control.50 { iface MIXER name 'Speaker Right Mixer Volume' value 3 comment { access 'read write' type INTEGER count 1 range '0 - 3' dbmin -1200 dbmax 0 dbvalue.0 0 } } control.51 { iface MIXER name 'Receiver Left Mixer Volume' value 3 comment { access 'read write' type INTEGER count 1 range '0 - 3' dbmin -1200 dbmax 0 dbvalue.0 0 } } control.52 { iface MIXER name 'Receiver Right Mixer Volume' value 3 comment { access 'read write' type INTEGER count 1 range '0 - 3' dbmin -1200 dbmax 0 dbvalue.0 0 } } control.53 { iface MIXER name 'Headphone Volume' value.0 26 value.1 26 comment { access 'read write' type INTEGER count 2 range '0 - 31' dbmin -6700 dbmax 300 dbvalue.0 0 dbvalue.1 0 } } control.54 { iface MIXER name 'Speaker Volume' value.0 20 value.1 20 comment { access 'read write' type INTEGER count 2 range '0 - 39' dbmin -4800 dbmax 1400 dbvalue.0 0 dbvalue.1 0 } } control.55 { iface MIXER name 'Receiver Volume' value.0 21 value.1 21 comment { access 'read write' type INTEGER count 2 range '0 - 31' dbmin -6200 dbmax 800 dbvalue.0 0 dbvalue.1 0 } } control.56 { iface MIXER name 'Headphone Left Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.57 { iface MIXER name 'Headphone Right Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.58 { iface MIXER name 'Speaker Left Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.59 { iface MIXER name 'Speaker Right Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.60 { iface MIXER name 'Receiver Left Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.61 { iface MIXER name 'Receiver Right Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.62 { iface MIXER name 'Zero-Crossing Detection' value true comment { access 'read write' type BOOLEAN count 1 } } control.63 { iface MIXER name 'Enhanced Vol Smoothing' value true comment { access 'read write' type BOOLEAN count 1 } } control.64 { iface MIXER name 'Volume Adjustment Smoothing' value true comment { access 'read write' type BOOLEAN count 1 } } control.65 { iface MIXER name 'Biquad Coefficients' value '000000000000000000000000000000' comment { access 'read write' type BYTES count 15 } } control.66 { iface MIXER name 'Biquad Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.67 { iface MIXER name 'HP Right Out Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.68 { iface MIXER name 'HP Left Out Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.69 { iface MIXER name 'MIXHPRSEL Mux' value 'DAC Only' comment { access 'read write' type ENUMERATED count 1 item.0 'DAC Only' item.1 'HP Mixer' } } control.70 { iface MIXER name 'MIXHPLSEL Mux' value 'DAC Only' comment { access 'read write' type ENUMERATED count 1 item.0 'DAC Only' item.1 'HP Mixer' } } control.71 { iface MIXER name 'LINMOD Mux' value 'Left Only' comment { access 'read write' type ENUMERATED count 1 item.0 'Left Only' item.1 'Left and Right' } } control.72 { iface MIXER name 'Right Receiver Mixer Left DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.73 { iface MIXER name 'Right Receiver Mixer Right DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.74 { iface MIXER name 'Right Receiver Mixer LINEA Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.75 { iface MIXER name 'Right Receiver Mixer LINEB Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.76 { iface MIXER name 'Right Receiver Mixer MIC1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.77 { iface MIXER name 'Right Receiver Mixer MIC2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.78 { iface MIXER name 'Left Receiver Mixer Left DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.79 { iface MIXER name 'Left Receiver Mixer Right DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.80 { iface MIXER name 'Left Receiver Mixer LINEA Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.81 { iface MIXER name 'Left Receiver Mixer LINEB Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.82 { iface MIXER name 'Left Receiver Mixer MIC1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.83 { iface MIXER name 'Left Receiver Mixer MIC2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.84 { iface MIXER name 'Right Speaker Mixer Left DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.85 { iface MIXER name 'Right Speaker Mixer Right DAC Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.86 { iface MIXER name 'Right Speaker Mixer LINEA Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.87 { iface MIXER name 'Right Speaker Mixer LINEB Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.88 { iface MIXER name 'Right Speaker Mixer MIC1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.89 { iface MIXER name 'Right Speaker Mixer MIC2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.90 { iface MIXER name 'Left Speaker Mixer Left DAC Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.91 { iface MIXER name 'Left Speaker Mixer Right DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.92 { iface MIXER name 'Left Speaker Mixer LINEA Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.93 { iface MIXER name 'Left Speaker Mixer LINEB Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.94 { iface MIXER name 'Left Speaker Mixer MIC1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.95 { iface MIXER name 'Left Speaker Mixer MIC2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.96 { iface MIXER name 'Right Headphone Mixer Left DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.97 { iface MIXER name 'Right Headphone Mixer Right DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.98 { iface MIXER name 'Right Headphone Mixer LINEA Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.99 { iface MIXER name 'Right Headphone Mixer LINEB Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.100 { iface MIXER name 'Right Headphone Mixer MIC1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.101 { iface MIXER name 'Right Headphone Mixer MIC2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.102 { iface MIXER name 'Left Headphone Mixer Left DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.103 { iface MIXER name 'Left Headphone Mixer Right DAC Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.104 { iface MIXER name 'Left Headphone Mixer LINEA Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.105 { iface MIXER name 'Left Headphone Mixer LINEB Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.106 { iface MIXER name 'Left Headphone Mixer MIC1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.107 { iface MIXER name 'Left Headphone Mixer MIC2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.108 { iface MIXER name 'STENR Mux' value Normal comment { access 'read write' type ENUMERATED count 1 item.0 Normal item.1 'Sidetone Right' } } control.109 { iface MIXER name 'STENL Mux' value Normal comment { access 'read write' type ENUMERATED count 1 item.0 Normal item.1 'Sidetone Left' } } control.110 { iface MIXER name 'LTENR Mux' value Normal comment { access 'read write' type ENUMERATED count 1 item.0 Normal item.1 Loopthrough } } control.111 { iface MIXER name 'LTENL Mux' value Normal comment { access 'read write' type ENUMERATED count 1 item.0 Normal item.1 Loopthrough } } control.112 { iface MIXER name 'LBENR Mux' value Normal comment { access 'read write' type ENUMERATED count 1 item.0 Normal item.1 Loopback } } control.113 { iface MIXER name 'LBENL Mux' value Normal comment { access 'read write' type ENUMERATED count 1 item.0 Normal item.1 Loopback } } control.114 { iface MIXER name 'Right ADC Mixer IN12 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.115 { iface MIXER name 'Right ADC Mixer IN34 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.116 { iface MIXER name 'Right ADC Mixer IN56 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.117 { iface MIXER name 'Right ADC Mixer LINEA Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.118 { iface MIXER name 'Right ADC Mixer LINEB Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.119 { iface MIXER name 'Right ADC Mixer MIC1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.120 { iface MIXER name 'Right ADC Mixer MIC2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.121 { iface MIXER name 'Left ADC Mixer IN12 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.122 { iface MIXER name 'Left ADC Mixer IN34 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.123 { iface MIXER name 'Left ADC Mixer IN56 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.124 { iface MIXER name 'Left ADC Mixer LINEA Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.125 { iface MIXER name 'Left ADC Mixer LINEB Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.126 { iface MIXER name 'Left ADC Mixer MIC1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.127 { iface MIXER name 'Left ADC Mixer MIC2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.128 { iface MIXER name 'LINEB Mixer IN2 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.129 { iface MIXER name 'LINEB Mixer IN4 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.130 { iface MIXER name 'LINEB Mixer IN6 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.131 { iface MIXER name 'LINEB Mixer IN56 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.132 { iface MIXER name 'LINEA Mixer IN1 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.133 { iface MIXER name 'LINEA Mixer IN3 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.134 { iface MIXER name 'LINEA Mixer IN5 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.135 { iface MIXER name 'LINEA Mixer IN34 Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.136 { iface MIXER name 'DMIC Mux' value ADC comment { access 'read write' type ENUMERATED count 1 item.0 ADC item.1 DMIC } } control.137 { iface MIXER name 'MIC2 Mux' value IN34 comment { access 'read write' type ENUMERATED count 1 item.0 IN34 item.1 IN56 } } control.138 { iface MIXER name 'MIC1 Mux' value IN12 comment { access 'read write' type ENUMERATED count 1 item.0 IN12 item.1 IN56 } } control.139 { iface MIXER name 'Speakers Switch' value true comment { access 'read write' type BOOLEAN count 1 } } control.140 { iface MIXER name 'Headphone Jack Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.141 { iface MIXER name 'Mic Jack Switch' value false comment { access 'read write' type BOOLEAN count 1 } } control.142 { iface MIXER name 'Int Mic Switch' value true comment { access 'read write' type BOOLEAN count 1 } } } EOF cat > /tmp/urfs/install-tegra.sh <<EOF update-alternatives --install /etc/ld.so.conf.d/arm-linux-gnueabihf_EGL.conf arm-linux-gnueabihf_egl_conf /usr/lib/arm-linux-gnueabihf/tegra-egl/ld.so.conf 1000 update-alternatives --install /etc/ld.so.conf.d/arm-linux-gnueabihf_GL.conf arm-linux-gnueabihf_gl_conf /usr/lib/arm-linux-gnueabihf/tegra/ld.so.conf 1000 ldconfig adduser user video EOF #su user -c "xdg-settings set default-web-browser chromium.desktop" chmod a+x /tmp/urfs/install-tegra.sh chroot /tmp/urfs /bin/bash -c /install-tegra.sh rm /tmp/urfs/install-tegra.sh echo "console=tty1 debug verbose root=${target_rootfs} rootwait rw lsm.module_locking=0" > kernel-config vbutil_arch="x86" if [ $ubuntu_arch = "armhf" ] then vbutil_arch="arm" fi current_rootfs="`rootdev -s`" current_kernfs_num=$((${current_rootfs: -1:1}-1)) current_kernfs=${current_rootfs: 0:-1}$current_kernfs_num vbutil_kernel --repack ${target_kern} \ --oldblob $current_kernfs \ --keyblock /usr/share/vboot/devkeys/kernel.keyblock \ --version 1 \ --signprivate /usr/share/vboot/devkeys/kernel_data_key.vbprivk \ --config kernel-config \ --arch $vbutil_arch #Set Ubuntu kernel partition as top priority for next boot (and next boot only) cgpt add -i 6 -P 5 -T 1 ${target_disk} echo -e " Installation seems to be complete. If ChrUbuntu fails when you reboot, power off your Chrome OS device and then turn it back on. You'll be back in Chrome OS. If you're happy with ChrUbuntu when you reboot be sure to run: sudo cgpt add -i 6 -P 5 -S 1 ${target_disk} To make it the default boot option. The ChrUbuntu login is: Username: user Password: user We're now ready to start ChrUbuntu! " read -p "Press [Enter] to reboot..." reboot