【问题标题】:Using install.packages with custom temp dir使用带有自定义临时目录的 install.packages
【发布时间】:2013-07-24 08:40:01
【问题描述】:

我想安装一个安全配置文件的包,该配置文件无权访问/tmp,但有自己的临时目录,例如/tmp/jeroen。然而,即使我尝试传递TMPDIR 环境变量,它仍然失败,因为它尝试使用/tmp。下面是一个使用RAppArmorunixtools 的玩具示例(有关测试配置文件,请参见here

> 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

【问题讨论】:

  • 如果您要设置 TMPDIR 环境变量,我相信您必须在启动 R 时(或在 .Renviron 文件中)进行设置。例如你需要像这样启动 R TMPDIR="/tmp/jeroen" R
  • FWIW,install.packagestempdir() 进行了 2 次调用;它可能有助于检查它何时被调用
  • @GSee 我希望configure-vars 选项能解决这个问题。该进程无权编辑.Renviron
  • 虽然我不知道这种特殊情况,但过去我不得不竭尽全力解决这个问题(从脚本中重新启动 R)。这是一个相关的R-devel post
  • @Jeroen 使用Sys.setenv() 在您的脚本中设置(然后重置)。环境变量由子进程继承。

标签: r cran devtools


【解决方案1】:

@hadley 在 cmets 中给出了正确答案:为了确保 install.packages 使用自定义临时目录,需要这样做

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

除了:

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

这样解压和安装包都避免了系统或用户默认的临时目录。

【讨论】:

    【解决方案2】:

    help(tempdir) 中的文档非常清楚地表明使用了 TMPTMPDIR、...:

    默认情况下,“tmpdir”将是“tempdir()”给出的目录。 这将是每个会话临时目录的子目录 在 R 会话启动时通过以下规则找到。这 已签入环境变量“TMPDIR”、“TMP”和“TEMP” 转而找到的第一个指向可写目录的是 used:如果没有成功,则使用'/tmp'。

    所以如果单独设置一个没有帮助,也许你想设置几个,并确保你的“替换目录”的权限足够允许等等。

    【讨论】:

    • 但是我在哪里/如何设置这些? configure-vars 没有帮助,因为它仅在调用 ./configure 时使用。提取package.tar.gz时,问题出现得更早。
    • 系统范围(/etc/bash.bashrc/etc/profile)或应用程序范围($RHOME/etc/Renviron),每个用户同上。 Windoze 具有类似的系统范围设置。您也可以尝试TEMPDIR=/foo TMP=/foo R CMD INSTALL ... 等 pp。如您所知,有一整本手册专门用于此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2020-09-20
    • 2021-01-05
    相关资源
    最近更新 更多