Использование install.packages с пользовательским временным каталогом

Я хотел бы установить пакет с профилем безопасности, который не имеет доступа к /tmp , но имеет свой собственный временный каталог, например /tmp/jeroen. Однако, даже если я пытаюсь передать переменную среды TMPDIR, это все равно не удается, потому что она пытается использовать /tmp. Ниже приведен игрушечный пример с использованием RAppArmor и unixtools (см. здесь тестовый профиль)

> library(RAppArmor)
> library(unixtools)

> dir.create("/tmp/jeroen")
> set.tempdir("/tmp/jeroen")
> setwd(tempdir());

> aa_change_profile("r-test")
Switching profiles...

> print(tempdir());
[1] "/tmp/jeroen"

> install.packages("plyr", lib="/tmp/jeroen", configure.vars="TMPDIR=/tmp/jeroen")
trying URL 'http://cran.rstudio.com/src/contrib/plyr_1.8.tar.gz'
Content type 'application/x-gzip' length 384462 bytes (375 Kb)
opened URL
==================================================
downloaded 375 Kb

Fatal error: cannot create 'R_TempDir'

The downloaded source packages are in
    ‘/tmp/jeroen/downloaded_packages’

При просмотре файла kern.log (который регистрирует сообщения безопасности) выясняется, что проблема в том, что R CMD INSTALL все еще пытался использовать /tmp, которому было отказано:

Jul 24 19:41:34 Jeroen-Antec kernel: [16270.696805] type=1400 audit(1374687694.097:599):
apparmor="DENIED" operation="mkdir" parent=5798 profile="r-test" name="/tmp/RtmpcUOJuQ/"
pid=5802 comm="R" requested_mask="c" denied_mask="c" fsuid=1000 ouid=1000

Могу ли я каким-либо образом указать R CMD INSTALL использовать вместо него /tmp/jeroen?


person Jeroen    schedule 24.07.2013    source источник
comment
Если вы собираетесь установить переменную среды TMPDIR, я считаю, что вам придется сделать это при запуске R (или в файле .Renviron). например вам нужно будет запустить R вот так TMPDIR="/tmp/jeroen" R   -  person GSee    schedule 24.07.2013
comment
FWIW, install.packages делает 2 вызова tempdir(); это может помочь проверить, когда он вызывается   -  person GSee    schedule 24.07.2013
comment
@GSee Я надеялся, что опция configure-vars позаботится об этом. У процесса нет разрешения на редактирование .Renviron   -  person Jeroen    schedule 24.07.2013
comment
Хотя я не знаю об этом конкретном случае, в прошлом мне приходилось делать все возможное, чтобы обойти это (перезапускать R из скрипта). Вот соответствующий сообщение R-devel   -  person GSee    schedule 24.07.2013
comment
Вы пробовали аргумент destdir?   -  person Karl Forner    schedule 25.07.2013
comment
@Karl Загрузка пакетов работает нормально, destdir будет использовать tempdir(), о чем позаботились. Проблема возникает позже в процессе, когда install.packages обращается к R CMD INSTALL.   -  person Jeroen    schedule 25.07.2013
comment
@Jeroen установите (а затем сбросьте) в вашем скрипте с помощью Sys.setenv(). Переменные среды наследуются дочерними процессами.   -  person hadley    schedule 25.07.2013
comment
@Hadley OMG, это сработало! Спасибо!!   -  person Jeroen    schedule 25.07.2013


Ответы (2)


Правильный ответ дал @hadley в комментариях: чтобы убедиться, что install.packages использует пользовательский временный каталог, нужно сделать

Sys.setenv(TMPDIR="/tmp/jeroen")

в дополнение к:

configure.vars="TMPDIR=/tmp/jeroen"

Таким образом, как извлечение, так и установка пакета избегают системного или пользовательского временного каталога по умолчанию.

person Jeroen    schedule 26.07.2013

В документации в help(tempdir) довольно четко указано, что используются TMP, TMPDIR, ...:

По умолчанию «tmpdir» будет каталогом, заданным «tempdir()». Это будет подкаталог временного каталога для каждого сеанса, который определяется следующим правилом при запуске сеанса R. Переменные среды «TMPDIR», «TMP» и «TEMP» проверяются по очереди, и используется первая найденная, указывающая на доступный для записи каталог: если ни один из них не удается, используется «/tmp».

Поэтому, если установка одного не помогает, возможно, вы хотите установить несколько и убедиться, что разрешения для вашего «каталога замены» достаточно разрешительны и т. Д.

person Dirk Eddelbuettel    schedule 24.07.2013
comment
Но где/как их установить? configure-vars не помогает, потому что используется только при вызове ./configure. Проблема появляется раньше при извлечении файла package.tar.gz. - person Jeroen; 25.07.2013
comment
Для всей системы (/etc/bash.bashrc или /etc/profile) или для всего приложения ($RHOME/etc/Renviron), то же самое для каждого пользователя. Windoze имеет аналогичные общесистемные настройки. Вы также можете попробовать TEMPDIR=/foo TMP=/foo R CMD INSTALL ... и т.д. pp. Как вы знаете, этому посвящено целое руководство. - person Dirk Eddelbuettel; 25.07.2013