Initial commit

This commit is contained in:
Marcos Fadul 2020-04-17 11:53:48 +02:00
commit 20bc664690
13 changed files with 735 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build_files

47
.travis.yml Normal file
View File

@ -0,0 +1,47 @@
---
language: bash
os:
- linux
services:
- docker
branches:
only:
- master
stages:
- test
- build_deploy
jobs:
include:
- stage: test
name: "YamlLint"
script: |
docker run --rm -v $(pwd):/repo -it alpine:latest /bin/sh -c '
cd /repo
apk add --no-cache python3
pip3 install yamllint
yamllint .
'
- stage: test
name: "ShellCheck"
script: |
docker run --rm -v $(pwd):/repo -it alpine:latest /bin/sh -c '
cd /repo
apk add --no-cache shellcheck bash
shellcheck ./*.sh
'
- stage: build_deploy
name: "Build Ubuntu and Deploy to GitHub Releases"
script: ./build_in_docker.sh
deploy:
provider: releases
api_key: "$GITHUB_TOKEN"
file_glob: true
file: "/build_files/output_zip/*"
skip_cleanup: true
on:
tags: true

107
README.md Normal file
View File

@ -0,0 +1,107 @@
# mbp-ubuntu
[![Build Status](https://travis-ci.com/marcosfad/mbp-ubuntu.svg?branch=master)](https://travis-ci.com/marcosfad/mbp-ubuntu)
UBUNTU 20.04 ISO with Apple T2 patches built-in (Macbooks produced >= 2018).
All available Apple T2 drivers are integrated with this iso. Most things work, besides those mentioned in [not working section](#not-working).
Kernel - <https://github.com/marcosfad/mbp-ubuntu-kernel>
Drivers:
- Apple T2 (audio, keyboard, touchpad) - <https://github.com/MCMrARM/mbp2018-bridge-drv>
- Apple SMC - <https://github.com/MCMrARM/mbp2018-etc>
- Touchbar - <https://github.com/roadrunner2/macbook12-spi-driver/tree/mbp15>
> Tested on: Macbook Pro 16,1 16" 2019 i9 TouchBar
```
Boot ROM Version: 220.270.99.0.0 (iBridge: 16.16.6571.0.0,0)
macOS Mojave: 10.14.6 (18G103)
```
## How to install
- Turn off secure boot - <https://support.apple.com/en-us/HT208330>
- Download .iso from releases section - <https://github.com/marcosfad/mbp-ubuntu/releases/latest>
- If it's splitted into multiple zip parts, you need to join splitted files into one and then extract it via `unzip` or extract them directly via `7z x` or `7za x`
- <https://unix.stackexchange.com/questions/40480/how-to-unzip-a-multipart-spanned-zip-on-linux>
- Burn the image on USB stick >=8GB via:
- dd - `dd bs=4M if=/home/user/Downloads/ubuntu-20.04-beta-minimal-mbp.iso of=/dev/sdc conv=fdatasync status=progress`
- rufus (GPT)- <https://rufus.ie/>
- balenaEtcher- <https://www.balena.io/etcher/>
- don't use `livecd-iso-to-disk`, because it's overwriting grub settings
- Install Ubuntu
- Boot directly from macOS boot manager. (You can boot into it by pressing and holding option key after clicking the power-on button).
- There will be three boot options available, usually the third one works for me. (There are three of them, because there are three partitions in ISO: 1) ISO9660: with installer data, 2) fat32, 3) hfs+)
- I recommend to shrink (resize) macOS APFS partition and not removing macOS installation entirely from your MacBook, because it's the only way to keep your device up-to-date. macOS OS updates also contains security patches to EFI/Apple T2
- HowTo: <https://www.anyrecover.com/hard-drive-recovery-data/resize-partition-mac/> # Steps to Resize Mac Partition
- You should use standard partition layout during partitioning your Disk in anaconda, because i haven't tested LVM scenario yet. <https://github.com/marcosfad/mbp-ubuntu/issues/2>
- /boot/efi - 1024MB fat32
- /boot - 1024MB EXT4
- / - xxxGB EXT4
- Put wifi firmware files to `/lib/firmware/brcm/`
- tutorial - <https://github.com/mikeeq/mbp-fedora-kernel/#working-with-mbp-fedora-kernel>
- You can change mappings of ctrl, fn, option keys (PC keyboard mappings) by creating `/etc/modprobe.d/hid_apple.conf` file and recreating grub config. All available modifications could be found here: <https://github.com/free5lot/hid-apple-patched>
```
# /etc/modprobe.d/hid_apple.conf
options hid_apple swap_fn_leftctrl=1
options hid_apple swap_opt_cmd=1
grub2-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg
```
## Not working
- Dynamic audio input/output change (on connecting/disconnecting headphones jack)
- TouchID - (@MCMrARM is working on it - https://github.com/Dunedan/mbp-2016-linux/issues/71#issuecomment-528545490)
- Thunderbolt (is disabled, because driver was causing kernel panics (not tested with 5.5 kernel))
- Microphone (it's recognised with new apple t2 sound driver, but there is a low mic volume amp)
## TODO
## Known issues
- Kernel/Mac related issues are mentioned in kernel repo
- Macbooks with Apple T2 can't boot EFI binaries from HFS+ formatted ESP - only FAT32 (FAT32 have to be labelled as msftdata).
- `ctrl+x` is not working in GRUB, so if you are trying to change kernel parameters - start your OS by clicking `ctrl+shift+f10` on external keyboard
## Docs
- Discord: <https://discord.gg/Uw56rqW>
- WiFi firmware: <https://packages.aunali1.com/apple/wifi-fw/18G2022>
- Linux on a MBP Late 2016: <https://gist.github.com/gbrow004/096f845c8fe8d03ef9009fbb87b781a4>
### Ubuntu
- <https://help.ubuntu.com/community/LiveCDCustomization>
- <https://itnext.io/how-to-create-a-custom-ubuntu-live-from-scratch-dd3b3f213f81>
### Github
- GitHub issue (RE history): <https://github.com/Dunedan/mbp-2016-linux/issues/71>
- VHCI+Sound driver (Apple T2): <https://github.com/MCMrARM/mbp2018-bridge-drv/>
- hid-apple keyboard backlight patch: <https://github.com/MCMrARM/mbp2018-etc>
- alsa/pulseaudio config files: <https://gist.github.com/MCMrARM/c357291e4e5c18894bea10665dcebffb>
- TouchBar driver: <https://github.com/roadrunner2/macbook12-spi-driver/tree/mbp15>
- Kernel patches (all are mentioned in github issue above): <https://github.com/aunali1/linux-mbp-arch>
- ArchLinux kernel patches: <https://github.com/ppaulweber/linux-mba>
- ArchLinux installation guide: <https://gist.github.com/TRPB/437f663b545d23cc8a2073253c774be3>
- hid-apple-patched module for changing mappings of ctrl, fn, option keys: <https://github.com/free5lot/hid-apple-patched>
- Audio configuration: <https://gist.github.com/kevineinarsson/8e5e92664f97508277fefef1b8015fba>
## Credits
- @mikeeq - thanks for the amazing work in mbp-fedora
- @MCMrARM - thanks for all RE work
- @ozbenh - thanks for submitting NVME patch
- @roadrunner2 - thanks for SPI (touchbar) driver
- @aunali1 - thanks for ArchLinux Kernel CI
- @ppaulweber - thanks for keyboard and Macbook Air patches
- @kevineinarsson - thanks for the audio settings
- @roadrunner2 - thanks for the overview

176
build.sh Executable file
View File

@ -0,0 +1,176 @@
#!/bin/bash
# https://itnext.io/how-to-create-a-custom-ubuntu-live-from-scratch-dd3b3f213f81
set -eu -o pipefail
ROOT_PATH=$(pwd)
WORKING_PATH=$(pwd)/build_files
echo >&2 "===]> Info: Build dependencies... ";
export DEBIAN_FRONTEND=noninteractive
apt-get install -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
binutils \
debootstrap \
squashfs-tools \
xorriso \
grub-pc-bin \
grub-efi-amd64-bin \
mtools
if [ -d "$WORKING_PATH" ]; then
rm -rf "$WORKING_PATH"
fi
mkdir -p "$WORKING_PATH"
echo >&2 "===]> Info: Checkout bootstrap... ";
debootstrap \
--arch=amd64 \
--variant=minbase \
focal \
"$WORKING_PATH/chroot" \
http://de.archive.ubuntu.com/ubuntu/
echo >&2 "===]> Info: Creating chroot environment... ";
mount --bind /dev "$WORKING_PATH/chroot/dev"
mount --bind /run "$WORKING_PATH/chroot/run"
cp "$ROOT_PATH/files/chroot_build.sh" "$WORKING_PATH/chroot/chroot_build.sh"
chroot "$WORKING_PATH/chroot" ./chroot_build.sh
echo >&2 "===]> Info: Cleanup the chroot environment... ";
umount "$WORKING_PATH/chroot/dev"
umount "$WORKING_PATH/chroot/run"
echo >&2 "===]> Info: Create image directory and populate it... ";
cd "$WORKING_PATH"
if [ -d "$WORKING_PATH/image" ]; then
rm -rf "$WORKING_PATH/image"
fi
if [ -e "$WORKING_PATH/ubuntu-for-mbp.iso" ]; then
rm -f "$WORKING_PATH/ubuntu-for-mbp.iso"
fi
mkdir -p image/{casper,isolinux,install}
cp chroot/boot/vmlinuz-**-**-generic image/casper/vmlinuz
cp chroot/boot/initrd.img-**-**-generic image/casper/initrd
cp -r "$ROOT_PATH/files/preseed" image/
echo >&2 "===]> Info: Create manifest... ";
cd "$WORKING_PATH"
# shellcheck disable=SC2016
chroot chroot dpkg-query -W --showformat='${Package} ${Version}\n' | tee image/casper/filesystem.manifest
cp -v image/casper/filesystem.manifest image/casper/filesystem.manifest-desktop
sed -i '/ubiquity/d' image/casper/filesystem.manifest-desktop
sed -i '/casper/d' image/casper/filesystem.manifest-desktop
sed -i '/discover/d' image/casper/filesystem.manifest-desktop
sed -i '/laptop-detect/d' image/casper/filesystem.manifest-desktop
sed -i '/os-prober/d' image/casper/filesystem.manifest-desktop
### Workaround - travis_wait
while true
do
date
sleep 30
done &
bgPID=$!
echo >&2 "===]> Info: Compress the chroot... ";
cd "$WORKING_PATH"
mksquashfs chroot image/casper/filesystem.squashfs
printf "%s" "$(du -sx --block-size=1 chroot | cut -f1)" > image/casper/filesystem.size
echo >&2 "===]> Info: Create diskdefines... ";
cat <<EOF > image/README.diskdefines
#define DISKNAME Ubuntu 20.04 LTS "Focal Fossa" - MacBook Pro Beta amd64
#define TYPE binary
#define TYPEbinary 1
#define ARCH amd64
#define ARCHamd64 1
#define DISKNUM 1
#define DISKNUM1 1
#define TOTALNUM 0
#define TOTALNUM0 1
EOF
echo >&2 "===]> Info: Grub configuration... ";
touch image/ubuntu
cp "$ROOT_PATH/files/grub/grub.cfg" image/isolinux/grub.cfg
cp -r "$ROOT_PATH/files/preseed" image/pressed
echo >&2 "===]> Info: Create ISO Image for a LiveCD... ";
cd "$WORKING_PATH/image"
grub-mkstandalone \
--format=x86_64-efi \
--output=isolinux/bootx64.efi \
--locales="" \
--fonts="" \
"boot/grub/grub.cfg=isolinux/grub.cfg"
(
cd isolinux && \
dd if=/dev/zero of=efiboot.img bs=1M count=10 && \
sudo mkfs.vfat efiboot.img && \
LC_CTYPE=C mmd -i efiboot.img efi efi/boot && \
LC_CTYPE=C mcopy -i efiboot.img ./bootx64.efi ::efi/boot/
)
grub-mkstandalone \
--format=i386-pc \
--output=isolinux/core.img \
--install-modules="linux16 linux normal iso9660 biosdisk memdisk search tar ls" \
--modules="linux16 linux normal iso9660 biosdisk search" \
--locales="" \
--fonts="" \
"boot/grub/grub.cfg=isolinux/grub.cfg"
cat /usr/lib/grub/i386-pc/cdboot.img isolinux/core.img > isolinux/bios.img
(find . -type f -print0 | xargs -0 md5sum | grep -v "\./md5sum.txt" > md5sum.txt)
xorriso \
-as mkisofs \
-iso-level 3 \
-full-iso9660-filenames \
-volid "Ubuntu 20.04 beta minimal MacBook Pro" \
-eltorito-boot boot/grub/bios.img \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
--eltorito-catalog boot/grub/boot.cat \
--grub2-boot-info \
--grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
-eltorito-alt-boot \
-e EFI/efiboot.img \
-no-emul-boot \
-append_partition 2 0xef isolinux/efiboot.img \
-output "../ubuntu-20.04-beta-minimal-mbp.iso" \
-graft-points \
"." \
/boot/grub/bios.img=isolinux/bios.img \
/EFI/efiboot.img=isolinux/efiboot.img
livecd_exitcode=$?
### Zip iso and split it into multiple parts - github max size of release attachment is 2GB, where ISO is sometimes bigger than that
cd "$WORKING_PATH"
mkdir -p ./output_zip
zip -s 1500m ./output_zip/livecd.zip ./*.iso
### Calculate sha256 sums of built ISO
sha256sum ./*.iso > ./output_zip/sha256
find ./ | grep ".iso"
find ./ | grep ".zip"
kill "$bgPID"
exit "$livecd_exitcode"

14
build_in_docker.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
set -eu -o pipefail
DOCKER_IMAGE=ubuntu:20.04
docker pull ${DOCKER_IMAGE}
docker run \
--privileged \
--rm \
-t \
-v "$(pwd)":/repo \
${DOCKER_IMAGE} \
/bin/bash -c 'cd /repo && ./build.sh'

View File

@ -0,0 +1,7 @@
SUBSYSTEM!="sound", GOTO="pulseaudio_end"
ACTION!="change", GOTO="pulseaudio_end"
KERNEL!="card*", GOTO="pulseaudio_end"
SUBSYSTEMS=="pci", ATTRS{vendor}=="0x106b", ATTRS{device}=="0x1803", ENV{PULSE_PROFILE_SET}="apple-t2.conf"
LABEL="pulseaudio_end"

103
files/audio/AppleT2.conf Normal file
View File

@ -0,0 +1,103 @@
<confdir:pcm/front.conf>
AppleT2.pcm.default {
@args [ CARD ]
@args.CARD {
type string
}
type asym
playback.pcm {
type plug
ttable {
0.0= 1
1.3= 1
2.1= 1
3.4= 1
4.0= 1
5.5= 1
}
slave {
pcm {
type hw
card $CARD
device 0
}
channels 6
}
}
capture.pcm {
type plug
slave.pcm {
type hw
card $CARD
device 1
}
}
hint.device_output 0
hint.device_input 1
}
AppleT2.pcm.front.0 {
@args [ CARD ]
@args.CARD {
type string
}
type asym
playback.pcm {
type plug
ttable {
0.0= 1
1.3= 1
2.1= 1
3.4= 1
4.0= 1
5.5= 1
}
slave {
pcm {
type hw
card $CARD
device 0
}
channels 6
}
}
capture.pcm {
type plug
slave.pcm {
type hw
card $CARD
device 1
}
}
hint.device_output 0
hint.device_input 1
}
AppleT2.pcm.front.1 {
@args [ CARD ]
@args.CARD {
type string
}
type asym
playback.pcm {
type hw
card $CARD
device 2
}
capture.pcm {
type hw
card $CARD
device 3
}
hint.device_output 2
hint.device_input 3
}
AppleT2.pcm.front.2 {
@args [ CARD ]
@args.CARD {
type string
}
type hw
card $CARD
device 4
}

55
files/audio/apple-t2.conf Normal file
View File

@ -0,0 +1,55 @@
[General]
auto-profiles = no
[Mapping builtin-speaker]
description = Built-in Speaker
device-strings = front:%f
paths-output = builtin-speaker-output
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
priority = 100
direction = output
[Mapping builtin-mic]
description = Built-in Mic
device-strings = front:%f
paths-output = builtin-mic-input
channel-map = left,center,right
priority = 100
direction = input
[Mapping codec-output]
description = Headphone
device-strings = front:%f,1
paths-output = codec-output
channel-map = left,right
priority = 100
direction = output
[Mapping codec-input]
description = Headphone Mic
device-strings = front:%f,1
paths-output = codec-input
channel-map = mono
priority = 100
direction = input
[Profile output:builtin-speaker+input:builtin-mic]
description = Built-in Speaker + Built-in Mic
output-mappings = builtin-speaker
input-mappings = builtin-mic
skip-probe = yes
[Profile output:codec-output+input:builtin-mic]
description = Headphones + Built-in Mic
output-mappings = codec-output
input-mappings = builtin-mic
[Profile output:codec-output+input:codec-input]
description = Headphones + External Mic
output-mappings = codec-output
input-mappings = codec-input
[Profile output:builtin-speaker+input:codec-input]
description = Built-in Speaker + External Mic
output-mappings = builtin-speaker
input-mappings = codec-input

145
files/chroot_build.sh Executable file
View File

@ -0,0 +1,145 @@
#!/bin/bash
set -eu -o pipefail
echo >&2 "===]> Info: Configure environment... ";
mount none -t proc /proc
mount none -t sysfs /sys
mount none -t devpts /dev/pts
export HOME=/root
export LC_ALL=C
echo "ubuntu-fs-live" > /etc/hostname
echo >&2 "===]> Info: Configure and update apt... ";
cat <<EOF > /etc/apt/sources.list
deb http://us.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
EOF
# echo "deb https://mbp-ubuntu-kernel.herokuapp.com/ /" > /etc/apt/sources.list.d/mbp-ubuntu-kernel.list
# wget -q -O - https://mbp-ubuntu-kernel.herokuapp.com/KEY.gpg | apt-key add -
apt-get update
echo >&2 "===]> Info: Install systemd... ";
apt-get install -y systemd-sysv
echo >&2 "===]> Info: Configure machine-id and divert... ";
dbus-uuidgen > /etc/machine-id
ln -fs /etc/machine-id /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl
echo >&2 "===]> Info: Install packages needed for Live System... ";
export DEBIAN_FRONTEND=noninteractive
apt-get install -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
ubuntu-standard \
casper \
lupin-casper \
discover \
laptop-detect \
os-prober \
network-manager \
resolvconf \
net-tools \
wireless-tools \
wpagui \
locales \
linux-generic
echo >&2 "===]> Info: Install Graphical installer... ";
apt-get install -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
ubiquity \
ubiquity-casper \
ubiquity-frontend-gtk \
ubiquity-slideshow-ubuntu \
ubiquity-ubuntu-artwork
echo >&2 "===]> Info: Install window manager... ";
apt-get install -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
plymouth-theme-ubuntu-logo \
ubuntu-desktop-minimal \
ubuntu-gnome-wallpapers
echo >&2 "===]> Info: Install useful applications... ";
apt-get install -y -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
git \
curl \
nano \
gcc \
expect \
make
echo >&2 "===]> Info: Remove unused applications ... ";
apt-get purge -y -qq \
transmission-gtk \
transmission-common \
gnome-mahjongg \
gnome-mines \
gnome-sudoku \
aisleriot \
hitori
apt-get autoremove -y
echo >&2 "===]> Info: Reconfigure environment ... ";
locale-gen --purge en_US.UTF-8 en_US
echo -e 'LANG="C.UTF-8"\nLANGUAGE="C.UTF-8"\n' > /etc/default/locale
dpkg-reconfigure -f readline resolvconf
# /usr/bin/expect<<EOF
# spawn dpkg-reconfigure -f readline resolvconf
# expect "updates?" { send "Yes\r" }
# expect "dynamic files?" { send "Yes\r" }
# EOF
cat <<EOF > /etc/NetworkManager/NetworkManager.conf
[main]
rc-manager=resolvconf
plugins=ifupdown,keyfile
dns=dnsmasq
[ifupdown]
managed=false
EOF
dpkg-reconfigure network-manager
echo >&2 "===]> Info: Cleanup the chroot environment... ";
truncate -s 0 /etc/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
apt-get clean
rm -rf /tmp/* ~/.bash_history
umount -lf /dev/pts
umount -lf /sys
umount -lf /proc
export HISTSIZE=0

55
files/grub/grub.cfg Normal file
View File

@ -0,0 +1,55 @@
search --set=root --file /ubuntu
insmod all_video
set default="0"
set timeout=30
menuentry "Try Ubuntu FS without installing" {
linux /casper/vmlinuz boot=casper file=/cdrom/preseed/ubuntu.seed quiet splash ---
initrd /casper/initrd
}
menuentry "Try Ubuntu without installing (safe graphics)" {
set gfxpayload=keep
linux /casper/vmlinuz boot=casper file=/cdrom/preseed/ubuntu.seed quiet splash nomodeset ---
initrd /casper/initrd
}
menuentry "Install Ubuntu FS" {
linux /casper/vmlinuz boot=casper file=/cdrom/preseed/ubuntu.seed only-ubiquity quiet splash ---
initrd /casper/initrd
}
menuentry "Install Ubuntu FS (safe graphics)" {
set gfxpayload=keep
linux /casper/vmlinuz boot=casper file=/cdrom/preseed/ubuntu.seed only-ubiquity quiet splash ---
initrd /casper/initrd
}
menuentry "Check disc for defects" {
linux /casper/vmlinuz boot=casper integrity-check quiet splash ---
initrd /casper/initrd
}
menuentry "Test memory Memtest86+ (BIOS)" {
linux16 /install/memtest86+
}
menuentry "Test memory Memtest86 (UEFI, long load time)" {
insmod part_gpt
insmod search_fs_uuid
insmod chain
loopback loop /install/memtest86
chainloader (loop,gpt1)/efi/boot/BOOTX64.efi
}
grub_platform
if [ "$grub_platform" = "efi" ]; then
menuentry 'Boot from next volume' {
exit
}
menuentry 'UEFI Firmware Settings' {
fwsetup
}
fi

5
files/preseed/cli.seed Normal file
View File

@ -0,0 +1,5 @@
# Only install the standard system and language packs.
tasksel tasksel/first multiselect
d-i pkgsel/language-pack-patterns string
# No language support packages.
d-i pkgsel/install-language-support boolean false

11
files/preseed/ltsp.seed Normal file
View File

@ -0,0 +1,11 @@
# Build an LTSP client chroot.
d-i anna/choose_modules string ltsp-client-builder
d-i ltsp-client-builder/run boolean true
# Enable extras.ubuntu.com.
d-i apt-setup/extras boolean true
# Install the Ubuntu desktop and LTSP server.
tasksel tasksel/first multiselect ubuntu-desktop
d-i pkgsel/include/install-recommends boolean true
d-i pkgsel/include string ltsp-server-standalone openssh-server
# Build a client chroot.
d-i preseed/late_command string chroot /target /usr/sbin/ltsp-update-sshkeys

View File

@ -0,0 +1,9 @@
# Enable extras.ubuntu.com.
d-i apt-setup/extras boolean true
# Install the Ubuntu desktop.
tasksel tasksel/first multiselect ubuntu-desktop
# On live DVDs, don't spend huge amounts of time removing substantial
# application packages pulled in by language packs. Given that we clearly
# have the space to include them on the DVD, they're useful and we might as
# well keep them installed.
ubiquity ubiquity/keep-installed string icedtea6-plugin openoffice.org