OSDN Git Service

[fix] : Changed live disk size.
[alterlinux/alterlinux.git] / system / initcpio / hooks / archiso
1 # args: source, newroot, mountpoint
2 _mnt_dmsnapshot() {
3     local img="${1}"
4     local newroot="${2}"
5     local mnt="${3}"
6     local img_fullname="${img##*/}";
7     local img_name="${img_fullname%%.*}"
8     local dm_snap_name="${dm_snap_prefix}_${img_name}"
9     local ro_dev ro_dev_size rw_dev
10
11     ro_dev=$(losetup --find --show --read-only "${img}")
12     echo ${ro_dev} >> /run/archiso/used_block_devices
13     ro_dev_size=$(blockdev --getsz ${ro_dev})
14
15     if [[ "${cow_persistent}" == "P" ]]; then
16         if [[ -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" ]]; then
17             msg ":: Found '/run/archiso/cowspace/${cow_directory}/${img_name}.cow', using as persistent."
18         else
19             msg ":: Creating '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' as persistent."
20             truncate -s "${cow_spacesize}" "/run/archiso/cowspace/${cow_directory}/${img_name}.cow"
21         fi
22     else
23         if [[ -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" ]]; then
24             msg ":: Found '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' but non-persistent requested, removing."
25             rm -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow"
26         fi
27         msg ":: Creating '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' as non-persistent."
28         truncate -s "${cow_spacesize}" "/run/archiso/cowspace/${cow_directory}/${img_name}.cow"
29     fi
30
31     rw_dev=$(losetup --find --show "/run/archiso/cowspace/${cow_directory}/${img_name}.cow")
32     echo ${rw_dev} >> /run/archiso/used_block_devices
33
34     dmsetup create ${dm_snap_name} --table "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} ${cow_chunksize}"
35
36     if [[ "${cow_persistent}" != "P" ]]; then
37         rm -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow"
38     fi
39
40     _mnt_dev "/dev/mapper/${dm_snap_name}" "${newroot}${mnt}" "-w" "defaults"
41     echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/archiso/used_block_devices
42 }
43
44 # args: source, newroot, mountpoint
45 _mnt_overlayfs() {
46     local src="${1}"
47     local newroot="${2}"
48     local mnt="${3}"
49     mkdir -p /run/archiso/cowspace/${cow_directory}/upperdir /run/archiso/cowspace/${cow_directory}/workdir
50     mount -t overlay -o lowerdir=${src},upperdir=/run/archiso/cowspace/${cow_directory}/upperdir,workdir=/run/archiso/cowspace/${cow_directory}/workdir airootfs "${newroot}${mnt}"
51 }
52
53
54 # args: /path/to/image_file, mountpoint
55 _mnt_sfs() {
56     local img="${1}"
57     local mnt="${2}"
58     local img_fullname="${img##*/}"
59     local sfs_dev
60
61     if [[ "${copytoram}" == "y" ]]; then
62         msg -n ":: Copying squashfs image to RAM..."
63         if ! cp "${img}" "/run/archiso/copytoram/${img_fullname}" ; then
64             echo "ERROR: while copy '${img}' to '/run/archiso/copytoram/${img_fullname}'"
65             launch_interactive_shell
66         fi
67         img="/run/archiso/copytoram/${img_fullname}"
68         msg "done."
69     fi
70     sfs_dev=$(losetup --find --show --read-only "${img}")
71     echo ${sfs_dev} >> /run/archiso/used_block_devices
72     _mnt_dev "${sfs_dev}" "${mnt}" "-r" "defaults"
73 }
74
75 # args: device, mountpoint, flags, opts
76 _mnt_dev() {
77     local dev="${1}"
78     local mnt="${2}"
79     local flg="${3}"
80     local opts="${4}"
81
82     mkdir -p "${mnt}"
83
84     msg ":: Mounting '${dev}' to '${mnt}'"
85
86     while ! poll_device "${dev}" 30; do
87         echo "ERROR: '${dev}' device did not show up after 30 seconds..."
88         echo "   Falling back to interactive prompt"
89         echo "   You can try to fix the problem manually, log out when you are finished"
90         launch_interactive_shell
91     done
92
93     if mount -o "${opts}" "${flg}" "${dev}" "${mnt}"; then
94         msg ":: Device '${dev}' mounted successfully."
95     else
96         echo "ERROR; Failed to mount '${dev}'"
97         echo "   Falling back to interactive prompt"
98         echo "   You can try to fix the problem manually, log out when you are finished"
99         launch_interactive_shell
100     fi
101 }
102
103 _verify_checksum() {
104     local _status
105     cd "/run/archiso/bootmnt/${archisobasedir}/${arch}"
106     sha512sum -c airootfs.sha512 > /tmp/checksum.log 2>&1
107     _status=$?
108     cd "${OLDPWD}"
109     return ${_status}
110 }
111
112 _verify_signature() {
113     local _status
114     cd "/run/archiso/bootmnt/${archisobasedir}/${arch}"
115     gpg --homedir /gpg --status-fd 1 --verify airootfs.sfs.sig 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG'
116     _status=$?
117     cd "${OLDPWD}"
118     return ${_status}
119 }
120
121 run_hook() {
122     [[ -z "${arch}" ]] && arch="$(uname -m)"
123     [[ -z "${copytoram_size}" ]] && copytoram_size="75%"
124     [[ -z "${archisobasedir}" ]] && archisobasedir="arch"
125     [[ -z "${dm_snap_prefix}" ]] && dm_snap_prefix="arch"
126     [[ -z "${archisodevice}" ]] && archisodevice="/dev/disk/by-label/${archisolabel}"
127     [[ -z "${cow_spacesize}" ]] && cow_spacesize="310M"
128
129     if [[ -n "${cow_label}" ]]; then
130         cow_device="/dev/disk/by-label/${cow_label}"
131         [[ -z "${cow_persistent}" ]] && cow_persistent="P"
132     elif [[ -n "${cow_device}" ]]; then
133         [[ -z "${cow_persistent}" ]] && cow_persistent="P"
134     else
135         cow_persistent="N"
136     fi
137
138     [[ -z "${cow_flags}" ]] && cow_flags="defaults"
139     [[ -z "${cow_directory}" ]] && cow_directory="persistent_${archisolabel}/${arch}"
140     [[ -z "${cow_chunksize}" ]] && cow_chunksize="8"
141
142     # set mount handler for archiso
143     mount_handler="archiso_mount_handler"
144 }
145
146 # This function is called normally from init script, but it can be called
147 # as chain from other mount handlers.
148 # args: /path/to/newroot
149 archiso_mount_handler() {
150     local newroot="${1}"
151
152     if ! mountpoint -q "/run/archiso/bootmnt"; then
153         _mnt_dev "${archisodevice}" "/run/archiso/bootmnt" "-r" "defaults"
154         if [[ "${copytoram}" != "y" ]]; then
155             echo $(readlink -f ${archisodevice}) >> /run/archiso/used_block_devices
156         fi
157     fi
158
159     if [[ "${checksum}" == "y" ]]; then
160         if [[ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sha512" ]]; then
161             msg -n ":: Self-test requested, please wait..."
162             if _verify_checksum; then
163                 msg "done. Checksum is OK, continue booting."
164             else
165                 echo "ERROR: one or more files are corrupted"
166                 echo "see /tmp/checksum.log for details"
167                 launch_interactive_shell
168             fi
169         else
170             echo "ERROR: checksum=y option specified but ${archisobasedir}/${arch}/airootfs.sha512 not found"
171             launch_interactive_shell
172         fi
173     fi
174
175     if [[ "${verify}" == "y" ]]; then
176         if [[ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs.sig" ]]; then
177             msg -n ":: Signature verification requested, please wait..."
178             if _verify_signature; then
179                 msg "done. Signature is OK, continue booting."
180             else
181                 echo "ERROR: one or more files are corrupted"
182                 launch_interactive_shell
183             fi
184         else
185             echo "ERROR: verify=y option specified but ${archisobasedir}/${arch}/airootfs.sfs.sig not found"
186             launch_interactive_shell
187         fi
188     fi
189
190     if [[ "${copytoram}" == "y" ]]; then
191         msg ":: Mounting /run/archiso/copytoram (tmpfs) filesystem, size=${copytoram_size}"
192         mkdir -p /run/archiso/copytoram
193         mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram /run/archiso/copytoram
194     fi
195
196     if [[ -n "${cow_device}" ]]; then
197         _mnt_dev "${cow_device}" "/run/archiso/cowspace" "-r" "${cow_flags}"
198         echo $(readlink -f ${cow_device}) >> /run/archiso/used_block_devices
199         mount -o remount,rw "/run/archiso/cowspace"
200     else
201         msg ":: Mounting /run/archiso/cowspace (tmpfs) filesystem, size=${cow_spacesize}..."
202         mkdir -p /run/archiso/cowspace
203         mount -t tmpfs -o "size=${cow_spacesize}",mode=0755 cowspace /run/archiso/cowspace
204     fi
205     mkdir -p -m 0700 "/run/archiso/cowspace/${cow_directory}"
206
207     _mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs" "/run/archiso/sfs/airootfs"
208     if [[ -f "/run/archiso/sfs/airootfs/airootfs.img" ]]; then
209         _mnt_dmsnapshot "/run/archiso/sfs/airootfs/airootfs.img" "${newroot}" "/"
210     else
211         _mnt_overlayfs "/run/archiso/sfs/airootfs" "${newroot}" "/"
212     fi
213
214     if [[ "${copytoram}" == "y" ]]; then
215         umount -d /run/archiso/bootmnt
216     fi
217 }
218
219 # vim:ft=sh:ts=4:sw=4:et: