Project

General

Profile

Download (3.67 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/bin/sh
2
############################################
3
#
4
# Change fstab to use ufsid and geom labels to avoid relying on device numbers directly.
5
#
6
############################################
7

    
8
# : cat /etc/fstab
9
# # Device                Mountpoint      FStype  Options         Dump    Pass#
10
# /dev/ad0s1a             /               ufs     rw              1       1
11
# /dev/ad0s1b             none            swap    sw              0       0
12

    
13
string_length() {
14
	unset LEN
15
	LEN=`echo -n ${1} | /usr/bin/wc -m | awk '{print $1}'`
16
}
17

    
18
get_ufsid() {
19
	# $1 = device
20
	# : /sbin/dumpfs /dev/ad0s1a | /usr/bin/head -n 2 | /usr/bin/tail -n 1 | /usr/bin/cut -f2 -d'[' | /usr/bin/cut -f1 -d ']' | /usr/bin/sed -e 's/[[:blank:]]//g'
21
	# 51928c99a471c440
22

    
23
	unset UFSID
24

    
25
	ID_PARTS=`/sbin/dumpfs /dev/${1} | /usr/bin/head -n 2 | /usr/bin/tail -n 1 | /usr/bin/cut -f2 -d'[' | /usr/bin/cut -f1 -d ']'`
26
	# " 51110eb0 f288b35d " (note it has more spaces than we need/want)
27
	ID_PART1=`echo ${ID_PARTS} | awk '{print $1;}'`
28
	# "51110eb0"
29
	ID_PART2=`echo ${ID_PARTS} | awk '{print $2;}'`
30
	# "f288b35d"
31

    
32
	if [ "${ID_PART1}" = "" ] || [ "${ID_PART2}" = "" ]; then
33
		echo "Invalid ufsid on ${1} (${ID_PARTS}), cannot continue"
34
		exit.
35
	fi
36

    
37
	# Safety check to avoid http://www.freebsd.org/cgi/query-pr.cgi?pr=156908
38
	string_length ${ID_PART1}
39
	if [ ${LEN} -ne 8 ]; then
40
		ID_PART1=`printf "%08s" "${ID_PART1}"`
41
	fi
42
	string_length ${ID_PART2}
43
	if [ ${LEN} -ne 8 ]; then
44
		ID_PART2=`printf "%08s" "${ID_PART2}"`
45
	fi
46
	UFSID=${ID_PART1}${ID_PART2}
47
}
48

    
49
find_fs_device(){
50
	unset DEV
51
	DEV=`/usr/bin/grep -e "[[:blank:]]${1}[[:blank:]]" ${FSTAB} | awk '{print $1;}'`
52
	DEV=${DEV##/dev/}
53
}
54

    
55
FSTAB=/etc/fstab
56
NEED_CHANGES=false
57
cp ${FSTAB} ${FSTAB}.tmp
58

    
59
ALL_FILESYSTEMS=`/bin/cat /etc/fstab | /usr/bin/awk '/ufs/ && !(/dev\/mirror\// || /dev\/ufsid\// || /dev\/label\// || /dev\/geom\//) {print $2;}'`
60

    
61
for FS in ${ALL_FILESYSTEMS}
62
do
63
	find_fs_device ${FS}
64
	if [ "${DEV}" != "" ]; then
65
		get_ufsid ${DEV}
66
		string_length ${UFSID}
67
		if [ ${LEN} -ne 16 ]; then
68
			echo "Invalid UFS ID for FS ${FS} ($UFSID), skipping"
69
		else
70
			/usr/bin/sed -i'' -e "s/${DEV}/ufsid\/${UFSID}/g" ${FSTAB}.tmp
71
			NEED_CHANGES=true
72
		fi
73
	else
74
		echo "Unable to find device for ${FS}"
75
		return -1
76
	fi
77
	echo "FS: ${FS} on device ${DEV} with ufsid ${UFSID}"
78
done
79

    
80
ALL_SWAPFS=`/bin/cat /etc/fstab | /usr/bin/awk '/swap/ && !(/dev\/mirror\// || /dev\/ufsid\// || /dev\/label\// || /dev\/geom\//) {print $1;}'`
81
SWAPNUM=0
82
for SFS in ${ALL_SWAPFS}
83
do
84
	DEV=${SFS##/dev/}
85
	if [ "${DEV}" != "" ]; then
86
		SWAPDEV=${DEV}
87
		echo "FS: Swap slice ${SWAPNUM} on device ${SWAPDEV}"
88
		if [ "${SWAPDEV}" != "" ]; then
89
			/usr/bin/sed -i'' -e "s/${SWAPDEV}/label\/swap${SWAPNUM}/g" ${FSTAB}.tmp
90
			NEED_CHANGES=true
91
		fi
92
		SWAPNUM=`expr ${SWAPNUM} + 1`
93
	fi
94
done
95

    
96
if [ "${NEED_CHANGES}" = "false" ]; then
97
	echo Nothing to do, all filesystems and swap already use some form of device-independent labels
98
	exit
99
fi
100

    
101
echo "===================="
102
echo "Current fstab:"
103
cat ${FSTAB}
104
echo "===================="
105
echo "New fstab:"
106
cat ${FSTAB}.tmp
107

    
108
if [ "${1}" = "commit" ]; then
109
	COMMIT=y
110
else
111
	echo "Commit changes? (y/n):"
112
	read COMMIT
113
fi
114

    
115
# Commit changes
116
if [ "${COMMIT}" = "y" ] || [ "${COMMIT}" = "Y" ]; then
117
	echo "Disabling swap to apply label"
118
	/sbin/swapoff /dev/${SWAPDEV}
119

    
120
	echo "Applying label to swap parition"
121
	SWAPNUM=0
122
	for SFS in ${ALL_SWAPFS}
123
	do
124
		find_fs_device ${SFS}
125
		if [ "${DEV}" != "" ]; then
126
			SWAPDEV=${DEV}
127
			if [ "${SWAPDEV}" != "" ]; then
128
				/sbin/glabel label swap${SWAPNUM} /dev/${SWAPDEV}
129
			fi
130
			SWAPNUM=`expr ${SWAPNUM} + 1`
131
		fi
132
	done
133

    
134
	echo "Activating new fstab"
135
	/bin/mv -f ${FSTAB} ${FSTAB}.old
136
	/bin/mv -f ${FSTAB}.tmp ${FSTAB}
137

    
138
	echo "Re-enabling swap"
139
	/sbin/swapon -a 2>/dev/null >/dev/null
140
fi
(33-33/35)