Предупреждающее сообщение при создании пакета R: недопустимое значение uid заменено на значение для пользователя 'nobody'

Я создавал R-пакет с использованием R CMD build ABC и получил это предупреждающее сообщение:

* building ‘milonga_1.0.tar.gz
Warning: invalid uid value replaced by that for user 'nobody'

Я понятия не имею, что это значит. Будет ли у кого-нибудь краткое объяснение?

Ответ 1

Я получаю это все время. tl; dr, вы можете игнорировать его, это связано с тем, что файлы tar не могут переносить идентификаторы пользователей более 32767, но идентификаторы пользователей в некоторых системах больше этого.

Поиск кода в зеркале Winston Chang Github исходного дерева R находит этот код в src/library/utils/R/tar.R:

 uid <- info$uid
 ## uids are supposed to be less than 'nobody' (32767)
 ## but it seems there are broken ones around: PR#15436
 if(!is.null(uid) && !is.na(uid)) {
      if(uid < 0L || uid > 32767L) {invalid_uid <- TRUE; uid <- 32767L}
      header[109:115] <- charToRaw(sprintf("%07o", uid))
 }

(здесь ссылка на указанный отчет об ошибке и другое обсуждение в списке проблем devtools).

Глядя на /etc/passwd на мою систему, я вижу, что у меня есть userid 56347.

bolker: x: 56347: 1001: Ben Bolker ,,: /home/bolker: /bin/bash

Википедия говорит

POSIX требует, чтобы UID был целым типом. Большинство Unix-подобных операционных систем представляют UID как целое число без знака. Размер значений UID зависит от разных систем; некоторые ОС UNIX [, которые?] использовали 15-битные значения, позволяющие использовать значения до 32767, в то время как другие, такие как Linux, поддерживают 16-разрядные UID, что делает возможным 65536 уникальных идентификаторов. Большинство современных Unix-подобных систем переключились на 32-битные UID, что позволило идентифицировать 4 294 967 296 (232) уникальных идентификаторов.

а также

Для совместимости между 16-битными и 32-разрядными UID многие дистрибутивы Linux теперь устанавливают 2 × 16-2 = 65,534; ядро Linux по умолчанию возвращает это значение, когда 32-разрядный UID не вписывается в возвращаемое значение 16-разрядных системных вызовов. [11]

Брайан Рипли говорит

Tarball может хранить только uids до "nobody" (обычно 32767), и, конечно, более крупные из них не могут быть распакованы портативно. Предупреждений не было раньше, но созданный tarball может вызвать проблемы при распаковке с другими инструментами.

Я не могу найти гораздо больше документации по этому поводу (кроме того, что Wikipedia говорит, что есть Unix-системы с 15-битными uids там). На странице GNU tar появится uid как тип символа длиной-8...