1 |
82bf21fc
|
jim-p
|
#!/bin/sh
|
2 |
|
|
#
|
3 |
|
|
# rc.ramdisk_functions.sh
|
4 |
|
|
#
|
5 |
|
|
# part of pfSense (https://www.pfsense.org)
|
6 |
8f2f85c3
|
Luiz Otavio O Souza
|
# Copyright (c) 2020-2022 Rubicon Communications, LLC (Netgate)
|
7 |
82bf21fc
|
jim-p
|
# All rights reserved.
|
8 |
|
|
#
|
9 |
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
10 |
|
|
# you may not use this file except in compliance with the License.
|
11 |
|
|
# You may obtain a copy of the License at
|
12 |
|
|
#
|
13 |
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
14 |
|
|
#
|
15 |
|
|
# Unless required by applicable law or agreed to in writing, software
|
16 |
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
17 |
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18 |
|
|
# See the License for the specific language governing permissions and
|
19 |
|
|
# limitations under the License.
|
20 |
|
|
|
21 |
|
|
# Source like so:
|
22 |
|
|
# . /etc/rc.ramdisk_functions.sh
|
23 |
|
|
# Then use these variables and functions wherever RAM disk operations are needed
|
24 |
|
|
|
25 |
|
|
RAMDISK_FLAG_FILE=/conf/ram_disks_failed
|
26 |
|
|
RAMDISK_DEFAULT_SIZE_tmp=40
|
27 |
|
|
RAMDISK_DEFAULT_SIZE_var=60
|
28 |
|
|
|
29 |
|
|
# Check if RAM disks are enabled in config.xml
|
30 |
|
|
ramdisk_check_enabled () {
|
31 |
|
|
[ "$(/usr/local/sbin/read_xml_tag.sh boolean system/use_mfs_tmpvar)" = "true" ]
|
32 |
|
|
return $?
|
33 |
|
|
}
|
34 |
|
|
|
35 |
|
|
# Checks that RAM disks are both enabled and that they have not failed
|
36 |
|
|
ramdisk_is_active () {
|
37 |
|
|
ramdisk_check_enabled && [ ! -e ${RAMDISK_FLAG_FILE} ]
|
38 |
|
|
return $?
|
39 |
|
|
}
|
40 |
|
|
|
41 |
|
|
# Checks if RAM disk setup failed
|
42 |
|
|
ramdisk_failed () {
|
43 |
|
|
[ -e ${RAMDISK_FLAG_FILE} ]
|
44 |
|
|
return $?
|
45 |
|
|
}
|
46 |
|
|
|
47 |
|
|
# Resets the RAM disk failure status
|
48 |
|
|
ramdisk_reset_status () {
|
49 |
|
|
if [ -f ${RAMDISK_FLAG_FILE} ]; then
|
50 |
|
|
rm -f ${RAMDISK_FLAG_FILE}
|
51 |
|
|
fi
|
52 |
|
|
}
|
53 |
|
|
|
54 |
|
|
# Checks if RAM disks were active on a previous boot (or active now)
|
55 |
|
|
ramdisk_was_active() {
|
56 |
|
|
# If /var is on a memory disk, then RAM disks are active now or were active and recently disabled
|
57 |
|
|
DISK_NAME=`/bin/df /var/db/rrd | /usr/bin/tail -1 | /usr/bin/awk '{print $1;}'`
|
58 |
|
|
DISK_TYPE=`/usr/bin/basename ${DISK_NAME} | /usr/bin/cut -c1-2`
|
59 |
|
|
[ "${DISK_TYPE}" = "md" ]
|
60 |
|
|
return $?
|
61 |
|
|
}
|
62 |
|
|
|
63 |
|
|
# Echos the effective size of the given RAM disk (var or tmp)
|
64 |
|
|
# If set, use that value. If unset, use the default value
|
65 |
|
|
# Usage example:
|
66 |
|
|
# tmpsize = $( ramdisk_get_size tmp )
|
67 |
|
|
# varsize = $( ramdisk_get_size var )
|
68 |
|
|
ramdisk_get_size () {
|
69 |
|
|
NAME=${1}
|
70 |
|
|
DEFAULT_SIZE=$(eval echo \${RAMDISK_DEFAULT_SIZE_${NAME}})
|
71 |
|
|
|
72 |
|
|
SIZE=$(/usr/local/sbin/read_xml_tag.sh string system/use_mfs_${NAME}_size)
|
73 |
|
|
if [ -n "${SIZE}" ] && [ ${SIZE} -gt 0 ]; then
|
74 |
|
|
echo ${SIZE}
|
75 |
|
|
else
|
76 |
|
|
echo ${DEFAULT_SIZE}
|
77 |
|
|
fi
|
78 |
|
|
return 0
|
79 |
|
|
}
|
80 |
|
|
|
81 |
|
|
# Tests if the current total RAM disk size can fit in free kernel memory
|
82 |
|
|
ramdisk_check_size () {
|
83 |
|
|
tmpsize=$( ramdisk_get_size tmp )
|
84 |
|
|
varsize=$( ramdisk_get_size var )
|
85 |
d566427f
|
jim-p
|
# Check available RAM
|
86 |
|
|
PAGES_FREE=$( /sbin/sysctl -n vm.stats.vm.v_free_count )
|
87 |
|
|
PAGE_SIZE=$( /sbin/sysctl -n vm.stats.vm.v_page_size )
|
88 |
|
|
MEM_FREE=$( /bin/expr ${PAGES_FREE} \* ${PAGE_SIZE} )
|
89 |
82bf21fc
|
jim-p
|
# Convert to MB
|
90 |
d566427f
|
jim-p
|
MEM_FREE=$( /bin/expr ${MEM_FREE} / 1024 / 1024 )
|
91 |
82bf21fc
|
jim-p
|
# Total size of desired RAM disks
|
92 |
d566427f
|
jim-p
|
MEM_NEED=$( /bin/expr ${tmpsize} + ${varsize} )
|
93 |
|
|
[ ${MEM_FREE} -gt ${MEM_NEED} ]
|
94 |
82bf21fc
|
jim-p
|
return $?
|
95 |
|
|
}
|
96 |
|
|
|
97 |
|
|
# Attempt to mount the given RAM disk (var or tmp)
|
98 |
|
|
# Usage:
|
99 |
|
|
# ramdisk_try_mount tmp
|
100 |
|
|
# ramdisk_try_mount var
|
101 |
|
|
ramdisk_try_mount () {
|
102 |
|
|
NAME=$1
|
103 |
|
|
if [ ramdisk_check_size ]; then
|
104 |
|
|
SIZE=$(eval echo \${${NAME}size})m
|
105 |
d566427f
|
jim-p
|
/sbin/mount -o rw,size=${SIZE},mode=1777 -t tmpfs tmpfs /${NAME}
|
106 |
82bf21fc
|
jim-p
|
return $?
|
107 |
|
|
else
|
108 |
|
|
return 1;
|
109 |
|
|
fi
|
110 |
|
|
}
|
111 |
|
|
|
112 |
|
|
# If the install has RAM disks, or if the full install _was_ using RAM disks, make a backup.
|
113 |
|
|
ramdisk_make_backup () {
|
114 |
|
|
if ramdisk_is_active || ramdisk_was_active; then
|
115 |
|
|
echo "Backing up RAM disk contents"
|
116 |
|
|
/etc/rc.backup_aliastables.sh
|
117 |
|
|
/etc/rc.backup_rrd.sh
|
118 |
|
|
/etc/rc.backup_dhcpleases.sh
|
119 |
|
|
/etc/rc.backup_logs.sh
|
120 |
75f2aba5
|
Mark Silinio
|
/etc/rc.backup_captiveportal.sh
|
121 |
|
|
/etc/rc.backup_voucher.sh
|
122 |
82bf21fc
|
jim-p
|
fi
|
123 |
|
|
}
|
124 |
|
|
|
125 |
|
|
# Relocate the pkg database to a specific given location, either disk (/var) or
|
126 |
|
|
# to its safe location for use with RAM disks (/root/var)
|
127 |
|
|
# Usage:
|
128 |
|
|
# ramdisk_relocate_pkgdb disk
|
129 |
|
|
# ramdisk_relocate_pkgdb ram
|
130 |
|
|
ramdisk_relocate_pkgdb () {
|
131 |
|
|
if [ ${1} = "disk" ]; then
|
132 |
|
|
local SRC=/root
|
133 |
|
|
local DST=
|
134 |
|
|
else
|
135 |
|
|
local SRC=
|
136 |
|
|
local DST=/root
|
137 |
|
|
fi
|
138 |
|
|
|
139 |
|
|
echo "Moving pkg database for ${1} storage"
|
140 |
|
|
if [ -d ${SRC}/var/db/pkg ]; then
|
141 |
|
|
echo "Clearing ${DST}/var/db/pkg"
|
142 |
|
|
rm -rf ${DST}/var/db/pkg 2>/dev/null
|
143 |
|
|
/bin/mkdir -p ${DST}/var/db
|
144 |
|
|
echo "Moving ${SRC}/var/db/pkg to ${DST}/var/db/"
|
145 |
|
|
mv -f ${SRC}/var/db/pkg ${DST}/var/db
|
146 |
|
|
fi
|
147 |
|
|
if [ -d ${SRC}/var/cache/pkg ]; then
|
148 |
|
|
echo "Clearing ${DST}/var/cache/pkg"
|
149 |
|
|
rm -rf ${DST}/var/cache/pkg 2>/dev/null
|
150 |
|
|
/bin/mkdir -p ${DST}/var/cache
|
151 |
|
|
echo "Moving ${SRC}/var/cache/pkg to ${DST}/var/cache/"
|
152 |
|
|
mv -f ${SRC}/var/cache/pkg ${DST}/var/cache
|
153 |
|
|
fi
|
154 |
|
|
}
|
155 |
|
|
|
156 |
|
|
# Relocate the pkg database as needed based on RAM disk options and status
|
157 |
|
|
ramdisk_relocate_pkgdb_all () {
|
158 |
|
|
unset MOVE_PKG_DATA
|
159 |
|
|
unset USE_RAMDISK
|
160 |
|
|
if ramdisk_check_enabled; then
|
161 |
|
|
USE_RAMDISK=true
|
162 |
|
|
fi
|
163 |
|
|
if [ -z "${USE_RAMDISK}" -a -f /root/var/db/pkg/local.sqlite ]; then
|
164 |
|
|
if ramdisk_failed; then
|
165 |
|
|
echo "Not relocating pkg db due to previous RAM disk failure."
|
166 |
|
|
return 1
|
167 |
|
|
fi
|
168 |
|
|
# If RAM disks are disabled, move files back into place
|
169 |
|
|
MOVE_PKG_DATA=1
|
170 |
|
|
ramdisk_relocate_pkgdb disk
|
171 |
|
|
elif [ -n "${USE_RAMDISK}" -a -f /var/db/pkg/local.sqlite ]; then
|
172 |
|
|
# If RAM disks are enabled, move files to a safe place
|
173 |
|
|
MOVE_PKG_DATA=1
|
174 |
|
|
ramdisk_relocate_pkgdb ram
|
175 |
|
|
fi
|
176 |
|
|
}
|
177 |
|
|
|
178 |
|
|
# Setup symbolic links for the pkg database
|
179 |
|
|
ramdisk_link_pkgdb () {
|
180 |
|
|
/bin/mkdir -p /var/db /var/cache
|
181 |
|
|
if [ ! -e /var/db/pkg ]; then
|
182 |
|
|
echo "Creating pkg db symlink"
|
183 |
|
|
ln -sf ../../root/var/db/pkg /var/db/pkg
|
184 |
|
|
fi
|
185 |
|
|
if [ ! -e /var/cache/pkg ]; then
|
186 |
|
|
echo "Creating pkg cache symlink"
|
187 |
|
|
ln -sf ../../root/var/cache/pkg /var/cache/pkg
|
188 |
|
|
fi
|
189 |
|
|
}
|
190 |
|
|
|
191 |
|
|
# Either unmount or mount /var and /tmp in ZFS as needed to avoid conflicts with
|
192 |
|
|
# active RAM disk options.
|
193 |
|
|
ramdisk_fixup_zfs () {
|
194 |
|
|
# Mount /var and /tmp on ZFS filesystems when necessary
|
195 |
|
|
if [ ${1} = "mount" ]; then
|
196 |
|
|
echo "Remounting ZFS volumes"
|
197 |
|
|
zfs mount -a
|
198 |
|
|
else
|
199 |
|
|
zfs list -H -o name,mountpoint |
|
200 |
|
|
while read volume mountpoint; do
|
201 |
|
|
[ "${mountpoint}" != "/var" -a "${mountpoint}" != "/tmp" ] \
|
202 |
|
|
&& continue
|
203 |
|
|
echo "Dismounting ZFS volume ${volume} for RAM disk"
|
204 |
|
|
/sbin/zfs umount ${volume}
|
205 |
|
|
done
|
206 |
|
|
fi
|
207 |
8f585441
|
Luiz Souza
|
}
|