1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
#!/bin/sh
#
# /etc/rc.d/rc.S: System initialization script.
#
# Mostly written by: Patrick J. Volkerding, <volkerdi@slackware.com>
#
PATH=/sbin:/usr/sbin:/bin:/usr/bin
# Mount /proc right away:
/sbin/mount -v proc /proc -n -t proc
# If 'nohotplug' was given at boot, or rc.hotplug has been turned off
# (is not executable), then shut off hotplugging in the kernel now.
# Turning off hotplug is *not* recommended, and will break some things.
if [ -w /proc/sys/kernel/hotplug ]; then
if grep -w nohotplug /proc/cmdline 1> /dev/null 2> /dev/null ; then
echo "/dev/null" > /proc/sys/kernel/hotplug
elif [ ! -x /etc/rc.d/rc.hotplug ]; then
echo "/dev/null" > /proc/sys/kernel/hotplug
fi
fi
# Start devfsd if necessary. On newer kernels, udev should be used instead.
if [ -x /etc/rc.d/rc.devfsd ]; then
/etc/rc.d/rc.devfsd start
fi
# Mount sysfs next, if the kernel supports it:
if [ -d /sys ]; then
if cat /proc/filesystems | grep -w sysfs 1> /dev/null 2> /dev/null ; then
if ! cat /proc/mounts | grep -w sysfs 1> /dev/null 2> /dev/null ; then
/sbin/mount -v sysfs /sys -n -t sysfs
fi
fi
fi
# Initialize udev to manage /dev entries for 2.6.x kernels:
if [ -x /etc/rc.d/rc.udev ]; then
if ! grep -w nohotplug /proc/cmdline 1> /dev/null 2> /dev/null ; then
/etc/rc.d/rc.udev
fi
fi
# Enable swapping:
/sbin/swapon -a
# Test to see if the root partition is read-only, like it ought to be.
READWRITE=no
if touch /fsrwtestfile 2>/dev/null; then
rm -f /fsrwtestfile
READWRITE=yes
else
echo "Testing root filesystem status: read-only filesystem"
fi
# See if a forced filesystem check was requested at shutdown:
if [ -r /etc/forcefsck ]; then
FORCEFSCK="-f"
fi
# Check the root filesystem:
if [ ! $READWRITE = yes ]; then
RETVAL=0
if [ ! -r /etc/fastboot ]; then
echo "Checking root filesystem:"
/sbin/fsck $FORCEFSCK -C -a /
RETVAL=$?
fi
# An error code of 2 or higher will require a reboot.
if [ $RETVAL -ge 2 ]; then
# An error code equal to or greater than 4 means that some errors
# could not be corrected. This requires manual attention, so we
# offer a chance to try to fix the problem in single-user mode:
if [ $RETVAL -ge 4 ]; then
echo
echo "***********************************************************"
echo "*** An error occurred during the root filesystem check. ***"
echo "*** You will now be given a chance to log into the ***"
echo "*** system in single-user mode to fix the problem. ***"
echo "*** ***"
echo "*** If you are using the ext2 filesystem, running ***"
echo "*** 'e2fsck -v -y <partition>' might help. ***"
echo "***********************************************************"
echo
echo "Once you exit the single-user shell, the system will reboot."
echo
PS1="(Repair filesystem) \#"; export PS1
sulogin
else # With an error code of 2 or 3, reboot the machine automatically:
echo
echo "***********************************"
echo "*** The filesystem was changed. ***"
echo "*** The system will now reboot. ***"
echo "***********************************"
echo
fi
echo "Unmounting file systems."
/sbin/umount -a -r
/sbin/mount -n -o remount,ro /
echo "Rebooting system."
sleep 2
reboot -f
fi
# Remount the root filesystem in read-write mode
echo "Remounting root device with read-write enabled."
/sbin/mount -w -v -n -o remount /
if [ $? -gt 0 ] ; then
echo
echo "Attempt to remount root device as read-write failed! This is going to"
echo "cause serious problems."
echo
echo "If you're using the UMSDOS filesystem, you **MUST** mount the root partition"
echo "read-write! You can make sure the root filesystem is getting mounted "
echo "read-write with the 'rw' flag to Loadlin:"
echo
echo "loadlin vmlinuz root=/dev/hda1 rw (replace /dev/hda1 with your root device)"
echo
echo "Normal bootdisks can be made to mount a system read-write with the rdev command:"
echo
echo "rdev -R /dev/fd0 0"
echo
echo "You can also get into your system by using a boot disk with a command like this"
echo "on the LILO prompt line: (change the root partition name as needed)"
echo
echo "LILO: mount root=/dev/hda1 rw"
echo
echo "Please press ENTER to continue, then reboot and use one of the above methods to"
echo -n "get into your machine and start looking for the problem. "
read junk;
fi
else
echo "Testing root filesystem status: read-write filesystem"
if cat /etc/fstab | grep ' / ' | grep umsdos 1> /dev/null 2> /dev/null ; then
ROOTTYPE="umsdos"
fi
if [ ! "$ROOTTYPE" = "umsdos" ]; then # no warn for UMSDOS
echo
echo "*** ERROR: Root partition has already been mounted read-write. Cannot check!"
echo
echo "For filesystem checking to work properly, your system must initially mount"
echo "the root partition as read only. Please modify your kernel with 'rdev' so that"
echo "it does this. If you're booting with LILO, add a line:"
echo
echo " read-only"
echo
echo "to the Linux section in your /etc/lilo.conf and type 'lilo' to reinstall it."
echo
echo "If you boot from a kernel on a floppy disk, put it in the drive and type:"
echo " rdev -R /dev/fd0 1"
echo
echo "If you boot from a bootdisk, or with Loadlin, you can add the 'ro' flag."
echo
echo "This will fix the problem *AND* eliminate this annoying message. :^)"
echo
echo -n "Press ENTER to continue. "
read junk;
fi
fi # Done checking root filesystem
# Any /etc/mtab that exists here is old, so we delete it to start over:
/bin/rm -f /etc/mtab*
# Remounting the / partition will initialize the new /etc/mtab:
/sbin/mount -w -o remount /
# Fix /etc/mtab to list sys and proc if they were not yet entered in
# /etc/mtab because / was still mounted read-only:
if [ -d /proc/sys ]; then
/sbin/mount -f proc /proc -t proc
fi
if [ -d /sys/bus ]; then
/sbin/mount -f sysfs /sys -t sysfs
fi
# Set the system time from the hardware clock using hwclock --hctosys.
if [ -x /sbin/hwclock ]; then
if grep "^UTC" /etc/hardwareclock 1> /dev/null 2> /dev/null ; then
echo "Setting system time from the hardware clock (UTC)."
/sbin/hwclock --utc --hctosys
else
echo "Setting system time from the hardware clock (localtime)."
/sbin/hwclock --localtime --hctosys
fi
fi
# Configure ISA Plug-and-Play devices:
if [ -r /etc/isapnp.conf ]; then
if [ -x /sbin/isapnp ]; then
/sbin/isapnp /etc/isapnp.conf
fi
fi
# This loads any kernel modules that are needed. These might be required to
# use your ethernet card, sound card, or other optional hardware.
if [ -x /etc/rc.d/rc.modules -a -r /proc/modules ]; then
. /etc/rc.d/rc.modules
fi
# Configure runtime kernel parameters:
if [ -x /sbin/sysctl -a -r /etc/sysctl.conf ]; then
/sbin/sysctl -e -p /etc/sysctl.conf
fi
# Initialize the Logical Volume Manager.
# This won't start unless we find /etc/lvmtab (LVM1) or
# /etc/lvm/backup/ (LVM2). This is created by /sbin/vgscan, so to
# use LVM you must run /sbin/vgscan yourself the first time (and
# create some VGs and LVs).
if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then
echo "Initializing LVM (Logical Volume Manager):"
# Check for device-mapper support.
if ! cat /proc/devices | grep -w device-mapper 1> /dev/null 2> /dev/null ; then
# If device-mapper exists as a module, try to load it.
if [ -r /lib/modules/$(cat /proc/sys/kernel/osrelease)/kernel/drivers/md/dm-mod.ko ]; then
insmod /lib/modules/$(cat /proc/sys/kernel/osrelease)/kernel/drivers/md/dm-mod.ko
fi
fi
# Scan for new volume groups:
/sbin/vgscan 2> /dev/null
if [ $? = 0 ]; then
# This needs a moment to register.
sleep 10
# Make volume groups available to the kernel.
# This should also make logical volumes available.
/sbin/vgchange -ay
# Enable swapping again in case any LVs are used for swap. Ignore previous error. :-)
/sbin/swapon -a
fi
fi
# Check all the non-root filesystems:
if [ ! -r /etc/fastboot ]; then
echo "Checking non-root filesystems:"
/sbin/fsck $FORCEFSCK -C -R -A -a
fi
# mount non-root file systems in fstab (but not NFS or SMB
# because TCP/IP is not yet configured, and not proc because
# that has already been mounted):
/sbin/mount -a -v -t nonfs,nosmbfs,noproc
# Clean up some temporary files:
( cd /var/log/setup/tmp && rm -rf * )
/bin/rm -f /var/run/utmp /var/run/*pid /etc/nologin /var/run/lpd* \
/var/run/ppp* /etc/dhcpc/*.pid /etc/forcefsck /etc/fastboot
# Attempt to umount and remove any leftover /initrd:
if [ -d /initrd ]; then
/sbin/umount /initrd 2> /dev/null
rmdir /initrd 2> /dev/null
blockdev --flushbufs /dev/ram0 2> /dev/null
fi
# Create a fresh utmp file:
touch /var/run/utmp
chown root.utmp /var/run/utmp
chmod 664 /var/run/utmp
if [ "$ROOTTYPE" = "umsdos" ]; then # we need to update any files added in DOS:
echo "Synchronizing UMSDOS directory structure:"
echo " /sbin/umssync -r99 -v- /"
/sbin/umssync -r99 -v- /
fi
# Setup the /etc/motd to reflect the current kernel level:
# THIS WIPES ANY CHANGES YOU MAKE TO /ETC/MOTD WITH EACH BOOT.
# COMMENT THIS OUT IF YOU WANT TO MAKE A CUSTOM VERSION.
echo "$(/bin/uname -sr)." > /etc/motd
# If there are SystemV init scripts for this runlevel, run them.
if [ -x /etc/rc.d/rc.sysvinit ]; then
. /etc/rc.d/rc.sysvinit
fi
# Run serial port setup script:
# (CAREFUL! This can make some systems hang if the rc.serial script isn't
# set up correctly. If this happens, you may have to edit the file from a
# boot disk)
#
# . /etc/rc.d/rc.serial
# Carry an entropy pool between reboots to improve randomness.
if [ -f /etc/random-seed ]; then
echo "Using /etc/random-seed to initialize /dev/urandom."
cat /etc/random-seed > /dev/urandom
fi
# Use the pool size from /proc, or 512 bytes:
if [ -r /proc/sys/kernel/random/poolsize ]; then
dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(cat /proc/sys/kernel/random/poolsize) 2> /dev/null
else
dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null
fi
chmod 600 /etc/random-seed
|