manjaro-arm-installer 11.5 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
TMPDIR=/var/lib/manjaro-arm-tools/tmp
PROFILES=/usr/share/manjaro-arm-tools/profiles
ARCH='aarch64'
DEVICE='rpi3'
EDITION='minimal'
USER='manjaro'
PASSWORD='manjaro'
13
ROOTPASSWORD='root'
14

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



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


# Functions
23 24 25 26 27 28 29 30
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
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

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

53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
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
72 73

    # backup host mirrorlist
74
    #sudo mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-orig
Dan Johansen's avatar
Dan Johansen committed
75 76

    # Create arm mirrlorlist
77 78
    #echo "Server = http://mirrors.dotsrc.org/manjaro-arm/stable/\$arch/\$repo/" > mirrorlist
    #sudo mv mirrorlist /etc/pacman.d/mirrorlist
79 80
  
    # create chroot on SD card
81
    #    sudo pacstrap -G -c -C $LIBDIR/pacman.conf.$ARCH $TMPDIR/root base manjaro-arm-keyring
Dan Johansen's avatar
Dan Johansen committed
82 83
    
    # Enable cross architecture Chrooting
84 85 86 87 88 89 90 91 92 93 94 95 96 97
    #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..."
    sudo mkdir -p $TMPDIR/root
    sudo bsdtar -xpf $TMPDIR/Manjaro-ARM-$ARCH-Latest.tar.gc -C $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
98 99
    
    msg "Setting up keyrings..."
100 101
    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
102 103 104
    
    msg "Installing packages for $EDITION on $DEVICE..."
    # Install device and editions specific packages
105
    sudo systemd-nspawn -D $TMPDIR/root pacman -S $PKG_DEVICE $PKG_EDITION lsb-release --needed --noconfirm
Dan Johansen's avatar
Dan Johansen committed
106 107 108 109 110 111 112

    # 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
113 114
    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
115 116

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

    msg "Applying overlay for $EDITION..."
121
    sudo cp -ap $PROFILES/arm-profiles/overlays/$EDITION/* $TMPDIR/root/
Dan Johansen's avatar
Dan Johansen committed
122 123 124
    
    msg "Setting up users..."
    #setup users
125 126 127
    echo "$USER" > $TMPDIR/user
    echo "$PASSWORD" >> $TMPDIR/password
    echo "$PASSWORD" >> $TMPDIR/password
128 129 130
    echo "$ROOTPASSWORD" >> $TMPDIR/rootpassword
    echo "$ROOTPASSWORD" >> $TMPDIR/rootpassword
    sudo systemd-nspawn -D $TMPDIR/root passwd root < $TMPDIR/rootpassword 1> /dev/null 2>&1
131 132 133
    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
134 135 136 137 138
    
    msg "Enabling user services..."
    if [[ "$EDITION" = "minimal" ]] || [[ "$EDITION" = "server" ]]; then
        echo "No user services for $EDITION edition"
    else
139
        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
140 141 142 143
    fi

    msg "Setting up system settings..."
    #system setup
144 145
    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
146 147 148
    
    msg "Doing device specific setups for $DEVICE..."
    if [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "rpi3" ]]; then
149 150 151 152
        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
153 154 155 156 157
    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
158 159
        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
160 161 162 163
    else
        echo ""
    fi
    
164
    msg "Cleaning install for unwanted files..."
Dan Johansen's avatar
Dan Johansen committed
165
       if [[ "$DEVICE" = "oc1" ]] || [[ "$DEVICE" = "rpi2" ]] || [[ "$DEVICE" = "xu4" ]]; then
166
        sudo rm $TMPDIR/root/usr/bin/qemu-arm-static
Dan Johansen's avatar
Dan Johansen committed
167
    else
168
        sudo rm $TMPDIR/root/usr/bin/qemu-aarch64-static
Dan Johansen's avatar
Dan Johansen committed
169
    fi
170 171 172 173 174
    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
175

176
    msg "$DEVICE $EDITION install complete"
Dan Johansen's avatar
Dan Johansen committed
177 178 179
}

prepare_card () {
180
    msg "Getting $SDCARD ready for $DEVICE..."
Dan Johansen's avatar
Dan Johansen committed
181 182 183 184 185 186 187
    # 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`
188
        END_SECTOR=$(expr $START + $SIZE)
Dan Johansen's avatar
Dan Johansen committed
189 190
        sudo parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100%
        sudo partprobe $SDCARD
191 192 193 194
        sudo mkfs.vfat "${SDCARD}1"
        sudo mkfs.ext4 "${SDCARD}2"
        
        #Mount SD card
Dan Johansen's avatar
Dan Johansen committed
195 196
        mkdir -p $TMPDIR/root
        mkdir -p $TMPDIR/boot
197 198
        sudo mount ${SDCARD}1 $TMPDIR/boot
        sudo mount ${SDCARD}2 $TMPDIR/root
Dan Johansen's avatar
Dan Johansen committed
199 200 201 202 203 204 205 206 207 208

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

    # 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
226
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1
227 228
        
        # Mount SD card
Dan Johansen's avatar
Dan Johansen committed
229 230
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
231
        sudo mount ${SDCARD}1 $TMPDIR/root
232

Dan Johansen's avatar
Dan Johansen committed
233 234 235 236 237 238 239 240 241 242
    # 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
243
        sudo mkfs.ext4 -O ^metadata_csum,^64bit ${SDCARD}1
244 245
        
        # Mount SD card
Dan Johansen's avatar
Dan Johansen committed
246 247
        mkdir -p $TMPDIR/root
        sudo chmod 777 -R $TMPDIR/root
248
        sudo mount ${SDCARD}1 $TMPDIR/root
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 275 276 277 278 279 280 281 282 283 284 285
    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
286
        
287 288 289
        
    # For rockpro64 device
    elif [[ "$DEVICE" = "rockpro64" ]]; then
Dan Johansen's avatar
Dan Johansen committed
290 291 292 293 294 295 296 297 298
    #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
299 300
        
fi
Dan Johansen's avatar
Dan Johansen committed
301 302
}

303 304 305
# 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
306
read -p 'What is the path to the SD card? (example: /dev/sdb)? ' SDCARD
307
read -p 'What username do you want? ' USER
308 309
read -sp "What password should $USER have? " PASSWORD
read -sp "What password should the root user have? " ROOTPASSWORD
310 311 312 313 314
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
315 316 317 318 319 320 321 322


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

323 324 325 326 327
#if [[ ! -f $SDCARD ]]; then
 #   echo "Path $SDCARD does not exist! Aborting..."
 #   exit 1
#fi

Dan Johansen's avatar
Dan Johansen committed
328 329 330 331 332 333 334 335 336
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}')

337 338 339 340 341 342 343 344 345
# 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`

346

Dan Johansen's avatar
Dan Johansen committed
347
# Commands
348
timer_start=$(get_timer)
Dan Johansen's avatar
Dan Johansen committed
349 350

prepare_card
351 352 353 354
create_install
cleanup
show_elapsed_time "${FUNCNAME}" "${timer_start}"
sync