Commit Graph

387 Commits

Author SHA1 Message Date
Alexey Sheplyakov
a300f01d08 20211007-alt1
- HTTP boot improvements (closes: #41072)
2021-10-07 16:46:06 +04:00
Alexey Sheplyakov
24db85c5ab http: fixed Content-Length header validation
Content-Length is not necesserily the last header, more headers
can follow it.

Closes: #41072
2021-10-07 16:43:36 +04:00
Alexey Sheplyakov
43a9d78fdd 20210922-alt1
- Support booting complete ISOs via HTTP

Closes: #40710
2021-09-22 14:25:24 +04:00
Alexey Sheplyakov
36b688d17a network boot: support loading complete ISOs via HTTP
Now I don't have to unpack (or loop mount) ISO to boot via HTTP.
Also I can boot directly from any ALT mirror, like this:

automatic=method:http,network:dhcp,server:mirror.yandex.ru,directory=/altlinux/images/p9/simply/aarch64/slinux-live-9.1.1-aarch64.iso

Closes: #40710
2021-09-17 17:26:33 +04:00
Alexey Sheplyakov
736c89620f http_download_file: fixed download of files >= 2GB size
* Use `unsigned long` to store the file size
* Return an error if the file size can not be found
* Avoid loading files >= 4GB on 32-bit systems

Related: #40710
2021-09-17 17:26:33 +04:00
Alexey Sheplyakov
e34da5300d 20210908-alt1
- Find out stage2 size at the run time instead of relying on
  the `ramdisk_size` parameter. As a result `ramdisk_size`
  parameter is not required any more.

Closes: #40629
2021-09-08 12:07:24 +04:00
Alexey Sheplyakov
77181411cd load_ramdisk_fd: load ramdisk to a tmpfs file
- No need to compute `ramdisk_size` in advance
- No need to pass `ramdisk_size` to the kernel => simpler ISO
  remastering (and network boot setup)
- If the swap is enabled rarely used parts of the loaded image
  can be paged out

Closes: #40629
2021-09-08 12:00:57 +04:00
Alexey Sheplyakov
08ec5c3a78 tools.c: added do_losetup_fd helper function
Useful to setup a loopback device backed by an anonymous file
(created by memfd_create, open(O_TMPFILE), and similar).
2021-09-08 12:00:49 +04:00
Alexey Sheplyakov
f6a430fd36 ftp_prepare: check if the image fits into (1/2 of) RAM
Related: #40710
2021-09-08 12:00:41 +04:00
Alexey Sheplyakov
0a972b5b86 http_prepare: check if the image fits into (1/2 of) RAM 2021-09-08 12:00:32 +04:00
Alexey Sheplyakov
7f778d1e30 20210907-alt1
- Improved IO errors handling when loading stage2 (closes: #40803)
- Support loading stage2 images >= 2GB (related: #40710)
2021-09-07 12:52:18 +04:00
Alexey Sheplyakov
63008e11b2 load_ramdisk_fd: improved IO error handling
- while loop terminates on read error **without** resetting
  `seems_ok` to 0, thus read errors won't be noticed
- no check if bytes_read matches the expected image size
- ram_fd is leaked on write error
- short writes are treated as errors (when in fact they are
  perfectly fine)

Therefore:

- Handle *all* read errors, not just the very first one
- If the image size is known in advance verify if we actually
  read the whole image
- close `ram_fd` in error code paths
- Handle short writes properly

Closes: #40803
2021-09-07 12:44:07 +04:00
Alexey Sheplyakov
dc87263d47 load_ramdisk_fd: support loading files >= 2GB
Related: #40710
2021-09-07 12:28:06 +04:00
Alexey Sheplyakov
fa6c5ef78f 20210902-alt1
- Try older SMB/CIFS protocol versions if mounting a CIFS share failed
- Redirect propagator logs to ttyprintk (kernel log buffer) so they
  can be easily inspected with dmesg.
2021-09-06 17:57:38 +04:00
Alexey Sheplyakov
d1d376a30f cifsmount: retry with older protocol versions on failure
* An old server might not support the (cifs.ko) default protocol version
* Crypto modules required for new(er) protocol versions might be missing
  in initramfs

Related: #40554
2021-09-06 17:57:38 +04:00
Alexey Sheplyakov
08639c8faf open_log: print logs to /dev/ttyprintk
- A complete boot log (both early userspace and kernel) is preserved
  and can be obtained via `dmesg`
- Messages are ordered and timestamped, so the log is more clear

Example:

[    5.616453] [U] * /sbin/mount.cifs //10.42.0.4/dist/slinux-9.1-x86_64.iso /image -oguest,vers=1.0
[    5.616932] CIFS: Attempting to mount //10.42.0.4/dist/slinux-9.1-x86_64.iso
[    5.616940] CIFS: VFS: Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers
[    5.621647] CIFS: VFS: Could not allocate crypto cmac(aes)
[    5.623263] CIFS: VFS: Could not allocate crypto cmac(aes)
[    5.626645] [U] mount error(20): Not a directory
[    5.626649] [U] Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
[    5.626747] [U] * assuming ISO image, Samba path://10.42.0.4/dist
[    5.626749] [U] * mounting //10.42.0.4/dist on /image as type cifs
[    5.626753] [U] * cifsmount: attempting to mount //10.42.0.4/dist with default protocol version
[    5.626758] [U] * /sbin/mount.cifs //10.42.0.4/dist /image -oguest
[    5.627299] CIFS: Attempting to mount //10.42.0.4/dist
[    5.629106] CIFS: VFS: Could not allocate crypto cmac(aes)
[    5.631290] CIFS: VFS: Could not allocate crypto cmac(aes)
[    5.638261] CIFS: VFS: \\10.42.0.4 generate_key: crypto alloc failed
[    5.638264] CIFS: VFS: \\10.42.0.4 Send error in SessSetup = -2
[    5.638275] CIFS: VFS: cifs_mount failed w/return code = -2
[    5.638294] [U] mount error(2): No such file or directory
[    5.638296] [U] Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
[    5.638376] [U] * cifsmount: failed, retrying with vers=1.0
[    5.638383] [U] * /sbin/mount.cifs //10.42.0.4/dist /image -oguest,vers=1.0
[    5.639582] CIFS: Attempting to mount //10.42.0.4/dist
[    5.639590] CIFS: VFS: Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers
[    5.649559] [U] * assuming ISO image, path:/image/slinux-9.1-x86_64.iso

Related: #40554
2021-09-06 17:57:38 +04:00
Alexey Sheplyakov
a8fa5f19bf cifsmount: capture std{err,out} of mount.cifs to log
So it's easier to debug a failed boot.
While at it avoid closing stdin, since a printf might inject
unexpected input into a wrong place (a socket with FD 0).
Redirect stdin from /dev/null instead.

While at it improved error handling a bit (fork, waitpid can fail)

nfsmount: same here

Related: #40554
2021-09-06 17:57:38 +04:00
Alexey Sheplyakov
30a09ca772 20210831-alt1
- Network boot: improved automatic interface selection (closes: #40616)
2021-09-02 12:04:57 +04:00
Alexey Sheplyakov
110ac7dff1 Network boot: ignore interfaces without a carrier
Also skip interfaces which can't be brought up for some reason
(i.e. missing firmware). Thus the system can boot automatically
when exactly one interface has a carrier.

Closes: #40616
2021-09-02 12:04:57 +04:00
Alexey Sheplyakov
dd58d27275 20210823-alt1 2021-08-23 16:15:59 +04:00
Alexey Sheplyakov
db44ebdc74 Avoid races between init mounting loopback device and udev probing it
LOOP_SET_FD, LOOP_SET_STATUS ioctls trigger a `change` event with
loopback device in question. udev handles those events with
(builtin) blkid command. Probing a device with blkid takes a while,
so init might try to mount the loopback device in question while
`blkid` is still running. As a result init and udev block each other.
Eventually (after 3 minutes or whatever udev event timeout is)
`blkid` gets killed and boot proceeds. However such long delays are
very annoying. Therefore run `udev_settle` after each loop related
ioctl to avoid the concurrent access to the same loopback device.

Closes: #40687
2021-08-19 20:00:34 +04:00
Egor Ignatov
095e17ab91
20210721-alt1
- mkmodpack: include leading directories for firmware files
  The kernel needs leading directories in the cpio archive when
  creating rootfs. Otherwise, the files will not be copied.
2021-07-21 18:56:21 +03:00
Egor Ignatov
7738617c4c
mkmodpack: include leading directories for firmware files
The kernel needs leading directories in the cpio archive when
creating rootfs. Otherwise, the files will not be copied.
2021-07-21 18:56:10 +03:00
Evgeny Sinelnikov
eee4e636d9 20210329-alt1
- Add support 'fuid' automatic mode option for method cdrom
- Fix potential memory overflow in welcome string
- Set PREFIX to "/" for nfs and cifs methods due its mounted to image root
2021-04-05 13:10:16 +04:00
Evgeny Sinelnikov
9e47dc484c network.c: set PREFIX to "/" for nfs and cifs methods due its mounted to image root 2021-04-05 13:05:51 +04:00
Evgeny Sinelnikov
bcc496411b Fix potential memory overflow in welcome string
stage1.c:354:41: warning: '%s' directive output may be truncated writing up to 127 bytes into a region of size 117 [-Wformat-truncation=]
  snprintf(buf, sizeof(buf), "Welcome to %s", version);
                                         ^~   ~~~~~~~
In file included from /usr/include/stdio.h:862,
                 from stage1.c:30:
/usr/include/bits/stdio2.h:64:10: note: '__builtin___snprintf_chk' output between 12 and 139 bytes into a destination of size 128
   return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        __bos (__s), __fmt, __va_arg_pack ());
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2021-04-04 17:34:46 +04:00
Evgeny Sinelnikov
7a21d264c7 cdrom.c, tools.{h.c}: Add support 'fuid' automatic mode option for method cdrom
The installed system can have several devices with the same structure.
The automatic 'fuid' option can be used to detach one from the other to find the
partition where our stage2 image is stored, launched from stage1 (in this case
propagator). This option works automatically with the cdrom method:
- automatic=method:cdrom,fuid:PATH_TO_UNIQ_UID_FILENAME
2021-04-04 17:18:25 +04:00
Evgeny Sinelnikov
1a5eefb6f4 20210327-alt1
- cdrom.c: Try to mount multiple devices in automatic mode
2021-03-27 03:01:15 +04:00
Evgeny Sinelnikov
6beeb2ccca cdrom.c: Try to mount multiple devices in automatic mode 2021-03-27 02:59:28 +04:00
Anton Midyukov
c1feb23c6d 20210323-alt1
- disk.c, mount.c: Add support exfat
2021-03-23 12:25:53 +07:00
Anton Midyukov
ae2901d290 disk.c, mount.c: Add support exfat 2021-03-23 12:24:50 +07:00
Dmitriy Terekhin
b4c8144c03 20201216-alt1
- mkmodpack: warn about incorrect patterns
  Kernel modules may be needed to access rootfs.
  Such modules must be present in the initramfs.
  The mkmodpack script finds modules by given patterns.
  If the pattern is specified incorrectly, the module
  will not be found and booting will become impossible.
  Need to warn about module patterns that do not match with anything.
2020-12-18 20:45:04 +04:00
Dmitriy Terekhin
72805ad038 mkmodpack: warn about incorrect patterns
Kernel modules may be needed to access rootfs.
Such modules must be present in the initramfs.
The mkmodpack script finds modules by given patterns.
If the pattern is specified incorrectly, the module
will not be found and booting will become impossible.

Need to warn about module patterns
that do not match with anything.

The pattern can match the name of a module built into
the kernel as given by modprobe.
However, modprobe can fix some incorrect patterns.
These patterns should also be reported.
2020-12-18 20:38:54 +04:00
Evgeny Sinelnikov
7fb55b0d80 20190829-alt1
- fix hangs until http socket not closed on server side (closes: #37150)
- tools.c: break reading cycle if we actually loaded program into memory
- url.c, network.c: disable keep-alive and close http socket after downloading
2019-09-03 17:31:04 +04:00
Evgeny Sinelnikov
d39b85ae32 tools.c: break reading cycle if we actually loaded program into memory 2019-09-03 17:31:03 +04:00
Evgeny Sinelnikov
111d828c45 network.c, url.c: disable keep-alive and close http socket after downloading
With default Connection: keep-alive and without closing read socket after
downloading stage2 propagator hangs until socket not closed on server side.
2019-09-03 17:30:52 +04:00
0d3ff4dabd 20190418-alt1
- compile with _FILE_OFFSET_BITS=64
2019-04-18 12:00:06 +03:00
Leonid Krivoshein
b4917948fe 20181117-alt1
- probing.c: added support for SD-cards when boot in LiveCD-mode
2018-11-17 22:53:22 +03:00
Evgeny Sinelnikov
a352e62521 20180822-alt1
- add support cifs install method
- replace HTTP request version from 1.0 to 1.1
- increase DHCP tries and timeouts for DISCOVER request
2018-08-22 20:11:28 +04:00
Evgeny Sinelnikov
59a9c4de30 add support of cifs network install method 2018-08-22 20:08:23 +04:00
Evgeny Sinelnikov
95bfcf8542 replace HTTP request version to 1.1 2018-08-22 20:08:23 +04:00
Evgeny Sinelnikov
8c1beeb584 DHCP: fixed timeout for DISCOVER request 2018-08-22 20:08:23 +04:00
Arseny Maslennikov
41bb05e67e 20180606-alt1
- dhcp.c: Remove temporary default route properly (altbug:#34347).
- dhcp.c: Provide DHCP vendor class identifier in requests (altbug:#34320).
  This behaviour can be reverted with a kernel command line parameter.
2018-06-09 18:32:06 +03:00
Arseny Maslennikov
6ce39ab483 dhcp.c: Remove temporary default route properly
DHCP is implemented in propagator in a rather lazy way:
to dynamically configure a network interface, say `eno1',
instead of slinging raw Ethernet frames around like everyone else,
it sets up a (temporary) default null route through that interface
and throws UDP messages with actual bootp payload.

`ip' utility describes such a route as `default dev eno1 scope link'

The idea behind this presumably was to avoid generating IP and UDP
headers manually while the null route is sufficient to send a couple of
link-wide (maybe broadcast) messages and generic enough to work anywhere.

To this date propagator didn't bother to remove that route,
so *in some networks* it had persisted even after the initramfs
(and propagator itself) was long gone, and in other networks did not,
having been luckily replaced by the default route to DHCP gateway.

In the cases where it did the real problem showed itself
after the real userspace (for example, in a live distro)
eventually tried to reconfigure the network (because why not?).
The pesky null route was most often left untouched by the DHCP client
(ALT live distros mostly use dhcpcd), managing to squeeze its way
up the routing table and effectively preventing the host
from network access beyond a router.

If the NFS root is behind a couple routers, any attempt to access
the file system gets stuck — the system keeps tirelessly looking for
the NFS host via ARP.
2018-06-09 18:27:06 +03:00
Arseny Maslennikov
dfa3713d0f dhcp.c: Provide an option to omit the vendor class
Some obsolete DHCP implementations in specialized network hardware
(Cisco, we're looking at you) discard DHCP messages from a client
attempting to reconfigure itself and providing a different vendor class
identifier the second time — much like a network-booting system.

To cope with that, propagator will not send a vendor class identifier
if `dhcp-send-vendor-id:off' is specified as part of its "automatic"
parameters on the kernel command line.
Feel free to use any boolean value: yes/no, true/false, on/off.
The default behaviour is "yes".
2018-06-09 18:27:00 +03:00
Arseny Maslennikov
41519b564d dhcp.c: Provide a DHCP vendor class identifier in requests 2018-06-06 23:40:28 +03:00
Arseny Maslennikov
2440a17fbe Remove unnecessary whitespace from C program text 2018-05-09 15:21:26 +03:00
Leonid Krivoshein
bb48084aa0 20180423-alt1
- New udev control logic imported from make-initrd scripts.
- Udev-trigger replaced to udev-settle() in hardware wait loops.
- All udev control code moved from init.c to new udev.c module.
- Lazy initialization mode support added for work in cooperate
  with make-initrd: this is experimental future, turned off by
  default, and also required patched make-initrd-propagator.
- disk.c, cdrom.c: 15 attempts with udev-settle() calls.
- network.c: bridge up algorithm reviewed, fixed memory leaks.
- network.c: 15 attempts to select and wait network interface;
- probing.c, probing.h, dhcp.c: small fixes, now black list used.
- modules_descr.h, stage1.c: deprecated header, unused code removed.
- dhcp.c: fix potentially destructive typo (closes: #34322),
  thanks to Arseny Maslennikov <arseny@altlinux.org>.
- Workaround race conditions during disks detection (closes: #30315).
- Workaround race conditions during bridging up network interfaces,
  see: https://bugzilla.altlinux.org/show_bug.cgi?id=34347 and
  https://lists.altlinux.org/pipermail/sysadmins/2018-April/date.html
  (about "No network Devices found" error message).
- Multiple small code improvements, fixes for avoid memory leaks
  and suppress compiler warnings.
2018-04-23 01:23:23 +03:00
Leonid Krivoshein
8c4366e9c6 network.c: protect from buffer overflow.
This change also suppress a compiler warning:

network.c:307:18: warning: '%d' directive writing between
1 and 11 bytes into a region of size 3 [-Wformat-overflow=]
2018-04-22 20:27:51 +03:00
Leonid Krivoshein
870d181ace mount.c: header added for suppress warning. 2018-04-22 20:14:14 +03:00