manjaro-arm-installer 11 KB
Newer Older
Dan Johansen's avatar
Dan Johansen committed
1 2 3 4 5
#! /bin/bash

# Set globals
LIBDIR=/usr/share/manjaro-arm-tools/lib
SDCARD=/dev/mmcblk0
6 7 8 9 10 11 12 13
TMPDIR=/var/lib/manjaro-arm-tools/tmp
PROFILES=/usr/share/manjaro-arm-tools/profiles
ARCH='aarch64'
DEVICE='rpi3'
EDITION='minimal'
USER='manjaro'
PASSWORD='manjaro'

Dan Johansen's avatar
Dan Johansen committed
14 15 16 17



#imports
18
#source $LIBDIR/functions.sh
Dan Johansen's avatar
Dan Johansen committed
19 20 21


# Functions
22 23 24 25 26 27 28 29
msg() {
    ALL_OFF="\e[1;0m"
    BOLD="\e[1;1m"
    GREEN="${BOLD}\e[1;32m"
      local mesg=$1; shift
      printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
 }

Dan Johansen's avatar
Dan Johansen committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

usage_build_installer() {
    echo "Usage: ${0##*/} [options]"
    echo '    -h                 This help'
    echo ''
    echo ''
    exit $1
}

get_timer(){
    echo $(date +%s)
}

# $1: start timer
elapsed_time(){
    echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }')
}

show_elapsed_time(){
    msg "Time %s: %s minutes..." "$1" "$(elapsed_time $2)"
}

