summaryrefslogblamecommitdiffstats
path: root/remote/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions
blob: 362e8f14cda01b35763c03b9d2cb0da61d82fac1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
          














                                                                             
                                                        
                                    


                                                              
                             
                         
                                             

                  

                                   

















                                                                        



                                                                



                                                                



                                                                







                                                            
               













                                                                                        
                        






                                               

 
                                                       





                                                                       

                                       



                                                               



                                                                          
            

                                                                                             
                                                 

    
                                                                        

                                                                  
            
                                                                                             


                                                                                    

                                                                                   
                             



                                                                         



                                                                           
                  
                           
                                                                                                            
                                               









                                                                                                                     
                                                 
                                                            





                                                                                                                
    
                                                                        


        
                                                      





                                                                                                                 

  
               
                                                 



                                                        
                                                                                                                                                                               



                                                                        
                                                 
                                                                                      
                                      




                                                                      
                                           



                    
#!/bin/ash
# Copyright (c) 2013 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found under http://openslx.org
#
# Local hard disk autodetection script for OpenSLX linux stateless clients,
# detecting swap and special partitions

#############################################################################

# Mount point for persistent scratch partition (type 45)
PERSISTENT="/opt/openslx/persistent"

# General formatter for the /tmp partition on a local harddisk
diskfm () {
	mopt="" # Global var!
	local target="$1"
	local fslist="xfs jfs ext3 ext2 ext4"
	local fs
	local path
	[ $# -ge 2 ] && fslist="$2"
	for fs in $fslist ; do
		unset available
		case $(cat /proc/filesystems) in
			*${fs}*) available=yes;;
			*) modprobe "${fs}" && available=yes;;
		esac
		if [ -n "${available}" ]; then
			unset found
			if which "mkfs.$fs" ; then
				found=yes
				case "mkfs.$fs" in
					mkfs.xfs)
						fopt="-f"
						mopt="-o noexec"
					;;
					mkfs.ext2)
						fopt="-Fq"
						mopt="-o nocheck,noexec"
					;;
					mkfs.ext3|mkfs.ext4)
						fopt="-Fq"
						mopt="-o noexec"
					;;
					mkfs.reiserfs)
						fopt="-f"
						mopt="-o noexec"
					;;
					mkfs.jfs)
						fopt="-q"
						mopt="-o noexec"
					;;
				esac
				mkfs.$fs ${fopt} "${target}"
			fi
			[ -n "$found" ] && break
		fi
	done
}

