No drs305, it is possible to come back from this messy situation without reinstalling your system. You only need to install a new system elsewhere and restore the permissions from there.
Here is how I did.
I ran again the same kind on issue (some bug in a script I was writing) and solved it, but you may need to ask some expert's help, if you're not one. In any case, be very cautuous!
First, my situation was easier to solve because I had a dual boot system (ubuntu and my former fedora install). Anyway, running the OS from a CD/DVD, or an USB key should do the same thing.
MPOINT=/mount/ubuntu
First I mounted my file systems like this (don't forget to create the mount points): mount /dev/ubuntu/root $MPOINT mount /dev/ubuntu/home $MPOINT/home
Then I ran the following command (my issue was only in a few - critical - directories) to copy the permissions on from the running system to the messy one (in fact, in my case, I installed an ubuntu system in Virtual Box under fedora and got the permissions there):
Code:
find /etc /usr /bin -exec stat --format "chmod -h %a ${MPOINT}%n" {} \; > /tmp/restoreperms.sh
And then I ran the restoreperms.sh script.
I was able again to boot on ubuntu.
The content of restoreperms.sh will be something like:
Code:
(...)
chmod -h 755 /mount/ubuntu//etc/ppp
chmod -h 755 /mount/ubuntu//etc/ppp/ipv6-up
chmod -h 2750 /mount/ubuntu//etc/ppp/peers
chmod -h 640 /mount/ubuntu//etc/ppp/peers/provider
chmod -h 755 /mount/ubuntu//etc/ppp/ipv6-up.d
chmod -h 777 /mount/ubuntu//etc/ppp/resolv.conf
(...)
I didn't test it but it must work for owners and owner groups too. Something like:
Code:
find /etc /usr /bin -exec stat --format '[ ! -L {} ] && chown %U:%G ${MPOINT}%n' {} \; > /tmp/restoreperms.sh
Result:
Code:
(...)
[ ! -L /mount/ubuntu//etc/obex-data-server/imaging_capabilities.xml ] && chown root:root /mount/ubuntu//etc/obex-data-server/imaging_capabilities.xml
[ ! -L /mount/ubuntu//etc/obex-data-server/capability.xml ] && chown root:root /mount/ubuntu//etc/obex-data-server/capability.xml
[ ! -L /mount/ubuntu//etc/ppp ] && chown root:dip /mount/ubuntu//etc/ppp
[ ! -L /mount/ubuntu//etc/ppp/ipv6-up ] && chown root:root /mount/ubuntu//etc/ppp/ipv6-up
[ ! -L /mount/ubuntu//etc/ppp/peers ] && chown root:dip /mount/ubuntu//etc/ppp/peers
[ ! -L /mount/ubuntu//etc/ppp/peers/provider ] && chown root:dip /mount/ubuntu//etc/ppp/peers/provider
[ ! -L /mount/ubuntu//etc/ppp/ipv6-up.d ] && chown root:root /mount/ubuntu//etc/ppp/ipv6-up.d
[ ! -L /mount/ubuntu//etc/ppp/resolv.conf ] && chown root:root /mount/ubuntu//etc/ppp/resolv.conf
(...)
Of course, you have to take care here, that the UID and GID are the same on both systems, but for the system related users and groups, this shouldn't be an issue.
Rk:
An important thing for this is to keep an install disk synchronized with the version you are using, or at least work with the current ubuntu version (may work even with diffenrent version but better to keep all the chances on your side).
Now, I have this commands in a cronjob, running every day (could be weeks) in order to keep that information. It will make the solution easier next time but, of course, as I have this now, it will never happen again. Something like this:
Code:
0 12 * * * /usr/bin/find / -exec /usr/bin/stat --format="[ ! -L {} ] && /bin/chmod %a %n" {} \; -exec /usr/bin/stat --format="/bin/chown -h %U:%G %n" {} \; |/bin/bzip2 -c > /tmp/restore_fileperms.$(/bin/date +%w).sh.bz2
Bookmarks