4

I'm trying to install a Node.js module in a folder, for example, /data/data/com.termux/files/home/storage/shared/documents/projects/code/js/test-npm, from Termux on rooted Android 6 running npm install. Installation starts, but never succeeds, throwing errors and warnings like npm ERR! cb() never called! and WARN tar EPERM: operation not permitted, futime.

Which permissions should I grant to npm and how?

Update 1: tried running npm install in /storage/emulated/0/Documents/projects/code/js/test-npm, got the same errors. Termux has Storage access permission in Android installed apps manager.

1

1 Answer 1

5

WARN tar EPERM: operation not permitted, futime indicates that futime syscall (used to change file last access and modification times) fails with error: EPERM. From utime manpage 1:

EPERM ... the caller's effective UID does not match the owner of the file ...

That seems to be the reason of failure. You are using path: /data/data/com.termux/files/home/storage/shared/ which is actually /sdcard/ 2 (symlink to /storage/emulated/0/). It's not an actual filesystem but an emulated 3 view of underlying filesystem (ext4 or f2fs). It has fixed permissions and doesn't support many features of Linux filesystems including symlinks and ioctls like FS_IOC_FIEMAP 4.

Due to fixed permissions all directories and files in /sdcard/ are always owned by user root (UID 0). So while trying to change file's timestamp, Operation not permitted is returned. touch command however uses utimensat 5 which has different permissions requirements.

So to avoid this problem, you should not use emulated filesystem. Termux $HOME directory is on ext4 or f2fs, so it's a good place to save files. Use e.g. /data/data/com.termux/files/home/npm-test directory.

From comments:

But is it possible to somehow create a link inside $HOME to another location, which will grant all the rights that Termux has for $HOME for all the subfolders of this distant location?

No it's not possible on non-rooted phone. Apps can write only to their private directories in internal storage (which is /data/data/com.termux for Termux) and in shared storage (/sdcard/Android/data/com.termux). Apps with Storage permission granted can read and write to whole /sdcard/. There is no other place on device where apps can save files 6. With SELinux disabled or permissive, it's possible to write to a sub-directory created (with adb shell) in /data/local/tmp, but it's not intended use of this directory.


LINKS:

1 utime manpage
2 How do I access $HOME/storage outside of Termux (with a file explorer)?
3 What is /storage/emulated/0/?
4 How can I make a symlink inside /storage/emulated/0?
5 How to change the modified date of a file without root?
6 Where Android apps store data?

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .