summaryrefslogtreecommitdiffstats
path: root/appliance/init
blob: f9818b63c4f2d51a6ed65f9082080eed23e15619 (plain)
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
#!/bin/sh

echo Starting /init script ...

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

# Debian bug 606622.
RUNLEVEL=S
PREVLEVEL=N
export RUNLEVEL PREVLEVEL

mkdir -p /sysroot

if [ ! -d /proc ]; then rm -f /proc; fi
mkdir -p /proc
mount -t proc /proc /proc
if [ ! -d /sys ]; then rm -f /sys; fi
mkdir -p /sys
mount -t sysfs /sys /sys
mkdir -p /run/lock

# devtmpfs is required since udev 176
mount -t devtmpfs /dev /dev

if [ ! -L /etc/init.d/udev -a -x /etc/init.d/udev ]; then
  if type service >/dev/null 2>&1; then
     service udev start
  else
     /etc/init.d/udev start
  fi
elif [ -x /sbin/start_udev ] && /sbin/start_udev; then
  :
else
  # Find udevd and run it directly.
  for f in /sbin/udevd /lib/udev/udevd \
      /lib/systemd/systemd-udevd /usr/lib/systemd/systemd-udevd \
      /usr/lib/udev/udevd; do
    if [ -x "$f" ]; then UDEVD="$f"; fi
  done
  if [ -n "$UDEVD" ]; then
    echo -e '\000\000\000\000' > /proc/sys/kernel/hotplug
    $UDEVD --daemon
    udevadm trigger
    udevadm settle --timeout=600
  else
    echo No udevd, creating /dev manually.
    mount -t tmpfs none /dev
    mkdir /dev/pts /dev/shm /dev/mapper
    mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
    # Must do each MAKEDEV individually, because if one device fails,
    # MAKEDEV will quit without creating the rest (RHBZ#507374).
    for dev in mem null port zero core full ram tty console fd \
      hda hdb hdc hdd sda sdb sdc sdd loop sd; do
      MAKEDEV $dev ||:
    done
    mknod /dev/ptmx c 5 2;    chmod 0666 /dev/ptmx
    mknod /dev/random c 1 8;  chmod 0666 /dev/random
    mknod /dev/urandom c 1 9; chmod 0444 /dev/urandom
    ln -sf /proc/self/fd/0 /dev/stdin
    ln -sf /proc/self/fd/1 /dev/stdout
    ln -sf /proc/self/fd/2 /dev/stderr

    modprobe virtio_pci
    modprobe virtio_net
  fi
fi

if grep -sq selinux=1 /proc/cmdline; then
  mount -t selinuxfs none /selinux
fi

# Update the system clock.
hwclock -u -s

# Set up the network.
ip addr add 127.0.0.1/8 brd + dev lo scope host
ip link set dev lo up

ip addr add 169.254.2.10/16 brd + dev eth0 scope global
ip link set dev eth0 up

ip route add default via 169.254.2.2

# Scan for MDs.
mdadm -As --auto=yes --run

# Scan for LVM.
modprobe dm_mod ||:

lvm vgscan --ignorelockingfailure
lvm vgchange -ay --ignorelockingfailure

# Improve virtio-blk performance (RHBZ#509383).
for f in /sys/block/vd*/queue/rotational; do echo 1 > $f; done

# http://kbase.redhat.com/faq/docs/DOC-5428
# Disabled this until https://bugzilla.redhat.com/show_bug.cgi?id=630583
# is fixed (broken in Linux 2.6.36).
#for f in /sys/block/[hsv]d*/queue/scheduler; do echo noop > $f; done

# These are useful when debugging.
if grep -sq guestfs_verbose=1 /proc/cmdline; then
    ls -lR /dev
    cat /proc/mounts
    lvm pvs
    lvm vgs
    lvm lvs
    ip a
    ip r
    lsmod
    #hwclock -r
    date
    #ping -n -v -c 5 10.0.2.2
    #ping -n -v -c 5 10.0.2.4

    echo -n "uptime: "; cat /proc/uptime
fi

if ! grep -sq guestfs_rescue=1 /proc/cmdline; then
  # Run the daemon under valgrind if ./configure --enable-valgrind-daemon
  vg_channel=/dev/virtio-ports/org.libguestfs.valgrind
  if [ -w $vg_channel ]; then
    if [ -r /etc/guestfsd.suppressions ]; then
      suppressions="--suppressions=/etc/guestfsd.suppressions"
    fi
    exec 3>$vg_channel
    vg="valgrind --leak-check=full --log-fd=3 --error-exitcode=119 --max-stackframe=8388608 --child-silent-after-fork=yes $suppressions"
    echo "enabling valgrind: $vg"
  fi

  # The host will kill qemu abruptly if guestfsd shuts down normally
  $vg guestfsd

  # Otherwise we try to clean up gracefully. For example, this ensures that a
  # core dump generated by the guest daemon will be written to disk.
else
  # Use appliance in rescue mode, also used by the virt-rescue command.
  eval $(grep -Eo 'TERM=[^[:space:]]+' /proc/cmdline)
  PS1='><rescue> '
  export TERM PS1
  echo
  echo "------------------------------------------------------------"
  echo
  echo "Welcome to virt-rescue, the libguestfs rescue shell."
  echo
  echo "Note: The contents of / are the rescue appliance."
  echo "You have to mount the guest's partitions under /sysroot"
  echo "before you can examine them."
  echo
  bash -i
  echo
  echo "virt-rescue: Syncing the disk now before exiting ..."
  echo
fi

sync
reboot -f