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

# Set globals
4 5
TMPDIR=/var/tmp/manjaro-arm-installer
PROFILES=/var/tmp/manjaro-arm-installer/profiles
6
ARCH='aarch64'
Dan Johansen's avatar
Dan Johansen committed
7 8 9


# Functions
10 11 12 13 14 15 16 17
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
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

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)"
}

40 41 42 43 44
getarmprofiles () {
    if ls $PROFILES/arm-profiles/* 1> /dev/null 2>&1; then
        cd $PROFILES/arm-profiles
        git pull
    else
45 46
        sudo mkdir -p $PROFILES
        sudo chmod 777 $PROFILES
47 48 49 50 51 52 53 54 55 56 57 58 59 60
        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
61 62

    # backup host mirrorlist
63
    #sudo mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-orig
Dan Johansen's avatar
Dan Johansen committed
64 65

    # Create arm mirrlorlist
66 67
    #echo "Server = http://mirrors.dotsrc.org/manjaro-arm/stable/\$arch/\$repo/" > mirrorlist
    #sudo mv mirrorlist /etc/pacman.d/mirrorlist
68 69
  
    # create chroot on SD card
70
    #    sudo pacstrap -G -c -C $LIBDIR/pacman.conf.$ARCH $TMPDIR/root base manjaro-arm-keyring
Dan Johansen's avatar
Dan Johansen committed
71 72
    
    # Enable cross architecture Chrooting
73 74 75 76 77 78 79 80 81 82 83 84
    #if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
    #    sudo cp /usr/bin/qemu-arm-static $TMPDIR/root/usr/bin/
    #else
    #    sudo cp /usr/bin/qemu-aarch64-static $TMPDIR/root/usr/bin/
    #fi
    
    # fetch and extract rootfs
    msg "Downloading latest $ARCH rootfs..."
    cd $TMPDIR
    wget https://www.strits.dk/files/Manjaro-ARM-$ARCH-latest.tar.gz
    
    msg "Extracting $ARCH rootfs..."
Dan Johansen's avatar
Dan Johansen committed
85
    sudo bsdtar -xpf $TMPDIR/Manjaro-ARM-$ARCH-latest.tar.gz -C $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
86 87
    
    msg "Setting up keyrings..."
88 89
    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
90 91 92
    
    msg "Installing packages for $EDITION on $DEVICE..."
    # Install device and editions specific packages
93
    sudo systemd-nspawn -D $TMPDIR/root pacman -S base $PKG_DEVICE $PKG_EDITION lsb-release --needed --noconfirm
Dan Johansen's avatar
Dan Johansen committed
94 95 96 97 98 99 100

    # 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
101 102
    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
103 104

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

    msg "Applying overlay for $EDITION..."
109
    sudo cp -ap $PROFILES/arm-profiles/overlays/$EDITION/* $TMPDIR/root/
Dan Johansen's avatar
Dan Johansen committed
110 111 112
    
    msg "Setting up users..."
    #setup users
113 114 115
    echo "$USER" > $TMPDIR/user
    echo "$PASSWORD" >> $TMPDIR/password
    echo "$PASSWORD" >> $TMPDIR/password
116 117 118
    echo "$ROOTPASSWORD" >> $TMPDIR/rootpassword
    echo "$ROOTPASSWORD" >> $TMPDIR/rootpassword
    sudo systemd-nspawn -D $TMPDIR/root passwd root < $TMPDIR/rootpassword 1> /dev/null 2>&1
119 120 121
    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
    sudo rm -rf $TMPDIR/root/var/cache/pacman/pkg/*
    sudo rm -rf $TMPDIR/root/var/log/*
    
    # Remove temp files on host
Dan Johansen's avatar
Dan Johansen committed
162 163
    sudo rm -rf $TMPDIR/user $TMPDIR/password $TMPDIR/rootpassword
    sudo rm -rf $TMPDIR/Manjaro-ARM-$ARCH-latest.tar.gz
Dan Johansen's avatar
Dan Johansen committed
164

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

prepare_card () {
169
    msg "Getting $SDCARD ready for $DEVICE..."
Dan Johansen's avatar
Dan Johansen committed
170 171 172 173 174 175 176
    # 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`
177
        END_SECTOR=$(expr $START + $SIZE)
Dan Johansen's avatar
Dan Johansen committed
178 179
        sudo parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100%
        sudo partprobe $SDCARD
180 181 182 183
        sudo mkfs.vfat "${SDCARD}1"
        sudo mkfs.ext4 "${SDCARD}2"
        
        #Mount SD card
Dan Johansen's avatar
Dan Johansen committed
184 185
        mkdir -p $TMPDIR/root
        mkdir -p $TMPDIR/boot
186 187
        sudo mount ${SDCARD}1 $TMPDIR/boot
        sudo mount ${SDCARD}2 $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
188 189 190 191 192 193 194 195 196 197

    # 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
198
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1
199 200
        
        #Mount SD card
Dan Johansen's avatar
Dan Johansen committed
201 202
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
203
        sudo mount ${SDCARD}1 $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
204 205 206 207 208 209 210 211 212 213 214

    # 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
215
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1
216 217
        
        # Mount SD card
Dan Johansen's avatar
Dan Johansen committed
218 219
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
220
        sudo mount ${SDCARD}1 $TMPDIR/root
221

Dan Johansen's avatar
Dan Johansen committed
222 223 224 225 226 227 228 229 230 231
    # 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
232
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1
233 234
        
        # Mount SD card
Dan Johansen's avatar
Dan Johansen committed
235 236
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
237
        sudo mount ${SDCARD}1 $TMPDIR/root
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 274
    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
275
        
276 277 278
        
    # For rockpro64 device
    elif [[ "$DEVICE" = "rockpro64" ]]; then
Dan Johansen's avatar
Dan Johansen committed
279 280 281 282 283 284 285 286 287
    #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
288 289
        
fi
Dan Johansen's avatar
Dan Johansen committed
290 291
}

292
# Asking for user input!
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
#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? (example: /dev/sdb)? ' SDCARD
#read -p 'What username do you want? ' USER
#read -sp "What password should $USER have? " PASSWORD
#read -sp "
#What password should the root user have? " ROOTPASSWORD
#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"


# Using ncurses to ask for user input for variables
DEVICE=$(dialog --clear --title "Manjaro-ARM Installer" \
        --menu "Choose a device:" 20 51 4 \
        "rpi3" "Raspberry Pi 3" \
        "oc2" "Odroid C2" \
	"pinebook" "PineBook" 3>&1 1>&2 2>&3 3>&-)


#The if statement makes sure that the user has put in something in the previous prompt. If not (left blank or pressed cancel) the script will end
if [ ! -z "$DEVICE" ]
then
EDITION=$(dialog --clear --title "Manjaro-ARM Installer" \
	--menu "Choose an edition:" 20 50 4 \
	"minimal" "Minimal Edition (Just CLI)" \
	"lxqt" "Full LXQT Desktop and apps (lightweight)" \
	"kde" "Full KDE Desktop (Heavy)" 3>&1 1>&2 2>&3 3>&-) 

else 
	clear
	exit 1
fi


if [ ! -z "$EDITION" ]
then
USER=$(dialog --clear --title "Manjaro-ARM Installer" \
	--inputbox "Enter username:" 8 50 \
        3>&1 1>&2 2>&3 3>&-)
else 
	clear
	exit 1
fi




if [ ! -z "$USER" ]
then
PASSWORD=$(dialog --clear --title "Manjaro-ARM Installer" \
	--passwordbox "Enter Password:" 8 50 \
        3>&1 1>&2 2>&3 3>&- \
	)
else 
	clear
	exit 1
fi



if [ ! -z "$PASSWORD" ]
then
ROOTPASSWORD=$(dialog --clear --title "Manjaro-ARM Installer" \
	--passwordbox "Enter Root Password:" 8 50 \
        3>&1 1>&2 2>&3 3>&- \
	)
else 
	clear
	exit 1
fi




if [ ! -z "$ROOTPASSWORD" ]
then

# simple command to put the results of lsblk (just the names of the devices) into an array and make that array populate the options	
let i=0
W=()
while read -r line; do
    let i=$i+1
    W+=($line "")
done < <( lsblk -adn -o NAME )
SDCARD=$(dialog --title "Manjaro-ARM Installer" \
	--menu "Chose your SDCard" 20 50 4 \
       	"${W[@]}" 3>&2 2>&1 1>&3)

# add /dev/ to the selected option above
SDCARD=/dev/$SDCARD
else 
	clear
	exit 1
fi


# List all the responses upon completion (remove this for production)
clear
395 396
echo "Device = $DEVICE"
echo "Edition = $EDITION"
397 398 399 400
echo "User name = $USER"
echo "Password = ********** ($PASSWORD)" #password is here for testing purposes
echo "Root Password = ********** ($ROOTPASSWORD)" #password is here for testing purposes
echo "SDCard = $SDCARD"
Dan Johansen's avatar
Dan Johansen committed
401 402 403 404 405 406 407

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

408 409
# get the profiles
getarmprofiles
Dan Johansen's avatar
Dan Johansen committed
410 411 412 413 414 415

#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}')

416 417 418 419 420 421 422 423 424
# 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`

425

Dan Johansen's avatar
Dan Johansen committed
426
# Commands
427
timer_start=$(get_timer)
Dan Johansen's avatar
Dan Johansen committed
428 429

prepare_card
430 431 432 433
create_install
cleanup
show_elapsed_time "${FUNCNAME}" "${timer_start}"
sync