I'll begin by describing my scenario. I have two similar computers in different places. One computer(say bigiron) compiles packages and builds binary packages. I mostly carry the packages via vfat formatted USB disk to the other machine (say laptop). I install them by setting PKGDIR to the usb disk. When I am working on the laptop an I want to install a program on both machines, I emerge it on bigiron through a remote connection, and install the binary package over http. If PKGDIR is set to a vfat file system (or any other which does not support symlinks) portage fails with the exception pasted below. It is trying to copy the downloaded tbz2 to PKGDIR and then trying to symlink it All/file.tbz2 from category/file.tbz2. The symlinking fails because PKGDIR is on vfat. Catching and Ignoring OSError exception would be a reasonable solution, as absence of that symlink is nonfatal. 2009-05-02 00:48:51 (104 KB/s) - `/media/disk/irmik/packages/All/portaudio-19_pre20071207.tbz2' kaydedildi [147528/147528] Cannot chown a lockfile. This could cause inconvenience later. Traceback (most recent call last): File "/usr/bin/emerge", line 40, in <module> retval = _emerge.emerge_main() File "//usr/lib/portage/pym/_emerge/__init__.py", line 14670, in emerge_main myopts, myaction, myfiles, spinner) File "//usr/lib/portage/pym/_emerge/__init__.py", line 13766, in action_build retval = mergetask.merge() File "//usr/lib/portage/pym/_emerge/__init__.py", line 10246, in merge rval = self._merge() File "//usr/lib/portage/pym/_emerge/__init__.py", line 10488, in _merge self._main_loop() File "//usr/lib/portage/pym/_emerge/__init__.py", line 10616, in _main_loop self._poll_loop() File "//usr/lib/portage/pym/_emerge/__init__.py", line 9177, in _poll_loop handler(f, event) File "//usr/lib/portage/pym/_emerge/__init__.py", line 2253, in _output_handler self._unregister_if_appropriate(event) File "//usr/lib/portage/pym/_emerge/__init__.py", line 1768, in _unregister_if_appropriate self.wait() File "//usr/lib/portage/pym/_emerge/__init__.py", line 1673, in wait self._wait_hook() File "//usr/lib/portage/pym/_emerge/__init__.py", line 1746, in _wait_hook self._exit_listener_stack.pop()(self) File "//usr/lib/portage/pym/_emerge/__init__.py", line 3280, in _fetcher_exit self._start_task(verifier, self._verifier_exit) File "//usr/lib/portage/pym/_emerge/__init__.py", line 1971, in _start_task task.start() File "//usr/lib/portage/pym/_emerge/__init__.py", line 1654, in start self._start() File "//usr/lib/portage/pym/_emerge/__init__.py", line 3633, in _start self.wait() File "//usr/lib/portage/pym/_emerge/__init__.py", line 1673, in wait self._wait_hook() File "//usr/lib/portage/pym/_emerge/__init__.py", line 1746, in _wait_hook self._exit_listener_stack.pop()(self) File "//usr/lib/portage/pym/_emerge/__init__.py", line 3298, in _verifier_exit self._bintree.inject(pkg.cpv, filename=pkg_path) File "//usr/lib/portage/pym/portage/dbapi/bintree.py", line 839, in inject self._create_symlink(cpv) File "//usr/lib/portage/pym/portage/dbapi/bintree.py", line 298, in _create_symlink os.symlink(os.path.join("..", "All", mypkg + ".tbz2"), full_path) OSError: [Errno 1] Operation not permitted Reproducible: Always Steps to Reproduce: Portage 2.1.6.7 (default/linux/x86/2008.0/desktop, gcc-4.3.2, glibc-2.8_p20080602-r1, 2.6.25-gentoo-r4 i686) ================================================================= System uname: Linux-2.6.25-gentoo-r4-i686-Intel-R-_Pentium-R-_M_processor_1.50GHz-with-glibc2.0 Timestamp of tree: Mon, 20 Apr 2009 01:15:02 +0000 ccache version 2.4 [disabled] app-shells/bash: 3.2_p39 dev-java/java-config: 2.1.7 dev-lang/python: 2.5.4-r2 dev-python/pycrypto: 2.0.1-r8 dev-util/ccache: 2.4-r7 dev-util/cmake: 2.6.2-r1 sys-apps/baselayout: 1.12.11.1 sys-apps/sandbox: 1.6-r2 sys-devel/autoconf: 2.13, 2.63 sys-devel/automake: 1.4_p6, 1.5, 1.7.9-r1, 1.8.5-r3, 1.9.6-r2, 1.10.2 sys-devel/binutils: 2.18-r3 sys-devel/gcc-config: 1.4.0-r4 sys-devel/libtool: 1.5.26 virtual/os-headers: 2.6.27-r2 ACCEPT_KEYWORDS="x86"
Created attachment 190098 [details, diff] migrate packages out of the All/ directory If you remove $PKGDIR/All/ then it won't even try to create the symlinks. The attached script will move the packages out of the $PKGDIR/All/ and remove it for you.
Note to self: Integrate this script into emaint --fix binhost, and make it remove symlinks inside All/ if necessary (portage doesn't create them but some other tools might have).