xref: /qemu/tests/functional/test_linux_initrd.py (revision 3d5938607e05c4f8ac6df046a92fad19b681c23b)
18dcac1cfSThomas Huth#!/usr/bin/env python3
28dcac1cfSThomas Huth#
3bbbd9b6eSWillian Rampazzo# Linux initrd integration test.
482d4c923SWainer dos Santos Moschetta#
582d4c923SWainer dos Santos Moschetta# Copyright (c) 2018 Red Hat, Inc.
682d4c923SWainer dos Santos Moschetta#
782d4c923SWainer dos Santos Moschetta# Author:
882d4c923SWainer dos Santos Moschetta#  Wainer dos Santos Moschetta <wainersm@redhat.com>
982d4c923SWainer dos Santos Moschetta#
1082d4c923SWainer dos Santos Moschetta# This work is licensed under the terms of the GNU GPL, version 2 or
1182d4c923SWainer dos Santos Moschetta# later.  See the COPYING file in the top-level directory.
1282d4c923SWainer dos Santos Moschetta
138f1c89ecSLi Zhijianimport logging
1482d4c923SWainer dos Santos Moschettaimport tempfile
1582d4c923SWainer dos Santos Moschetta
16*3d593860SDaniel P. Berrangéfrom qemu_test import QemuSystemTest, Asset, skipFlakyTest
1782d4c923SWainer dos Santos Moschetta
1882d4c923SWainer dos Santos Moschetta
192283b627SPhilippe Mathieu-Daudéclass LinuxInitrd(QemuSystemTest):
2082d4c923SWainer dos Santos Moschetta    """
2182d4c923SWainer dos Santos Moschetta    Checks QEMU evaluates correctly the initrd file passed as -initrd option.
2282d4c923SWainer dos Santos Moschetta    """
2382d4c923SWainer dos Santos Moschetta
248f1c89ecSLi Zhijian    timeout = 300
2582d4c923SWainer dos Santos Moschetta
268dcac1cfSThomas Huth    ASSET_F18_KERNEL = Asset(
278dcac1cfSThomas Huth        ('https://archives.fedoraproject.org/pub/archive/fedora/linux/'
288dcac1cfSThomas Huth         'releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz'),
298dcac1cfSThomas Huth        '1a27cb42559ce29237ac186699d063556ad69c8349d732bb1bd8d614e5a8cc2e')
308dcac1cfSThomas Huth
318dcac1cfSThomas Huth    ASSET_F28_KERNEL = Asset(
328dcac1cfSThomas Huth        ('https://archives.fedoraproject.org/pub/archive/fedora/linux/'
338dcac1cfSThomas Huth         'releases/28/Everything/x86_64/os/images/pxeboot/vmlinuz'),
348dcac1cfSThomas Huth        'd05909c9d4a742a6fcc84dcc0361009e4611769619cc187a07107579a035f24e')
358dcac1cfSThomas Huth
363c7156fdSLi Zhijian    def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self):
3782d4c923SWainer dos Santos Moschetta        """
3882d4c923SWainer dos Santos Moschetta        Pretends to boot QEMU with an initrd file with size of 2GiB
3982d4c923SWainer dos Santos Moschetta        and expect it exits with error message.
403c7156fdSLi Zhijian        Fedora-18 shipped with linux-3.6 which have not supported xloadflags
413c7156fdSLi Zhijian        cannot support more than 2GiB initrd.
4282d4c923SWainer dos Santos Moschetta        """
438dcac1cfSThomas Huth        self.set_machine('pc')
448dcac1cfSThomas Huth        kernel_path = self.ASSET_F18_KERNEL.fetch()
4582d4c923SWainer dos Santos Moschetta        max_size = 2 * (1024 ** 3) - 1
4682d4c923SWainer dos Santos Moschetta
4782d4c923SWainer dos Santos Moschetta        with tempfile.NamedTemporaryFile() as initrd:
4882d4c923SWainer dos Santos Moschetta            initrd.seek(max_size)
4982d4c923SWainer dos Santos Moschetta            initrd.write(b'\0')
5082d4c923SWainer dos Santos Moschetta            initrd.flush()
51c80c6bebSWainer dos Santos Moschetta            self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name,
52c80c6bebSWainer dos Santos Moschetta                             '-m', '4096')
53c80c6bebSWainer dos Santos Moschetta            self.vm.set_qmp_monitor(enabled=False)
54c80c6bebSWainer dos Santos Moschetta            self.vm.launch()
55c80c6bebSWainer dos Santos Moschetta            self.vm.wait()
56c80c6bebSWainer dos Santos Moschetta            self.assertEqual(self.vm.exitcode(), 1)
5782d4c923SWainer dos Santos Moschetta            expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % (
5882d4c923SWainer dos Santos Moschetta                max_size + 1)
59c80c6bebSWainer dos Santos Moschetta            self.assertRegex(self.vm.get_log(), expected_msg)
608f1c89ecSLi Zhijian
61*3d593860SDaniel P. Berrangé    # XXX file tracking bug
62*3d593860SDaniel P. Berrangé    @skipFlakyTest(bug_url=None)
638f1c89ecSLi Zhijian    def test_with_2gib_file_should_work_with_linux_v4_16(self):
648f1c89ecSLi Zhijian        """
658f1c89ecSLi Zhijian        QEMU has supported up to 4 GiB initrd for recent kernel
668f1c89ecSLi Zhijian        Expect guest can reach 'Unpacking initramfs...'
678f1c89ecSLi Zhijian        """
688dcac1cfSThomas Huth        self.set_machine('pc')
698dcac1cfSThomas Huth        kernel_path = self.ASSET_F28_KERNEL.fetch()
708f1c89ecSLi Zhijian        max_size = 2 * (1024 ** 3) + 1
718f1c89ecSLi Zhijian
728f1c89ecSLi Zhijian        with tempfile.NamedTemporaryFile() as initrd:
738f1c89ecSLi Zhijian            initrd.seek(max_size)
748f1c89ecSLi Zhijian            initrd.write(b'\0')
758f1c89ecSLi Zhijian            initrd.flush()
768f1c89ecSLi Zhijian
778f1c89ecSLi Zhijian            self.vm.set_console()
788f1c89ecSLi Zhijian            kernel_command_line = 'console=ttyS0'
798f1c89ecSLi Zhijian            self.vm.add_args('-kernel', kernel_path,
808f1c89ecSLi Zhijian                             '-append', kernel_command_line,
818f1c89ecSLi Zhijian                             '-initrd', initrd.name,
828f1c89ecSLi Zhijian                             '-m', '5120')
838f1c89ecSLi Zhijian            self.vm.launch()
848f1c89ecSLi Zhijian            console = self.vm.console_socket.makefile()
858f1c89ecSLi Zhijian            console_logger = logging.getLogger('console')
868f1c89ecSLi Zhijian            while True:
878f1c89ecSLi Zhijian                msg = console.readline()
888f1c89ecSLi Zhijian                console_logger.debug(msg.strip())
898f1c89ecSLi Zhijian                if 'Unpacking initramfs...' in msg:
908f1c89ecSLi Zhijian                    break
918f1c89ecSLi Zhijian                if 'Kernel panic - not syncing' in msg:
928f1c89ecSLi Zhijian                    self.fail("Kernel panic reached")
938dcac1cfSThomas Huth
948dcac1cfSThomas Huthif __name__ == '__main__':
958dcac1cfSThomas Huth    QemuSystemTest.main()
96