Ab SFOS 4.2 nicht mehr nötig, da Apps Daten auf der Speicherkarte oder dem Internen Speicher ablegen können
Die meisten Sailfish OS kompatiblen Smartphone Modelle bieten eine Speicherkapazität von 32 GB, einige Modelle auch 64 GB. Daher ist es etwas schwer nachzuvollziehen, warum Jolla den Systemspeicher ab Werk nur mit 2,8 GB bemisst, zumal für ein Systemupdate mindestens 650 MB des Systemspeichers verfügbar sein müssen. Umso erfreulicher ist es, dass die Sailfish OS Systempatition vergrößert werden kann. Dies geht allerdings zu Lasten des Userdatenspeichers, der voreingestellt bei 32 GB Gesamtspeicher ca. 19 GB umfasst. Für Userdaten empfiehlt sich daher eine SD-Speicherkarte, zumal hier die Daten vom fest verbauten Hauptspeicher des Gerätes separiert sind. Im Falle eines Telefondefektes können Userdaten somit ohne großen Aufwand exportiert werden.
Sailfish OS selbst hat noch keine Möglichkeit ohne Terminalkonfiguration sämtliche Userdaten auf die SD-Karte auszulagern. Der Linux Systemkern sowie die grundlegenden Dateisystemfunktionen ermöglichen eine Auslagerung auf eine SD-Karte recht einfach, in dem die Speicherpfade der Userdaten auf dem Telefonspeicher einfach auf die SD-Karte verlinkt/gemappt werden. Um mehrfaches Einlesen diverser Apps wie z.B. der Gallery App zu vermeiden, gibt es 2 Möglichkeiten:
- Anlegen eines (versteckten) Hauptordners, in dem dann die Mappingordner erstellt werden
- Anlegen jedes Mappingordners als versteckten Ordner
Um den Hauptordner von der Indexierung auszuschließen, gibt es ebenfalls zwei Möglichkeiten:
- Anlegen eines versteckten Hauptordners mit einem vorangestellten Punkt (Hauptordner)
- Anlegen einer versteckten Datei (.nomedia) im Hauptordner.
Die beste Methode in Bezug auf die grafische Dateiverwaltung ist das Anlegen eines normalen Hauptordners mit einer versteckten „Anti-Index-Datei“. Alle Ordner sind damit sichtbar. Der Hauptordner mit den Mappingordnern wird durch eine nicht versteckte Datei (.nomedia) von der Indexierung, auf die z.B. die Gallery App zurückgreift, ausgeschlossen. Somit werden nur die verlinkten Ordner mit ihrem jeweiligen Linkziel auf den Mappingordner indexiert, jedoch nicht der Mappingordner selbst, da dieser sich in dem von der Indexierung ausgeschlossenen Hauptordner auf der SD-Karte befindet. Alternativ kann auch die gesamte SD-Karte von der Indexierung ausgeschlossen, wenn alle User Ordner gemappt wurden.
Mit folgendem Script können die Speicherpfade auf die SD-Karte verschoben, die doppelte Indexierung deaktiviert und nach Abschluss eine Neuindexeierung vollzogen werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 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 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 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 |
#!/bin/bash # name : sfos_sc.sh # desciption : sailfish os storage chooser // remap sailfish smartphone storage dirsectories to sd card # autor : speefak (itoss@gmx.de) # licence : (CC) BY-NC-SA VERSION=2.0 # #------------------------------------------------------------------------------------------------------------ ############################################################################################################ ####################################### define global variables ######################################## ############################################################################################################ #------------------------------------------------------------------------------------------------------------ UserSystemDirList="Desktop Documents Downloads Music Pictures Playlists Public Videos" SDcardPath=$(mount -l | grep " /run/media/nemo" | cut -d " " -f3) ContentBackupDir=/home/nemo/sfos_sc_backup_$(date "+%F_%H:%M:%S") if [[ ! $(rpm -qa | grep -w sudo) ]]; then sudoCMD=devel-su ; else sudoCMD=sudo; fi #------------------------------------------------------------------------------------------------------------ ############################################################################################################ ########################################### define functions ########################################### ############################################################################################################ #------------------------------------------------------------------------------------------------------------ usage () { cat << USAGE sailfish os storage chooser - version $VERSION usage: $basename $0 <option> options: -h, --help display help -v, --version display version -rd2sd remap directories to sd card -rddir recreate default user directories on smartphone storage -cfgix config tracker index ( comming soon ) USAGE exit 0 } #------------------------------------------------------------------------------------------------------------ check_for_valid_path () { #usage: check_for_valid_path "/checked/path" ProcessingPath=$1 #check write persmission check_write_permission () { touch $ProcessingPath/permissiontest 2>/dev/null if [[ $? == 0 ]]; then printf "\e[0;32m user has write permission for: $ProcessingPath\n"$(tput sgr0) rm $ProcessingPath/permissiontest else printf "\e[0;31m user has no write permission for: $ProcessingPath\n"$(tput sgr0) request_loop () { SetPermission= printf "\n set permission (nemo.nemo): $ProcessingPath\n" read -n1 -e -p " continue / abort (c/A) " SetPermission if [[ $SetPermission == [cC] ]]; then request_loop_root () { printf " Root permission required. Enter password or cancel ( crtl+shift+c ):"ProccessingUserSystemDirListProccessingUserSystemDirLi SetPermissionOutput=$(devel-su chown -R nemo.nemo $ProcessingPath 2>&1 | sed 's/Password://') if [[ $(grep failed <<< $SetPermissionOutput) ]]; then printf " $(echo $SetPermissionOutput | sed s/\\n// ) \n" request_loop_root fi } request_loop_root elif [[ $SetPermission == [aA] ]]; then printf "\n\e[0;31m seting permission failed: $ProcessingPath \n"$(tput sgr0) exit 1 else request_loop fi } request_loop fi } # check or create path if [[ -d $1 ]]; then printf "\e[0;32m path exists: $ProcessingPath\n"$(tput sgr0) check_write_permission else printf "\e[0;33m create path: $ProcessingPath\n"$(tput sgr0) MkdirOutput=$(mkdir $ProcessingPath 2>&1) if [[ $MkdirOutput ]]; then printf "\n error creating path $MkdirOutput\n" exit 1 fi check_write_permission fi printf "\n" } #------------------------------------------------------------------------------------------------------------ choose_proccessing_directories () { # usage: choose_proccessing_directories <remap|restore> Mode=$1 # user directory mapping request for UserSystemDir in $UserSystemDirList ; do request_loop () { DirRequest= read -n1 -e -p " $Mode directory: $UserSystemDir (y/N)? " DirRequest if [[ "$DirRequest" == [yY] ]]; then ProccessingUserSystemDirList=$(echo $ProccessingUserSystemDirList $UserSystemDir) elif [[ "$DirRequest" == [nN] ]]; then printf "" else request_loop fi } request_loop done # request android storage or exit if no direcoty is selected if [[ ! $ProccessingUserSystemDirList ]]; then printf "\n no directory selected ...\n" exit 0 fi printf "\n" } #------------------------------------------------------------------------------------------------------------ create_mapping_directories () { # create mapping directories on sd card for MappingDir in $ProccessingUserSystemDirList ; do check_for_valid_path "$SDcardPath/$MappingDir" done } #------------------------------------------------------------------------------------------------------------ move_soure_directory_content_to_mapping_directory_create_link () { substitute_source_directory_with_link () { # check for special directory links like android storage if [[ $ProcessingDir == android_storage ]]; then rm /home/.android/data/media ln -s $SDcardPath/android_storage /home/.android/data/media return fi printf "\n replace /home/nemo/$ProcessingDir with link to $SDcardPath/$ProcessingDir" ln -s $SDcardPath/$ProcessingDir /home/nemo/$ProcessingDir } printf "\n moving directories to sd card : $ProccessingUserSystemDirList \n" request_loop () { CPTContinue= read -n1 -e -p " continue / abort (c/A)? " CPTContinue if [[ "$CPTContinue" == [cC] ]]; then printf "" elif [[ "$CPTContinue" == [aA] ]]; then printf "\n abort, exit ... \n" exit 0 else request_loop fi } request_loop for ProcessingDir in $ProccessingUserSystemDirList ; do # stop any android apps and service for proccessing android directory if [[ $ProcessingDir == android_storage ]]; then AndroidRunnungStatus=$(systemctl status alien-service-manager.service | bash -c "grep "running"") $sudoCMD systemctl stop alien-service-manager.service if [[ ! $? == 0 ]]; then printf "\e[0;31m can't stop android service \n"$(tput sgr0) continue fi fi # check for already linked directory if [[ $(ls -l /home/nemo/$ProcessingDir | grep " -> /") ]] ; then printf "\n directory already linked: $(ls -l /home/nemo/$ProcessingDir | grep " -> /" | awk -F " " '{printf "%s %s %s %s %s \n",$9, $10, $11, $12, $13}')" # check for empty directory elif [[ ! $(ls -A /home/nemo/$ProcessingDir 2</dev/null ) ]] ; then printf "\n moving content skipped (no content): /home/nemo/$ProcessingDir" substitute_source_directory_with_link # move directory content to target directory on sd card else printf "\n moving content ... ( /home/nemo/$ProcessingDir/* $SDcardPath/$ProcessingDir/ )" cp -aR /home/nemo/$ProcessingDir/. $SDcardPath/$ProcessingDir/ ErrorLog=$? if [[ $ErrorLog = 0 ]]; then # move source content to backup directory mkdir $ContentBackupDir mv /home/nemo/$ProcessingDir/ $ContentBackupDir substitute_source_directory_with_link else printf "\n ERROR moving content ... ( /home/nemo/$ProcessingDir/* $SDcardPath/$ProcessingDir/ )" fi fi printf "\n" done } #------------------------------------------------------------------------------------------------------------ recreate_default_user_directories () { #TODO request : check for free space on internal storage and copy sd card content to internal storage # delete choosen symlinks and create directories cd /home/nemo for ProccessingUserSystemDir in $ProccessingUserSystemDirList ; do RemoveError=$(rm /home/nemo/$ProccessingUserSystemDir 2>&1 | awk -F "': " '{printf $2}' | tr '[:upper:]' '[:lower:]' ) if [[ $RemoveError ]]; then printf "\n Processing skipped: /home/nemo/$ProccessingUserSystemDir $RemoveError" continue fi mkdir /home/nemo/$ProccessingUserSystemDir chmod 755 /home/nemo/$ProccessingUserSystemDir # check for special directory links like android storage if [[ $ProcessingDir == android_storage ]]; then rm /home/.android/data/media ln -s /home/.android/data/media /home/nemo/android_storage return fi done printf "\n" cd - > /dev/null } #------------------------------------------------------------------------------------------------------------ skip_sd_card_file_indexing () { # usage: skip_sd_card_file_indexing <-rq|-rs> (ReQeust|ReStore) #TODO: exclude indexing for each mapped directory instead of global index excluding on entire sd card # create exclude index main dir on sd card to create target directories in there # extend / create layer SDcardPath="$(mount -l | busybox grep " /run/media/nemo" | cut -d " " -f3)exclude_index" if [[ $1 == "-rq" ]]; then printf "\e[0;33m" printf "\n Tracker indexes directories on Smartphone and sdcard storage." printf "\n If indexing for linked directories on sd card is not disabled," printf "\n tracker indexes linked and source directories/files." printf "\n So files are indexed and shown serveral times.\n\n"$(tput sgr0) request_loop () { DirIndex= read -n1 -e -p " disable file index for sd card (y/N)? " DirIndex if [[ "$DirIndex" == [yY] ]]; then touch $SDcardPath/.nomedia printf " file index disabled: $SDcardPath" elif [[ "$DirIndex" == [nN] ]]; then rm $SDcardPath/.nomedia 2> /dev/null if [[ $? == 1 ]]; then printf " file index already enabled: $SDcardPath" else printf " file index enabled: $SDcardPath" fi else request_loop fi printf "\n" } request_loop elif [[ $1 == "-rs" ]]; then ExcludeIndexDirList=$(find /home/nemo $SDcardPath -name .nomedia 2> /dev/null | grep -v android_storage) for ExludeIndexDir in $ExcludeIndexDirList ; do request_loop () { ExcludeDirRequest= read -n1 -e -p " enable directory index for : $ExludeIndexDir (y/N)? " ExcludeDirRequest if [[ "$ExcludeDirRequest" == [yY] ]]; then printf "" rm $ExludeIndexDir elif [[ "$ExcludeDirRequest" == [nN] ]]; then printf "" else request_loop fi printf "" } request_loop done fi printf "\n" } #------------------------------------------------------------------------------------------------------------ config_tracker_index () { echo TODO #TODO # read linked directories in /home/nemo # read excluded directories in /home/nemo and /sdcardstorage contianin .nomedia file # Request for upwards directory for linked directories to exclude from tracker ( default entire SD card ) # Request for single exclude directories in /home/nemo and sdcardstorage and already excluded directories } #------------------------------------------------------------------------------------------------------------ reload_tracker_index () { # usage reload_tracker_index "Dir1 Dir2 Dir3" printf "\n Clear tracker index database" tracker reset -ry > /dev/null printf "\n Reload tracker index database" for IndexDirectory in $@ ; do # avoid root fs index if [[ ! $( sed 's/ //g' <<< $IndexDirectory) ]]; then continue fi TrackerOutput=$(tracker index -f $IndexDirectory/* 2>&1 | sort -u ) if [[ $(grep "(Re)indexing file was successful" <<< $TrackerOutput) ]]; then printf "\n (Re)indexing successful for: $IndexDirectory" else printf "\n (Re)indexing failed for: $IndexDirectory " printf "($(echo $TrackerOutput | awk -F ": " '{print $NF}'))" fi done printf "\n" } #------------------------------------------------------------------------------------------------------------ create_symlink_to_sd_card () { # sd card home link request request_loop () { SDCardLink= read -n1 -e -p " Link sd card main directory into home directory (y/N) ? " SDCardLink if [[ "$SDCardLink" == [yY] ]]; then if [[ $(ls -l /home/nemo/sdcard 2>&1 | grep " -> /") ]] ; then printf " sd card already linked in home directory: /home/nemo/sdcard\n" else ln -s $SDcardPath /home/nemo/sdcard printf " sd card link created in home directory: /home/nemo/sdcard\n" fi elif [[ "$SDCardLink" == [nN] ]]; then printf "" else request_loop fi } request_loop printf "\n" } #------------------------------------------------------------------------------------------------------------ ############################################################################################################ ############################################# start script ############################################# ############################################################################################################ #------------------------------------------------------------------------------------------------------------ # deny root execution if [ ! "$(whoami)" = "root" ]; then printf "";else printf "\nYou are Root !\n\n";exit 1;fi #------------------------------------------------------------------------------------------------------------ case $1 in -[hv]|--help|--version ) usage;; -rd2sd ) choose_proccessing_directories "remap" create_mapping_directories move_soure_directory_content_to_mapping_directory_create_link skip_sd_card_file_indexing -rq create_symlink_to_sd_card reload_tracker_index "/home/nemo" ;; -rddir ) choose_proccessing_directories "restore" recreate_default_user_directories skip_sd_card_file_indexing -rs create_symlink_to_sd_card reload_tracker_index "/home/nemo $SDcardPath" ;; -cfgix ) printf "\n Comming soon. Check https://speefak.spdns.de/oss_lifestyle/sailfish-os-speicherpfade-auf-sd-karte-mappen for code updates \n" ;; *) usage ;; esac #------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------ exit 0 |
Android Speicher auf SD-Karte auslagern (AOSP 4.4 / Sony Xperia Series)
Der Speicherpfad des Android Systems und der installierten Apps befindet sich unter /opt/alien/, der Appspeicherpfand unter /home/nemo/android_storage. System-, sowie Appspeicher lassen sich auf die SD-Karte verschieben und in dem entsprechenden Quellpfad verlinken. Für den Systemordner wird dies aber nicht empfohlen, da Symlinks vom Linux Kernel / Dateisystem anders behandelt werden als ein nativer Pfad und es somit zu Problemen kommen kann. Ein remount vom Ziel ins Quellverzeichnis (mount –bind) ist möglich, muss aber beim Systemstart initiiert werden, was wiederum Einträge in der /etc/fstab benötigt. Die /etc/fstab wiederum wird allerdings bei einem Update von Sailfish OS überschrieben. Das kann per Script gelöst werden, das wiederum usw. – es wird immer komplizierter, ergo sollte der Androidsystempfad besser nicht geändert werden. In der Regel reicht der verfügbare Speicher für die Installation des Androidsystems und der Apps vollkommen aus.
Beim Appspeicher hingegen wird der verfügbare Speicherplatz auf der Sailfisch OS Systempartition jedoch recht schnell knapp. Auch wird der Benutzerordner /home/nemo bei Systemupdates nicht verändert. Somit sind Änderungen unter /home/nemo von Updates nicht betroffen.
Android Apps akzeptieren nicht immer Symlinks und aus diesem Grund reicht ein einfaches Verschieben und Verlinken von /home/nemo/android_storage auf die SD-Karte nicht aus. In der Datei /opt/alien/system/script/platform_envsetup.sh werden grundlegende Parameter, u.a. auch Speicherpfade der Androidumgebung, konfiguriert.
Im Folgenden wird der Appspeicher der Androidemulation von Sailfish OS auf die SD-Karte kopiert, im Quellpfad verlinkt und in der Androidkonfiguration geändert.
1 2 3 4 5 6 7 8 |
if [[ ! $(rpm -qa | /bin/grep -w sudo) ]]; then sudoCMD=devel-su ; else sudoCMD=sudo; fi $sudoCMD systemctl stop aliendalvik.service SDCardPath=$(mount -l | /bin/grep "/dev/mmcblk1p1" | cut -d " " -f3 | head -n1) $sudoCMD chown $USER.$USER $SDCardPath mv android_storage $SDCardPath/ ln -s $SDCardPath/android_storage . $sudoCMD cp /opt/alien/system/script/platform_envsetup.sh /opt/alien/system/script/platform_envsetup.sh_bck $sudoCMD sed 's|MEDIA_STORAGE=.*|MEDIA_STORAGE='$SDCardPath'/android_storage|' -i /opt/alien/system/script/platform_envsetup.sh |
Jollaphone (AOSP 4.1.2)
Der AppSpeicherpfad des Adroid Systems der AOSP 4.1.2 Version befindet sich unter /opt/alien/run/media/nemo statt wie bei AOSP 4.4 unter /home/nemo/android_storage.
1 2 3 4 5 6 7 8 9 |
if [[ ! $(rpm -qa | /bin/grep -w sudo) ]]; then sudoCMD=devel-su ; else sudoCMD=sudo; fi $sudoCMD systemctl stop aliendalvik.service SDCardPath=$(mount -l | /bin/grep "/dev/mmcblk1p1" | cut -d " " -f3 | head -n1) $sudoCMD chown $USER.$USER $SDCardPath mv /opt/alien/run/media/nemo $SDCardPath/ mv $SDCardPath/nemo $SDCardPath/android_storage ln -s $SDCardPath/android_storage . $sudoCMD cp /opt/alien/system/script/platform_envsetup.sh /opt/alien/system/script/platform_envsetup.sh_bck $sudoCMD sed 's|MEDIA_STORAGE=.*|MEDIA_STORAGE='$SDCardPath'/android_storage|' -i /opt/alien/system/script/platform_envsetup.sh<img class="alignnone size-full wp-image-5077" src="https://speefak.spdns.de/oss_lifestyle/wp-content/uploads/2019/07/blank_pixel.png" alt="" width="1" height="1" /><img class="alignnone size-full wp-image-4619" src="https://speefak.spdns.de/oss_lifestyle/wp-content/uploads/2018/11/blank_pixel.png" alt="" width="1" height="1" /> |
by Speefak | together.jolla.com | together.jolla.com | together.jolla.com | together.jolla.com
Could you make this tutorial available for newer sailfish devices like xa2 and 10 (xx)?
In the current Sailfish OS versions, it is possible to specify, on a per-app basis, where files are stored. There have also been changes in SFOS itself, so that if the memory card is not mounted, data is stored on the phone’s internal storage, and once the card is active, data is automatically stored on the card. Currently, I unfortunately do not have the time to continue working on this, especially since it is no longer as relevant as it was for the SFOS version for which the tutorial was created.
In principle, only the file paths are changed and linked in the priority, except for Android.