52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
getarmprofiles () {
    if ls $PROFILES/arm-profiles/* 1> /dev/null 2>&1; then
        cd $PROFILES/arm-profiles
        git pull
    else
        cd $PROFILES
        git clone https://gitlab.com/Strit/arm-profiles.git
    fi

}

create_install() {
 if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
        ARCH='armv7h'
    else
        ARCH='aarch64'
    fi

    msg "Creating install for $DEVICE..."
Dan Johansen's avatar
Dan Johansen committed
71 72 73 74 75 76 77

    # backup host mirrorlist
    sudo mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-orig

    # Create arm mirrlorlist
    echo "Server = http://mirrors.dotsrc.org/manjaro-arm/stable/\$arch/\$repo/" > mirrorlist
    sudo mv mirrorlist /etc/pacman.d/mirrorlist
78 79 80
  
    # create chroot on SD card
        sudo pacstrap -G -c -C $LIBDIR/pacman.conf.$ARCH $TMPDIR/root base manjaro-arm-keyring
Dan Johansen's avatar
Dan Johansen committed
81 82 83
    
    # Enable cross architecture Chrooting
    if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
84
        sudo cp /usr/bin/qemu-arm-static $TMPDIR/root/usr/bin/
Dan Johansen's avatar
Dan Johansen committed
85
    else
86
        sudo cp /usr/bin/qemu-aarch64-static $TMPDIR/root/usr/bin/
Dan Johansen's avatar
Dan Johansen committed
87 88 89
    fi
    
    msg "Setting up keyrings..."
90 91
    sudo systemd-nspawn -D $TMPDIR/root pacman-key --init 1> /dev/null 2>&1
    sudo systemd-nspawn -D $TMPDIR/root pacman-key --populate archlinuxarm manjaro manjaro-arm 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
92 93 94
    
    msg "Installing packages for $EDITION on $DEVICE..."
    # Install device and editions specific packages
95
    sudo systemd-nspawn -D $TMPDIR/root pacman -S $PKG_DEVICE $PKG_EDITION lsb-release --needed --noconfirm
Dan Johansen's avatar
Dan Johansen committed
96 97 98 99 100 101 102

    # restore original mirrorlist to host system
    sudo mv /etc/pacman.d/mirrorlist-orig /etc/pacman.d/mirrorlist
    sudo pacman -Syy
    
    msg "Enabling services..."
    # Enable services
103 104
    sudo systemd-nspawn -D $TMPDIR/root systemctl enable systemd-networkd.service getty.target haveged.service dhcpcd.service 1> /dev/null 2>&1
    sudo systemd-nspawn -D $TMPDIR/root systemctl enable $SRV_EDITION 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
105 106

    if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "oc2" ]]; then
107
        sudo systemd-nspawn -D $TMPDIR/root systemctl enable amlogic.service 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
108 109 110
    fi

    msg "Applying overlay for $EDITION..."
111
    sudo cp -ap $PROFILES/arm-profiles/overlays/$EDITION/* $TMPDIR/root/
Dan Johansen's avatar
Dan Johansen committed
112 113 114
    
    msg "Setting up users..."
    #setup users
115 116 117 118 119 120 121
    echo "$USER" > $TMPDIR/user
    echo "$PASSWORD" >> $TMPDIR/password
    echo "$PASSWORD" >> $TMPDIR/password
    sudo systemd-nspawn -D $TMPDIR/root passwd root < $TMPDIR/password 1> /dev/null 2>&1
    sudo systemd-nspawn -D $TMPDIR/root useradd -m -g users -G wheel,storage,network,power -s /bin/bash $(cat $TMPDIR/user) 1> /dev/null 2>&1
    sudo systemd-nspawn -D $TMPDIR/root passwd $(cat $TMPDIR/user) < $TMPDIR/password 1> /dev/null 2>&1

Dan Johansen's avatar
Dan Johansen committed
122 123 124 125 126
    
    msg "Enabling user services..."
    if [[ "$EDITION" = "minimal" ]] || [[ "$EDITION" = "server" ]]; then
        echo "No user services for $EDITION edition"
    else
127
        sudo systemd-nspawn -D $TMPDIR/root --user $(cat $TMPDIR/user) systemctl --user enable pulseaudio.service 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
128 129 130 131
    fi

    msg "Setting up system settings..."
    #system setup
132 133
    sudo systemd-nspawn -D $TMPDIR/root chmod u+s /usr/bin/ping 1> /dev/null 2>&1
    sudo systemd-nspawn -D $TMPDIR/root update-ca-trust 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
134 135 136
    
    msg "Doing device specific setups for $DEVICE..."
    if [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "rpi3" ]]; then
137 138 139 140
        echo "dtparam=audio=on" | sudo tee --append $TMPDIR/root/boot/config.txt
        echo "hdmi_drive=2" | sudo tee --append $TMPDIR/root/boot/config.txt
        echo "audio_pwm_mode=2" | sudo tee --append $TMPDIR/root/boot/config.txt
        echo "/dev/mmcblk0p1  /boot   vfat    defaults        0       0" | sudo tee --append $TMPDIR/root/etc/fstab
Dan Johansen's avatar
Dan Johansen committed
141 142 143 144 145
    elif [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "oc2" ]]; then
        echo "No device setups for $DEVICE..."
    elif [[ "$DEVICE" = "rock64" ]] || [[ "$DEVICE" = "rockpro64" ]]; then
        echo "No device setups for $DEVICE..."
    elif [[ "$DEVICE" = "pinebook" ]]; then
146 147
        sudo systemd-nspawn -D $TMPDIR/root systemctl enable pinebook-post-install.service 1> /dev/null 2>&1
        sudo systemd-nspawn -D $TMPDIR/root --user $(cat $TMPDIR/user) systemctl --user enable pinebook-user.service 1> /dev/null 2>&1
Dan Johansen's avatar
Dan Johansen committed
148 149 150 151
    else
        echo ""
    fi
    
152
    msg "Cleaning install for unwanted files..."
Dan Johansen's avatar
Dan Johansen committed
153
       if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
154
        sudo rm $TMPDIR/root/usr/bin/qemu-arm-static
Dan Johansen's avatar
Dan Johansen committed
155
    else
156
        sudo rm $TMPDIR/root/usr/bin/qemu-aarch64-static
Dan Johansen's avatar
Dan Johansen committed
157
    fi
158 159 160 161 162
    sudo rm -rf $TMPDIR/root/var/cache/pacman/pkg/*
    sudo rm -rf $TMPDIR/root/var/log/*
    
    # Remove temp files on host
    sudo rm -rf $TMPDIR/user $TMPDIR/password
Dan Johansen's avatar
Dan Johansen committed
163

164
    msg "$DEVICE $EDITION install complete"
Dan Johansen's avatar
Dan Johansen committed
165 166 167
}

prepare_card () {
168
    msg "Getting $SDCARD ready for $DEVICE..."
Dan Johansen's avatar
Dan Johansen committed
169 170 171 172 173 174 175
    # For Raspberry Pi devices
    if [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "rpi3" ]]; then
        #partition with boot and root
        sudo parted -s $SDCARD mklabel msdos
        sudo parted -s $SDCARD mkpart primary fat32 0% 100M
        START=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/start`
        SIZE=`cat /sys/block/$DEV_NAME/${DEV_NAME}1/size`
176
        END_SECTOR=$(expr $START + $SIZE)
Dan Johansen's avatar
Dan Johansen committed
177 178
        sudo parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100%
        sudo partprobe $SDCARD
179 180 181 182
        sudo mkfs.vfat "${SDCARD}1"
        sudo mkfs.ext4 "${SDCARD}2"
        
        #Mount SD card
Dan Johansen's avatar
Dan Johansen committed
183 184
        mkdir -p $TMPDIR/root
        mkdir -p $TMPDIR/boot
185 186
        sudo mount ${SDCARD}1 $TMPDIR/boot
        sudo mount ${SDCARD}2 $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
187 188 189 190 191 192 193 194 195 196

    # For Odroid devices
    elif [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "oc2" ]] || [[ "$DEVICE" = "xu4" ]]; then
        #Clear first 8mb
        sudo dd if=/dev/zero of=${SDCARD} bs=1M count=8
	
    #partition with a single root partition
        sudo parted -s $SDCARD mklabel msdos
        sudo parted -s $SDCARD mkpart primary ext4 0% 100%
        sudo partprobe $SDCARD
197
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1
198 199
        
        #Mount SD card
Dan Johansen's avatar
Dan Johansen committed
200 201
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
202
        sudo mount ${SDCARD}1 $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
203 204 205 206 207 208 209 210 211 212 213

    # For pinebook device
    elif [[ "$DEVICE" = "pinebook" ]]; then

    #Clear first 8mb
        sudo dd if=/dev/zero of=${SDCARD} bs=1M count=8
	
    #partition with a single root partition
        sudo parted -s $SDCARD mklabel msdos
        sudo parted -s $SDCARD mkpart primary ext4 0% 100%
        sudo partprobe $SDCARD
214
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1
215 216
        
        # Mount SD card
Dan Johansen's avatar
Dan Johansen committed
217 218
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
219
        sudo mount ${SDCARD}1 $TMPDIR/root
220

Dan Johansen's avatar
Dan Johansen committed
221 222 223 224 225 226 227 228 229 230
    # For rockpro64 device
    elif [[ "$DEVICE" = "rockpro64" ]]; then

    #Clear first 8mb
        sudo dd if=/dev/zero of=${SDCARD} bs=1M count=8
	
    #partition with a single root partition
        sudo parted -s $SDCARD mklabel msdos
        sudo parted -s $SDCARD mkpart primary ext4 0% 100%
        sudo partprobe $SDCARD
231
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1
232 233
        
        # Mount SD card
Dan Johansen's avatar
Dan Johansen committed
234 235
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
236
        sudo mount ${SDCARD}1 $TMPDIR/root
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
    fi
}

cleanup () {
    msg "Writing bootloader and cleaning up after install..."
   # For Raspberry Pi devices
    if [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "rpi3" ]]; then
       #copy rootfs contents over to the FS
        sudo mv $TMPDIR/root/boot/* $TMPDIR/boot
        
        #clean up
        sudo umount $TMPDIR/root
        sudo umount $TMPDIR/boot
        sudo rm -r $TMPDIR/root $TMPDIR/boot
        sudo partprobe $SDCARD
        
# For Odroid devices
    elif [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "oc2" ]] || [[ "$DEVICE" = "xu4" ]]; then
    #flash bootloader
        cd $TMPDIR/root/boot/
        sudo ./sd_fusing.sh $SDCARD
        cd ~

    #clean up
        sudo umount $TMPDIR/root
        sudo rm -r $TMPDIR/root
        sudo partprobe $SDCARD
        
    # For pinebook device
    elif [[ "$DEVICE" = "pinebook" ]]; then
    #flash bootloader
        sudo dd if=$TMPDIR/root/boot/u-boot-sunxi-with-spl-$DEVICE.bin of=${SDCARD} bs=8k seek=1
        
    #clean up
        sudo umount $TMPDIR/root
        sudo rm -r $TMPDIR/root
        sudo partprobe $SDCARD
Dan Johansen's avatar
Dan Johansen committed
274
        
275 276 277
        
    # For rockpro64 device
    elif [[ "$DEVICE" = "rockpro64" ]]; then
Dan Johansen's avatar
Dan Johansen committed
278 279 280 281 282 283 284 285 286
    #flash bootloader
        sudo dd if=$TMPDIR/root/boot/idbloader.img of=${SDCARD} seek=64 conv=notrunc
        sudo dd if=$TMPDIR/root/boot/uboot.img of=${SDCARD} seek=16384 conv=notrunc
        sudo dd if=$TMPDIR/root/boot/trust.img of=${SDCARD} seek=24576 conv=notrunc
        
    #clean up
        sudo umount $TMPDIR/root
        sudo rm -r $TMPDIR/root
        sudo partprobe $SDCARD
287 288
        
fi
Dan Johansen's avatar
Dan Johansen committed
289 290
}

291 292 293 294 295 296 297 298 299 300 301
# Asking for user input!
read -p 'What device is this for? [Options: rpi3, oc2 and pinebook] ' DEVICE
read -p 'What edition do you want? [Options: minimal, lxqt and kde] ' EDITION
read -p 'What is the path to the SD card? (/dev/???)? ' SDCARD
read -p 'What username do you want? ' USER
read -sp "What password should $USER and root have? " PASSWORD
echo " " #to fix next line from being in the password line
echo "Device = $DEVICE"
echo "Edition = $EDITION"
echo "Path to SD Card = $SDCARD"
echo "Username = $USER"
Dan Johansen's avatar
Dan Johansen committed
302 303 304 305 306 307 308 309


if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
    ARCH='armv7h'
else
    ARCH='aarch64'
fi

310 311 312 313 314
#if [[ ! -f $SDCARD ]]; then
 #   echo "Path $SDCARD does not exist! Aborting..."
 #   exit 1
#fi

Dan Johansen's avatar
Dan Johansen committed
315 316 317 318 319 320 321 322 323
if [ ! -d "$PROFILES/arm-profiles" ]; then
    getarmprofiles
fi

#Package lists
PKG_DEVICE=$(grep "^[^#;]" $PROFILES/arm-profiles/devices/$DEVICE | awk '{print $1}')
PKG_EDITION=$(grep "^[^#;]" $PROFILES/arm-profiles/editions/$EDITION | awk '{print $1}')
SRV_EDITION=$(grep "^[^#;]" $PROFILES/arm-profiles/services/$EDITION | awk '{print $1}')

324 325 326 327 328 329 330 331 332
# Remove '/dev/' from the name 
DEV_NAME=`echo "$SDCARD" | cut -d "/" -f 3`

# Get size of SDCard (final sector)
SECTOR_SIZE=`cat /sys/block/${DEV_NAME}/size`

# Set the ending sector that the partition should be resized too
END_SECTOR=`expr $SECTOR_SIZE - 1`

333

Dan Johansen's avatar
Dan Johansen committed
334
# Commands
335
timer_start=$(get_timer)
Dan Johansen's avatar
Dan Johansen committed
336 337

prepare_card
338 339 340 341
create_install
cleanup
show_elapsed_time "${FUNCNAME}" "${timer_start}"
sync