1# Linux initrd integration test. 2# 3# Copyright (c) 2018 Red Hat, Inc. 4# 5# Author: 6# Wainer dos Santos Moschetta <wainersm@redhat.com> 7# 8# This work is licensed under the terms of the GNU GPL, version 2 or 9# later. See the COPYING file in the top-level directory. 10 11import os 12import logging 13import tempfile 14 15from avocado_qemu import QemuSystemTest 16from avocado import skipIf 17 18 19class LinuxInitrd(QemuSystemTest): 20 """ 21 Checks QEMU evaluates correctly the initrd file passed as -initrd option. 22 23 :avocado: tags=arch:x86_64 24 :avocado: tags=machine:pc 25 """ 26 27 timeout = 300 28 29 def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): 30 """ 31 Pretends to boot QEMU with an initrd file with size of 2GiB 32 and expect it exits with error message. 33 Fedora-18 shipped with linux-3.6 which have not supported xloadflags 34 cannot support more than 2GiB initrd. 35 """ 36 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora/li' 37 'nux/releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz') 38 kernel_hash = '41464f68efe42b9991250bed86c7081d2ccdbb21' 39 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 40 max_size = 2 * (1024 ** 3) - 1 41 42 with tempfile.NamedTemporaryFile() as initrd: 43 initrd.seek(max_size) 44 initrd.write(b'\0') 45 initrd.flush() 46 self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name, 47 '-m', '4096') 48 self.vm.set_qmp_monitor(enabled=False) 49 self.vm.launch() 50 self.vm.wait() 51 self.assertEqual(self.vm.exitcode(), 1) 52 expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( 53 max_size + 1) 54 self.assertRegex(self.vm.get_log(), expected_msg) 55 56 @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') 57 def test_with_2gib_file_should_work_with_linux_v4_16(self): 58 """ 59 QEMU has supported up to 4 GiB initrd for recent kernel 60 Expect guest can reach 'Unpacking initramfs...' 61 """ 62 kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' 63 '/linux/releases/28/Everything/x86_64/os/images/pxeboot/' 64 'vmlinuz') 65 kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a' 66 kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 67 max_size = 2 * (1024 ** 3) + 1 68 69 with tempfile.NamedTemporaryFile() as initrd: 70 initrd.seek(max_size) 71 initrd.write(b'\0') 72 initrd.flush() 73 74 self.vm.set_console() 75 kernel_command_line = 'console=ttyS0' 76 self.vm.add_args('-kernel', kernel_path, 77 '-append', kernel_command_line, 78 '-initrd', initrd.name, 79 '-m', '5120') 80 self.vm.launch() 81 console = self.vm.console_socket.makefile() 82 console_logger = logging.getLogger('console') 83 while True: 84 msg = console.readline() 85 console_logger.debug(msg.strip()) 86 if 'Unpacking initramfs...' in msg: 87 break 88 if 'Kernel panic - not syncing' in msg: 89 self.fail("Kernel panic reached") 90