Solaris

如何創建可以通過 solaris tar 提取的 gnu tarball

  • June 27, 2018

我正在維護一個舊的 cygwin(使用 GNU tar v1.21)系統和一個舊的 Solaris 9 系統。Solaris 9 系統的配置是固定的,不能升級(即我不能為Solaris 安裝gnu tar)。

我正在嘗試在 cygwin 系統上創建一個可以在 Solaris 9 系統上提取的 tarball,但不幸的是目錄結構(也是固定的,無法重命名)加上文件名超過 100 個字元,我遇到了Great Tar Wars上個千年的。Solaris 系統上有大量(保守的)使用者群,因此首選使用 Solaris tar 的解決方案。

這是我遇到的錯誤。

在 cygwin 上創建 tar:

$ tar -cf dir.tar dir

或者

$ tar -c --posix -f dir.tar dir

在 Solaris 上提供以下內容:

$ tar -xif dir.tar
tar: directory checksum errors

並且 dir 中的文件名被截斷。(即忽略校驗和錯誤無濟於事)

如何使用可以由 Solaris tar 提取的 GNU tar 創建具有長路徑名的 tarball?

編輯#2:無法使用 Schily Tar(星號)

Joerg Schilling 似乎能夠模擬 Solaris 7/8/9 tar 格式,並提供了使用starsuntar創建 Solaris tarball 的選項。

不幸star的是,在 cygwin 上不可用。:(

編輯#1:提取時使用 –format=posix 會出錯

在 Solaris 9 上使用 pax 提取 –format=posix gnu tarball 時出錯

在cygwin上:

$ ls example/this_is_a_path_name_greater_than_one_hundred_characters/when_combined_with_this_file_name_which_is_also_rather_long.txt | wc -m
128
$ tar -c --format=posix -f example.tar example

在 Solaris 上:

$ pax -r -f example.tar
pax: ./PaxHeaders.4440/example : Unknown filetype
pax: example/PaxHeaders.4440/this_is_a_path_name_greater_than_one_hundred_characters : Unknown filetype
pax: example/this_is_a_path_name_greater_than_one_hundred_characters/PaxHeaders.4440/when_combined_with_t : Unknown filetype

使用 Solaris tar 解壓時會出現類似錯誤。

Solaris tar 和 GNU tar 對 posix 有不同的解釋,但都支持 ustar,而後者又支持 long(ish) pathnames

在 cygwin 上使用 GNU tar:

$ tar -c --format=ustar -f dir.tar dir

這將創建一個 tarball,它可以在 Solaris 9 上順利解壓縮而沒有錯誤。也許不是通用解決方案,而是適合受限解決方案空間的解決方案。看來80年代畢竟有用!

GNU tar 格式建議tar -c --format=posix或者tar -c --format=pax是創建包含超過 255 個字元的路徑名的可移植 tar 文件的唯一方法。

Solaris tar 手冊頁沒有提到支持該格式,但Solaris pax 手冊頁有。

因此,首先,我會嘗試在 Cygwin(或 Linux)系統tar -c --format=posix -f dir.tar dir上使用.pax -r -x pax -f dir.tar``pax -r -f dir.tar

或者,如果您cpio在兩個系統上都安裝了,那麼該格式似乎在crc兩個系統上都支持 1,023 個字元路徑。這看起來像是find -L dir | cpio -o -H crc > dir.cpio創建和cpio -i -d < dir.cpio提取它。

最後,您可以嘗試添加-i標誌以在 Solaris 上提取時忽略目錄校驗和錯誤,例如tar -x -i -f dir.tar. 校驗和問題表明,如果 tar 存檔中的任何文件名不是 ASCII,則可能需要這樣做。

其他閱讀:

引用自:https://unix.stackexchange.com/questions/108156