tazlito rev 361

tazlito: deduplicate symlinks
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Oct 27 13:37:15 2014 +0100 (2014-10-27)
parents 0687ed780754
children 69854038b08a
files tazlito
line diff
     1.1 --- a/tazlito	Tue Aug 26 11:35:08 2014 +0200
     1.2 +++ b/tazlito	Mon Oct 27 13:37:15 2014 +0100
     1.3 @@ -371,9 +371,9 @@
     1.4  # Deduplicate files (MUST be on the same filesystem).
     1.5  deduplicate()
     1.6  {
     1.7 -	find "$@" -type f -size +0c -xdev \
     1.8 +	find "$@" -type f -xdev \
     1.9  		-exec stat -c '%s-%a-%u-%g %i %h %n' {} \; | sort | \
    1.10 -	( save=0; old_attr=""; old_inode=""; old_link=""; old_file=""
    1.11 +	( save=0; hardlinks=0; old_attr=""; old_inode=""; old_link=""; old_file=""
    1.12  	   while read attr inode link file; do
    1.13  		[ -L "$file" ] && continue
    1.14  		if [ "$attr" = "$old_attr" -a "$inode" != "$old_inode" ]; then
    1.15 @@ -382,6 +382,7 @@
    1.16  				if ln "$old_file" "$file" 2> /dev/null; then
    1.17  					inode="$old_inode"
    1.18  					[ "$link" = "1" ] && 
    1.19 +					hardlinks=$(($hardlinks+1)) &&
    1.20  					save="$(($save+(${attr%%-*}+512)/1024))"
    1.21  				else
    1.22  					cp "$old_file" "$file"
    1.23 @@ -390,7 +391,29 @@
    1.24  		fi
    1.25  		old_attr="$attr" ; old_inode="$inode" ; old_file="$file"
    1.26  	   done
    1.27 -	   echo "$save Kbytes saved in duplicate files."
    1.28 +	   echo "$save Kbytes saved in $hardlinks duplicate files."
    1.29 +	)
    1.30 +	find "$@" -type l -xdev \
    1.31 +		-exec stat -c '%s-%u-%g-TARGET- %i %h %n' {} \; | sort | \
    1.32 +	( old_attr=""; hardlinks=0; while read attr inode link file; do
    1.33 +		attr="${attr/-TARGET-/-$(readlink $file)}"
    1.34 +		if [ "$attr" = "$old_attr" ]; then
    1.35 +			if [ "$inode" != "$old_inode" ]; then
    1.36 +				rm -f "$file"
    1.37 +				if ln "$old_file" "$file" 2> /dev/null; then
    1.38 +					[ "$link" = "1" ] && 
    1.39 +					hardlinks=$(($hardlinks+1))
    1.40 +				else
    1.41 +					cp -a "$old_file" "$file"
    1.42 +				fi
    1.43 +			fi
    1.44 +		else
    1.45 +			old_file="$file"
    1.46 +			old_attr="$attr"
    1.47 +			old_inode="$inode"
    1.48 +		fi
    1.49 +	   done
    1.50 +	   echo "$hardlinks duplicate symlinks."
    1.51  	)
    1.52  }
    1.53  
    1.54 @@ -408,7 +431,7 @@
    1.55  	deduplicate .
    1.56  
    1.57  	# Use lzma if installed. Display rootfs size in realtime.
    1.58 -	rm -f /tmp/rootfs
    1.59 +	rm -f /tmp/rootfs 2> /dev/null
    1.60  	pack_rootfs . $DISTRO/$(basename $1).gz &
    1.61  	sleep 2
    1.62  	echo -en "\nFilesystem size:"
    1.63 @@ -418,6 +441,7 @@
    1.64  		echo -en "\\033[18G`du -sh $DISTRO/$(basename $1).gz | awk '{print $1}'`    "
    1.65  	done
    1.66  	echo -e "\n"
    1.67 +	rm -f /tmp/rootfs
    1.68  	cd $DISTRO
    1.69  	mv $(basename $1).gz $ROOTCD/boot
    1.70  }
    1.71 @@ -1144,6 +1168,12 @@
    1.72  # Tazlito commands #
    1.73  ####################
    1.74  
    1.75 +case "$0" in
    1.76 +	*deduplicate)
    1.77 +		deduplicate "$@"
    1.78 +		exit 0 ;;
    1.79 +esac
    1.80 +
    1.81  case "$COMMAND" in
    1.82  	stats)
    1.83  		# Tazlito general statistics from the config file.
    1.84 @@ -2291,18 +2321,21 @@
    1.85  		# Create list of files including default user files since it is defined in /etc/passwd
    1.86  		# and some new users might have been added.
    1.87  		cd /
    1.88 -		find bin etc init sbin var dev lib root usr home >/tmp/list
    1.89 +		for dir in bin etc init sbin var dev lib root usr home opt
    1.90 +		do
    1.91 +			[ -d $dir ] && find $dir
    1.92 +		done >/tmp/list
    1.93  
    1.94  		for dir in proc sys tmp mnt media media/cdrom media/flash \
    1.95  			media/usbdisk run run/udev
    1.96  		do
    1.97 -			echo $dir >>/tmp/list
    1.98 -		done
    1.99 +			[ -d $dir ] && echo $dir
   1.100 +		done >>/tmp/list
   1.101  		sed -i '\/var\/run\/.*pid$/d' /tmp/list
   1.102  
   1.103  		# Generate initramfs with specified compression and display rootfs
   1.104  		# size in realtime.
   1.105 -		rm -f /tmp/rootfs
   1.106 +		rm -f /tmp/rootfs 2> /dev/null
   1.107  		write_initramfs &
   1.108  		sleep 2
   1.109  		cd - > /dev/null
   1.110 @@ -2313,6 +2346,7 @@
   1.111  			echo -en "\\033[18G`du -sh /rootfs.gz | awk '{print $1}'`    "
   1.112  		done
   1.113  		echo -e "\n"
   1.114 +		rm -f /tmp/rootfs
   1.115  
   1.116  		# Move freshly generated rootfs to the cdrom.
   1.117  		mkdir -p $ROOTCD/boot