Bizarre behaviour of Linux binary under 7.1

Christopher Key cjk32 at cam.ac.uk
Sat Mar 14 07:58:28 PDT 2009


On Mar 14 2009, Michael Powell wrote:

>Christopher Key wrote:
>
>> Hello,
>> 
>> I recently upgraded from 6.3 (i386) to 7.1p3 (amd64) with a view to 
>> experimenting with zfs. Mostly, everything went smoothly, but I am 
>> getting some very odd behaviour from a linux utility.
>> 
>> The program is very simple, it has two executables, A and B. A is 
>> invoked by the user, and based upon the options given builds a list of 
>> files to process. B is then repeatedly invoked by A with the name of a 
>> file to process, and the name of a non existent file to write the 
>> results to. When B returns, A reads the results from the output file, 
>> deletes it and moves on.
>> 
>> This all worked fine on 6.3, but cannot be made to work as intended on
>> 7.1.
>> 
>> After appropriate use of truss invoking B directly, I found that the
>> source of problems was B being unable to create its output file /tmp/...:
>> 
>> linux_open("/tmp/1234.tmp",0x42,0600)            ERR#13 'Permission
>> denied'
>> 
>> which is odd.  /tmp has suitable permissions:
>> 
>> #ls -al /tmp
>> drwxrwxrwt  12 root   wheel      720 14 Mar 11:25 .
>> drwxr-xr-x  21 root   wheel      512 13 Mar 10:32 ..
>> ...
>> 
>> and I can quite happily create a identically named file in /tmp myself:
>> #echo test >/tmp/1234.tmp
>> #cat /tmp/1234.tmp
>> test
>> #rm /tmp/1234.tmp
>> 
>> 
>> 
>> Bizarrely, however, if I instead invoke B and request its output go to
>> /var/tmp/... instead of /tmp/..., it completes successfully.
>> 
>> As a temporary workaround, I therefore tried to create a wrapper around 
>> B:
>> 
>> #mv /usr/local/bin/B /usr/local/bin/B2
>> 
>> #cat /usr/local/bin/B #!/bin/sh B2 "$1" "$2" "/var$3" mv "/var$3" "$3"
>> 
>> 
>> the idea being that the file would be written to /var/tmp/... by (as now)
>> B2, then moved across by my script to where it was expected.
>> 
>> When invoked directly, this works quite happily. However, even more
>> bizarrely, when I now call A, allowing it to invoke (my) B, I get exactly
>> the same behaviour from my wrapper script as (the original) B was showing
>> previously, specifically, it is unable to create the file /tmp/....
>> 
>> As a final workaround, I inserted instead added a sleep to my script in
>> place of mv ..., and instead had an external process detect the presence
>> of /var/tmp/... and move it across to /tmp. This, unsurprisingly, worked.
>> 
>> Interestingly, if I rewrote my wrapper script to,
>> 
>> B2 "$1" "$2" "/var$3"
>> sleep 3
>> cat "/var$3" > "$3" && rm "/var$3"
>> 
>> and had the external process simply touch /tmp/..., my wrapper script
>> worked, suggesting that the permissions problem is to do with creating a
>> new file, not writing to an existing one.
>> 
>> 
>> A few final points:
>> I've tried both an md based /tmp and tmpfs with the same result.
>> Everything worked perfectly on 6.3 i386.
>> If I run A as root, everything works without error.
>> 
>> My guess is that there's something a bit strange in linux_compat, either
>> as a result of going to amd64 or to 7.1, and that affects both linux
>> executables, and any processes that they create, but I'm not really sure
>> beyond that. Can anyone shed any light on what might be going on?
>> 
>> 
>> Kind Regards,
>> 
>> Christopher Key
>> 
>
>Whenever you do an upgrade between major versions there is ABI breakage. 
>This necessitates either the rebuild of all installed ports or 
>deleting/reinstalling. 
>
> Since my needs are relatively simple from a server perspective when I 
> change from one major version to another I start over from scratch and 
> then pull in configs from backups. When upgrading within a major version 
> this is not required, e.g., from 7.0 to 7.1 or 6.3 to 6.4. It's only a 
> consideration when it is a jump like 6.x to 7.x.
>
> The other approach is to use portupgrade to force all ports to be rebuilt 
> linked against 7.x libs. One thing to watch out for is if you're not 
> careful it is possible for some ports in a dependency chain to not be 
> rebuilt and still linked against 6.x and some do get rebuilt linked 
> against the new 7.x libs. This can give you flaky behavior. Byt forcing a 
> massive upgrade/rebuild of everything causes all ports will get linked 
> against 7.x libs during the rebuild.
>
>Don't know if this is the source of your problem, but it may be something 
>you can easily rule out.  
>

Thanks Mike,

This was a fresh install to an effectively clean disk. I then csupped and 
rebuilt with a custom kernel, before installing ports. The application in 
question isn't in the ports tree, and distributed in binary form, 
containing only the two executables. If relevant, I'm using linux_base-fc4.

Having written the above, it occurs to me that I should probably try a 
generic kernel too. I'll give that a go and report back.

Chris


More information about the freebsd-questions mailing list