2017年11月19日 星期日

解決「用 sdkmanager 安裝模組時,出現 "No space left on device." 訊息」的問題

最近 Android 推出新版 O,想說模擬器也安裝看看,結果失敗
[root@Core-i7 ~]# /opt/android-sdk/tools/bin/sdkmanager system-images\;android-27\;google_apis_playstore\;x86
Warning: An error occurred while preparing SDK package Google Play Intel x86 Atom System Image: No space left on device.
[root@Core-i7 ~]# ll==                  ] 55% Unzipping... x86/vendor.img
出現『Warning: An error occurred while preparing SDK package Google Play Intel x86 Atom System Image: No space left on device.』這個訊息,字面的意思是『空間不足』。
  找一下,看它將下載的檔案放在哪裏?應該是『下載空間不足』,不然就是『解壓縮時空間不足』。

查詢各「磁碟分割」的剩餘空間

用 df 查詢各個「磁碟分割 (partition)」或「卷冊 (volume)」的剩餘空間,是否有已經用完的。
[root@Core-i7 ~]# df
總計 12
檔案系統1K-區段已用可用已用%掛載點
dvetmpfs4027780040277800%/dev
tmpfs40398807008439697962%/dev/shm
tmpfs4039880166040382201%/run
tmpfs4039880040277800%/sys/fs/cgroup
/dev/sda230304196151708241357095653%/
tmpfs4039880403984832100%/tmp
/dev/sda54408640723493777926906856884%/home
/dev/sda199932017428475622419%/boot
tmpfs807976368079401%/run/user/1005
tmpfs807976408079361%/run/user/1000
可以發現是 /tmp 這個目錄的使用率是 100%,在 Linux 的檔案系統,這個目錄實際上是一個卷冊。

查詢最後更新之「目錄」或「檔案」

再往下查,
[root@Core-i7 ~]# ll /tmp/ -a
總計 12
drwxrwxrwt.15rootroot34011月1914:41.
dr-xr-xr-x.20rootroot409611月1913:40..
drwx------.2SiBusers8011月1914:23.com.google.Chrome.o8z7X4
drwx------.2Testusers6011月1914:17.esd-1000
drwx------.2SiBusers6011月1914:17.esd-1005
drwxrwxrwt.2rootroot4011月1914:11.font-unix
drwxr-xr-x.2rootroot4011月1914:36hsperfdata_root
drwxrwxrwt.2rootroot8011月1914:17.ICE-unix
drwxr-xr-x.3rootroot8011月1914:41PackageOperation01
drwx------.3rootroot6011月1914:11systemd-private-1665e10b1cb . . .
drwx------.3rootroot6011月1914:11systemd-private-1665e10b664 . . .
drwx------.3rootroot6011月1914:17systemd-private-1665e10b664 . . .
drwxrwxrwt.2rootroot4011月1914:11.Test-unix
drwxrwxrwt.2rootroot8011月1914:17.X11-unix
-r--r--r--.1SiBusers1111月1914:16.X2605-lock
-r--r--r--.1Testusers1111月1914:17.X2608-lock
drwxrwxrwt.2rootroot4011月1914:11.XIM-unix
可以發現『PackageOperation01』這個目錄的更新時間最新(:不一定是相同的名稱)。再向下一層查詢,
[root@Core-i7 ~]# ll /tmp/PackageOperation01/
總計 12
drwxr-xr-t.3rootroot6011月1914:41unzip
-rw-r--r--.1rootroot77259119411月1914:41x86-27_r01.zip
看到剛才下安裝命令後,所下載的安裝檔案『 x86-27_r01.zip』,上面的『unzip』應該存放解壓縮後檔案。

網路解決方法(一)

查一下網路是否已有解答,有個解法試一下,結果沒用,
[root@Core-i7 ~]# _JAVA_OPTIONS=-Djava.io.tmpdir=/var/tmp /opt/android-sdk/tools/bin/sdkmanager system-images\;android-27\;google_apis_playstore\;x86
Picked up _JAVA_OPTIONS: -Djava.io.tmpdir=/var/tmp
Warning: An error occurred while preparing SDK package Google Play Intel x86 Atom System Image: No space left on device.
[root@Core-i7 ~]# ll==                  ] 55% Unzipping... x86/vendor.img       
這個解法是以 sdkmanager 是 Java 程式為前提,有可能不是,也可能是其它原因,再找其它方法。

網路解決方法(二)

在上面的方法不成功後,就想到是否可以用『鏈結』方式,將 /tmp 重導到其它「磁碟分割」。想說上網求證一下,是否可行?想不到也有網友情況相同,也是用『鏈結』方式解決。
[root@Core-i7 ~]# mv /tmp/PackageOperation01 /var
[root@Core-i7 ~]# cd /tmp/
[root@Core-i7 tmp]# ln -s /var/PackageOperation01/ PackageOperation01
[root@Core-i7 tmp]# /opt/android-sdk/tools/bin/sdkmanager system-images\;android-27\;google_apis_playstore\;x86
Picked up _JAVA_OPTIONS: -Djava.io.tmpdir=/var/tmp
Warning: File /root/.android/repositories.cfg could not be loaded.
[===================================] 100% Unzipping... x86/vendor.img
[root@Core-i7 tmp]# rm /var/PackageOperation01 -rf
上面的步驟共下了 5 個命令,就一一說明如下:
  1. 將「暫存檔」所在目錄搬移到 /var 之下。(在 / 目錄下,也可搬到其它磁碟分割)
  2. 切換「工作目錄」至 /tmp。
  3. 建立『縺結』指向剛才搬過去的地方。
  4. 重新執行 sdkmanager 安裝命令。(成功執行結束)
  5. 刪除剛才搬過去的 PackageOperation01 目錄。
安裝成功。

已測試版本:

  • Fedora: 26

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)