mount_temp () {
	local PRE=$(pwd)
	if ! cd /tmp; then
		mount_temp_fallback $@
		return $?
	fi
	mount $@ /tmp || return 1
	chmod a+rwxt /tmp
	# Move stuff from working directory, which is old /tmp, to new /tmp just mounted
	mv ./* ./.[!.]* ./..?* /tmp/ 2> /dev/null
	local OLD=$(LANG=C ls -alh | grep -v -E ' \.\.?$' | grep -v '^total')
	[ -n "$OLD" ] && echo -- "Leftovers:" && echo -- "$OLD"
	cd "$PRE"
}

mount_temp_fallback () {
	mkdir -p /tmptmp
	mv /tmp/* /tmp/.* /tmptmp/ 2> /dev/null
	mount $@ /tmp || return 1
	chmod a+rwxt /tmp
	mv /tmptmp/* /tmptmp/.* /tmp/
	rmdir /tmptmp
	return 0
}

fdisk -l | sed -n "/^\/dev\//p" > "/etc/disk.partition"
# This is an ugly hack as sometimes this script is run too early,
# and fdisk won't report any partitions then. I assumed this would be
# solved by launching this script after udev-trigger finished, but
# apparently then it can still happen that we run too soon. This should
# be removed once someone figures out what fdisk really needs to work
# properly.
if [ ! -s "/etc/disk.partition" ]; then
	sleep 3
	echo "Retrying fdisk"
	fdisk -l | sed -n "/^\/dev\//p" > "/etc/disk.partition"
fi

echo "Partitions:"
cat "/etc/disk.partition"

# Check for standard swap partitions and make them available to the system
HAVE_SWAP=no
for hdpartnr in $(sed -n -e "/ 82 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
	echo -e "$hdpartnr\tswap\t\tswap\t\tdefaults\t 0 0" >> "/etc/fstab"
	swapon "$hdpartnr" -p 10 && HAVE_SWAP=yes
done

# We use special non assigned partition type (id44) for harddisk scratch
# space, thus no normal filesystem will be incidentally deleted or
# corrupted
HAVE_TEMP=no
for hdpartnr in $(sed -n -e "/ 44 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
	# check for supported filesystem and formatter
	if diskfm "$hdpartnr"; then
		# echo "$hdpartnr is mounted to /mnt/tmp at $(sysup)" >/tmp/tmpready
		mount_temp "$mopt" "$hdpartnr" || continue
		echo -e "${hdpartnr}\t/tmp\t\tauto\t\tnoexec\t 0 0" >> "/etc/fstab"
		HAVE_TEMP=yes
		break
	else
		echo "formatting failed for some reason"
	fi # Made this non-forking, systemd should handle it - 2013-05-28
done

# Put detected linux partitions (83) into /etc/fstab with "noauto", special
# partition 45 (persistent scratch) to /var/scratch and 46 to /var/openslx
HAVE_PERSISTENT=no
for partid in 83 45 46 ; do
	for hdpartnr in $(sed -n -e "/ ${partid} /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
		if [ "${partid}" -eq 83 ]; then
			mkdir -p "/media/${hdpartnr#/dev/*}"
			echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto,noexec\t 0 0" >> "/etc/fstab"
		elif [ "${partid}" -eq 45 -a "$HAVE_PERSISTENT" = "no" ]; then
			mkdir -p "$PERSISTENT"
			if ! mount -t auto -o noexec "${hdpartnr}" "$PERSISTENT"; then
				diskfm "$hdpartnr" "jfs xfs ext3" || continue
				mount -t auto -o noexec "${hdpartnr}" "$PERSISTENT" || continue
			fi
			HAVE_PERSISTENT=yes
			echo -e "${hdpartnr}\t${PERSISTENT}\tauto\t\tnoauto,noexec\t\t 0 0" >> "/etc/fstab"
		elif [ "${partid}" -eq 46 ]; then
			mkdir -p "/media/${hdpartnr#/dev/*}"
			#mount -t auto ${hdpartnr} /mnt/media/${hdpartnr#/dev/*} \n\
			#test -d /mnt/media/${hdpartnr#/dev/*}/home && \
			#  ln -sf /media/${hdpartnr#/dev/*} /var/home
			echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto\t\t 0 0" >> "/etc/fstab"
		fi
	done
done
[ "$HAVE_PERSISTENT" = "no" -a -d "$PERSISTENT" ] && rm -f "$PERSISTENT"

mount -a

# Make huge tmpfs if nothing could be mounted for /tmp
if [ "$HAVE_TEMP" = "no" ]; then
	 mount_temp -t tmpfs -o size=20G none
	 slxlog "partition-temp" "Running /tmp on tmpfs only!" "/etc/disk.partition"
fi
if [ "$HAVE_SWAP" = "no" ]; then
	slxlog "partition-swap" "Have no (formatted) swap partition, using zram swap only!" "/etc/disk.partition"
fi

# Add zram swap
[ "$(uname -r)" == "3.8.13.8-openslx" ] && exit 0
CPUS=$(grep -c -E "^processor.*[0-9]+$" /proc/cpuinfo)
if [ -z "$CPUS" ]; then
	echo "ERROR: Could not determine CPU core count"
else
	[ "$CPUS" -gt "16" ] && CPUS=16 # zram can only handle up to 32 devices, the system can apparently even just handle 29 swap partitions, so use a reasonable upper limit
	if ! modprobe zram "num_devices=$CPUS"; then
		echo "ERROR: Could not load zram module"
	else
		TOTAL=$(grep ^MemTotal /proc/meminfo | awk '{print $2}')
		USE=$(( $TOTAL / ( 2 * $CPUS ) ))
		echo "Have $CPUS cores, $TOTAL kb mem, use $USE kb zram swap per core"
		USE=$(( $USE * 1024 ))
		DEV=0
		while [ "$DEV" -lt "$CPUS" ]; do
			echo "$USE" > "/sys/block/zram${DEV}/disksize"
			mkswap "/dev/zram${DEV}"
			swapon "/dev/zram${DEV}" -p 1000
			DEV=$(( $DEV + 1 ))
		done
	fi
fi