From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 7202184025122799616 X-Received: by 2002:a0c:e210:0:b0:56b:eea2:f8ff with SMTP id q16-20020a0ce210000000b0056beea2f8ffmr280908qvl.46.1676892277373; Mon, 20 Feb 2023 03:24:37 -0800 (PST) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a05:622a:2281:b0:3bc:edc5:2588 with SMTP id ay1-20020a05622a228100b003bcedc52588ls951683qtb.6.-pod-prod-gmail; Mon, 20 Feb 2023 03:24:36 -0800 (PST) X-Google-Smtp-Source: AK7set8puRY/G9Cc5zTz+1QSbXgggHu8uZ9j3L6hcq0wanyLhezJ3eGQoZwTgpAclsJUiABhjpgx X-Received: by 2002:a05:622a:1056:b0:3bb:7c6b:9cb5 with SMTP id f22-20020a05622a105600b003bb7c6b9cb5mr14350571qte.27.1676892276732; Mon, 20 Feb 2023 03:24:36 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1676892276; cv=pass; d=google.com; s=arc-20160816; b=RVPffFah+E2s04p5R2W1+7D/boos2hCR462telGKxVt9rwFDUKIL6lHQIJb7J7gpFI L2cz1slkVZ/KQVrg3UWDqLfanAVnDdop4AKUt4NQV5gprPBuzRWrIw3m6snPxDN95cmV w0npBOUReg3sAleSSPXQCbjaqE+TEZa2gVta4Nbkp6LP/rF0O8LQCBoNIaeLTOwe+IQK 2npb+rUYbcsY1qKsCbYGOBau9meORnYdmYNXdOdTAj7DyYKE9DcAZNpFf0abSSxxJvI+ pMW9evqGO9e91s/X9oJzDJ6ftszAGO6kZQeBonBKGAVrWPch5Pc7YIZduliLiCx8991K a0Bg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:content-transfer-encoding:in-reply-to:from:references :to:content-language:subject:user-agent:date:message-id :dkim-signature; bh=sb6XGx5VFjcRuEri6yq9VbRWiiqMyv8h24JlFbDCkuQ=; b=RSNN/7mm9aKvHJZefKyUdom/skZ5DDPNrrkuaVUpdjS2u4LKC+Pjg4QneyR/4jGmDV f6y7zbaiiwkkCAqW6Q2nA2SstArRN5TmqtuAhVXXeoZ1W0uKBkNlidj93f5sSLD6ZJPl ljhJTXgePUFTcrsNxRq65AzYj5KIpQF4WQyEXuLSI5RVwPokNlXS0lrKjz8P5Kbt6moo +wtkp1T5Rl4JJErbYGVHeX/08utVHJRlB0h8Acf9Pg7OOkeNrUOMHlFrSyVZMrxxBnQi AQmazaLl3Do0tWjFiO1IAu78+Cl0pZKpNLaO3lPwWP4RzaNvY8MluCRMcLmXCxL6mXxt w1GQ== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=selector2 header.b="QnS/F45M"; arc=pass (i=1 spf=pass spfdomain=siemens.com dkim=pass dkdomain=siemens.com dmarc=pass fromdomain=siemens.com); spf=pass (google.com: domain of jan.kiszka@siemens.com designates 2a01:111:f400:fe0c::60d as permitted sender) smtp.mailfrom=jan.kiszka@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Return-Path: Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04on060d.outbound.protection.outlook.com. [2a01:111:f400:fe0c::60d]) by gmr-mx.google.com with ESMTPS id fv7-20020a05622a4a0700b003b82ce6a004si61951qtb.4.2023.02.20.03.24.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 Feb 2023 03:24:36 -0800 (PST) Received-SPF: pass (google.com: domain of jan.kiszka@siemens.com designates 2a01:111:f400:fe0c::60d as permitted sender) client-ip=2a01:111:f400:fe0c::60d; Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=selector2 header.b="QnS/F45M"; arc=pass (i=1 spf=pass spfdomain=siemens.com dkim=pass dkdomain=siemens.com dmarc=pass fromdomain=siemens.com); spf=pass (google.com: domain of jan.kiszka@siemens.com designates 2a01:111:f400:fe0c::60d as permitted sender) smtp.mailfrom=jan.kiszka@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OKFd98EqyyG122fbJTHjWN0H0Nw5/zG1AmIxl7kSDMPmrHFPpAnJ7xhcHorm8FBFE1Pue/hfKBM8jFZgEnnfc4CzIObqAG6jIHgLXUNYD+nydX1MnIUfwZBW0NiTgxesgmwSVANdMcAzGZMJW8/RiCkNoB9GShLl5tFxPcyYii7acLrOUFgAuU3Hj1nF3fGLJ8Ix1ioqDb3160bJyZFmDwGxeUI5Z5QTacYYCiSerJRvlATuoxO9NwECJV3HLKueSB7R04b4dkSDsqKYlIS37MHAltiZLdM8imGB+2t5ZfM3rBUE3vEwnM26U+ADTtOsEQJmd/Wk/7B0vP5g4S1sYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=sb6XGx5VFjcRuEri6yq9VbRWiiqMyv8h24JlFbDCkuQ=; b=Jl+5Ss4DG+cSpTXcqZftyNr+HgaYsLYjKW/3bDfzFsdnBrbEh8wQFqm14kXnx+J1hshD1cZbEtff3zY0dWude8P5tw90z9rTxTzBvInhivYGQJu6NyCS5t37gdTRm0EeCxRn6CK2pflS+XoGYS8afVpNy2U1zfvJOErncpaQgIw49sxKb0Jts+PqkxJEsPkCnIijBFHn7CvRClU7Ib7hiP2W/r1uEmrOnWWznOnrMZvlzbDrTsLZJqPbxPwRG4vaIBzu8sirUOan6sgAaddrTgchrabirVAivmyryOyUmwbPiG0nhSHcRZhtv/IpNUjLl+fI3w+I3n1UczwfWxF7og== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siemens.com; dmarc=pass action=none header.from=siemens.com; dkim=pass header.d=siemens.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=siemens.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sb6XGx5VFjcRuEri6yq9VbRWiiqMyv8h24JlFbDCkuQ=; b=QnS/F45MXIDDQjdqA2kNJ2VZtooSn0OgL7qoqv7eLPb6cXQyRkRvLfplt8HMKzSVuxPIUJzlwRsaMJty8ai8K0suDIcY6DmwT4Ey5ZTni8ScCpKrqXbYlJMW6ekarx8ZRyT+mzOtH613Ymehib7JuBFrbM7xudgCurcP9OhsuyvZjM23Vw3QTwh0k9A7nXlt0qtJijHwpPLLXBpaVv5e1d2+lqSJtleoIJ3GWnmWCiyMM+gLc+xYyIkTJb13/4qRUp4eWtccNXtZgOVCqeLo9EcJOgAb8+1K5MZFH0+0r/rUfi3pNdMZB/h+6IPutD1b20l4jzp2S17d3+TaZ61H6w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=siemens.com; Received: from AS4PR10MB6181.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:588::19) by AS8PR10MB7476.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5af::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6111.19; Mon, 20 Feb 2023 11:24:31 +0000 Received: from AS4PR10MB6181.EURPRD10.PROD.OUTLOOK.COM ([fe80::784b:e95b:b855:dcc5]) by AS4PR10MB6181.EURPRD10.PROD.OUTLOOK.COM ([fe80::784b:e95b:b855:dcc5%9]) with mapi id 15.20.6111.019; Mon, 20 Feb 2023 11:24:31 +0000 Message-ID: <6f1b6c04-8b4a-5534-0ec5-e6258f436c49@siemens.com> Date: Mon, 20 Feb 2023 12:24:29 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 Subject: Re: [PATCH] add support for rebuilding essential packages Content-Language: en-US To: Adriaan Schmidt , isar-users@googlegroups.com References: <20230220103214.2704911-1-adriaan.schmidt@siemens.com> From: Jan Kiszka In-Reply-To: <20230220103214.2704911-1-adriaan.schmidt@siemens.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR0P281CA0132.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:97::14) To AS4PR10MB6181.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:588::19) Return-Path: jan.kiszka@siemens.com MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR10MB6181:EE_|AS8PR10MB7476:EE_ X-MS-Office365-Filtering-Correlation-Id: c409ddd6-1648-4b36-1321-08db13350971 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /j5XCRQcjsqFAL2M7IbXbzknNDwqKYx+NCP2rfBIyb4S/RneRsODLtRNPkQtiM6VFbrDHVfnl1XGAW3MwfUlW7xaYZIY/H4AQY0e3aD1Bo5ftxrQPPO2PN/E9LnMXGsWCp1j0RvKG7J4b05u3pi6uBBZ4dTp8zttIZmrn0aJIaOuDWrWmMfzQv9oCOMtT6pZAUGFjNj8ORK1zm/oDPkLUrf07CgJJvOB84BWuke/wg4hiUt+PPe0CCej+JrIocqxgEqGFgYExIMqN1rwKfxrLSzYhLE4bO+S9wAE/z8LoQhEyoOdUDdXb0u+1k9BXj5V/3v8JC+JjtBZCTzO9QSdd25f+r4Zeg5cZUWwXn0yP8ByjSUMMn3Qeze5CHz2x4CkLmuSmjBYRk3XTFpi0pc7txDjdnLDiisnVamH8ujBkToRtjaCZvuVXHpfu4CSZILVd5ZZ1R5D5fRmA5udkU1qKFxvCgvrLKEmwaFw7z+OXliuB6whNa1uIC/uwmHhMGqEZ5YxDBcq11toFIPAvzjH8ZDzFcrHAuO1ODSyl8S5gN5PdPicHPwWOOc9RaJrOlAP6zhIfUWaXJlKBMtcUH768QPzX0Fagby9oZ1dQQIfsbeYs3brCGs3w9IF6cRJEdaFEUiyAbxjLHqJmFul/+KrHFjfxPojS4oGbXx5RLgeRQEOov3ORM7o8Gk2pvZn9M4VlPF5943B9Dez5IB4SPqN1gahmCr5GqOD68+dQVTknsU= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR10MB6181.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230025)(4636009)(39860400002)(136003)(396003)(376002)(346002)(366004)(451199018)(86362001)(36756003)(38100700002)(31696002)(6506007)(478600001)(8676002)(6486002)(53546011)(41300700001)(26005)(186003)(316002)(6512007)(2616005)(66556008)(66476007)(66946007)(44832011)(5660300002)(8936002)(2906002)(82960400001)(31686004)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?R0VvRFlkUUR6Tk5ReUh0bjZIVnlVT0RIR0FqNEg5SVlrWXJEUEgxMjZ3eFFx?= =?utf-8?B?TE1LTU9Pb3ZybUdCcnI0dnFWZjNiQXZKTFMzZnNPTktJSHlCQU1uYjVEc0Fj?= =?utf-8?B?ZXZqZXdSc0JJT1hERzJ6VzF0Y01xd0RkUVVhMU5tNkw2N0FPQlNwKy9yZnN6?= =?utf-8?B?MGU2VlhodXZXYWZoS2JtU2dwZWVyQ1FMS0NOWXJOdzg3b2cwRWJPbHM5cllH?= =?utf-8?B?VDlTSGErOWo1bDVpbzIyd3dkNEZSa2tncWJmVU9DNU4wcko1TDlralhSYmxS?= =?utf-8?B?YVN4blJxSzdvRFM1Y2NpYzEwdzVHRFREZXE5V3o1bGJab1lPMlgzcGlyUmxh?= =?utf-8?B?dDZoZjJoTlBHUk96WW80d283WTBZcytzTGp6QUVFME9lVTFZV21DeGw3cmFW?= =?utf-8?B?RWtDSmhmOVd2bXRhZCt3Y0NTYkIyQWx0MFZvdGFDL0dDdHhXR3UxNUVIUml3?= =?utf-8?B?QXhLSGhpSUpIZWwvZVlpYXh0d0VCZEpwYnBldy9zaGlINWRHckNPbkpXbzcw?= =?utf-8?B?M0tWK2k2ZmxGZWYzWVlTTHE2NWtCRllkWGRRemtJL3VXVGx6aHZYSW1vZFFN?= =?utf-8?B?Y1BKLzdCb1FpaXdtUkw1MVVKdTh1SUw4dWlUeGREUW0wYWhvekkzVVVIMzA2?= =?utf-8?B?YnNIRWJGRmNLajN0RFQ0eVBmWnE3TXhtcDBaczVZZU1YN1lHazdqY1hCajF5?= =?utf-8?B?K25PZUczOEtRZzFEaVVrR25MNjlLU3N3cDArcCtBOU5JQVI2UStLNFlUNU9J?= =?utf-8?B?SVBUdEI2L1dsbmNUMWhzUTB2WHlSeWEveU9ZT3RHNTlKYnhSb08xcmJvNHll?= =?utf-8?B?MHYvaloxV0pudmh5SVFUQ1BaQTZlMndjZCs3VmhnUHAwM3BRaDdiVU5TL2Rh?= =?utf-8?B?OVUxTlQ1Yld0VXRlcmhOeFd5S25GNlVYd3BucWpld1ZxOExQZHpxc1JLazZs?= =?utf-8?B?U1lTbVFWZW1jblgvM2Fqbk5lenJzYXBpTkdvbXdJaHJQMWJUMUE4TGxmc0E0?= =?utf-8?B?NlNxVDJ0bmdJZDNhMTdkZUs3TmJZQlhkVHc5UnRsanZMNzNjWEZBV0swV0tL?= =?utf-8?B?TzVVKzRuVWVUYXdmZGV5V2xxQUt0VjRuQ2V4TGpYSm1Kak05L2pzRXNWbXBR?= =?utf-8?B?SDYrOHY3TEU5Y05nTXFyTGF6dnZvczNhcHNUbFJicmFRaVd5MnRrby91eEtR?= =?utf-8?B?d3o4a3kvWTA5L0hnVUxCVTRQQVQzTHVCOGJEUGoyNm42RjROeHliaUlVQTla?= =?utf-8?B?NWVqZGR5SzZNeEU4QmtOMk5ZK1l1bUs3NDRZTVRFVENDblcrcHllRnBuTndR?= =?utf-8?B?Y2laRlJhVk9mTXovM2IwVzRFaHZaZExzMzhEOGQ5dFJjZHdBUm1vOXp0a0dM?= =?utf-8?B?NG1ZSHZ4aE1EdGRpeGdqRlR0c29HaGlXallSVHdHZjBRZ0xQVDA0a2ZlL2tm?= =?utf-8?B?MTFaMi8reEw5TUh2YTdpb1NTdGtlTmJFZDZLZjNPMTZ3ZlJBT28yVmxBZzdG?= =?utf-8?B?ZlpkTlJZMy8ralpqZXdvNWMxT3JaWnBaRE1qdWpHSlZza0FFZnZwRFlGdU9V?= =?utf-8?B?dTAzOHdndFJpQnlPQmZENURzOUlRNm9LdTNBc3h4YkZXWmZMT1JlWFhWaUJZ?= =?utf-8?B?SkxlditPTXFUQTF3a2NKQ29Da0xNR1FldXZud3NHRmRvRjZ5Mnk3RTE0NzRP?= =?utf-8?B?RU51aU5pWEdkdTEvaUZlN1dLT3FtWkF1UGtjZ2YxbWI5cFdRcFN4RWVXV1ZG?= =?utf-8?B?WFcrT2ZCMTlvZUxwTUFxKzN3cGJOMDd2YlJPYlFYZ0ljNEQyV20yOUNkMnlz?= =?utf-8?B?SFE2eGx5WFoxYVdHTENpN0FBa2tsYkpWa3BBTWJ1bitUV3YxQnRtZFBWSXQ2?= =?utf-8?B?ejF6QXhyaXUvVmFQZG5xbnBQR0JoTUp1citoenRqZ1ZqMGlPRytGTytNb1hR?= =?utf-8?B?WTNtSldwZ3FQdWNRVFh1RnlxUS9mR3BVOTJQMVZhTHFXclVKN2NhUGZlOU54?= =?utf-8?B?VzMwZWRQZ0UvakVQcERhbTUwOFg1Rlk0ZTY0V2dGSTlXek5jb0dxbElpRXBO?= =?utf-8?B?YWpSaEl0NWhnb1ZuK0Myd1gyUytKRWo3UEM5cDRaRnhuN09hNitrbjBvRVU3?= =?utf-8?B?NWY3YVNMcWFVNXVKbUFiUGhQMStZT0FScFRYTkM5SlZUbk83QW4yMFVjK2hj?= =?utf-8?B?aHc9PQ==?= X-OriginatorOrg: siemens.com X-MS-Exchange-CrossTenant-Network-Message-Id: c409ddd6-1648-4b36-1321-08db13350971 X-MS-Exchange-CrossTenant-AuthSource: AS4PR10MB6181.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Feb 2023 11:24:31.7063 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 38ae3bcd-9579-4fd4-adda-b42e1495d55a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Loe/8DzFBCe3SSVt8mBQHIca0NfS+T4uAq2yelwvp6DUHl16nW4ub0nsSHG+FUgx6DGZ0ONFHzV5rOMA1RKrcg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR10MB7476 X-TUID: Q79SFAGeY4h5 On 20.02.23 11:32, Adriaan Schmidt wrote: > There are cases when we need to rebuild a package that is installed during > bootstrap (we call those "essential package" here). This patch introduces > `ISAR_REBUILD_ESSENTIAL_PKGS` which can be set in (distro/layer) config, and > lists all essential packages. > > During build, Isar ensures that essential packages are built before any others, > so that their locally built versions are available in isar-apt, and will > be used in any subsequent package builds. > > Signed-off-by: Adriaan Schmidt > > --- > This has interdependencies with the proposed multiarch feature, > and builds on v2 of that series. > > Adriaan > --- > meta/classes/dpkg-base.bbclass | 1 + > meta/classes/essential.bbclass | 39 ++++++++++++++++++++++++++++++++++ > meta/classes/image.bbclass | 1 + > 3 files changed, 41 insertions(+) > create mode 100644 meta/classes/essential.bbclass > > diff --git a/meta/classes/dpkg-base.bbclass b/meta/classes/dpkg-base.bbclass > index 55cc6655..ce301346 100644 > --- a/meta/classes/dpkg-base.bbclass > +++ b/meta/classes/dpkg-base.bbclass > @@ -10,6 +10,7 @@ inherit debianize > inherit terminal > inherit repository > inherit deb-dl-dir > +inherit essential > > DEPENDS ?= "" > RPROVIDES ?= "${PROVIDES}" > diff --git a/meta/classes/essential.bbclass b/meta/classes/essential.bbclass > new file mode 100644 > index 00000000..cb444674 > --- /dev/null > +++ b/meta/classes/essential.bbclass > @@ -0,0 +1,39 @@ > +# This software is a part of ISAR. > +# Copyright (C) 2023 Siemens AG > + > +ISAR_REBUILD_ESSENTIAL_PKGS ?= "" > + > +python() { > + isar_rebuild_essential_pkgs = (d.getVar('ISAR_REBUILD_ESSENTIAL_PKGS', True) or '').split() > + build_compat = d.getVar('ISAR_ENABLE_COMPAT_ARCH', True) == "1" > + build_native = not d.getVar('DISTRO_ARCH', True) == d.getVar('HOST_ARCH') > + > + # construct list of essential packages that should be rebuilt: > + # if we can't build compat, don't include any -compat packages > + # if we don't need native (because DISTRO_ARCH == HOST_ARCH), don't build native > + # otherwise, automatically include compat/native when we can build them > + essential_packages = [] > + for p in isar_rebuild_essential_pkgs: > + if p.endswith('-compat') and build_compat: > + essential_packages.append(p) > + elif p.endswith('-native') and build_native: > + essential_packages.append(p) > + else: > + essential_packages.append(p) > + if build_compat: > + essential_packages.append(f'{p}-compat') > + if build_native: > + essential_packages.append(f'{p}-native') > + > + # bail out if this recipe is in the essential list > + if d.getVar('PN') in essential_packages: > + return > + > + # add dependencies to all packages from the essential list > + for p in essential_packages: > + if d.getVar('do_prepare_build'): > + d.appendVarFlag('do_prepare_build', 'depends', f' {p}:do_deploy_deb') > + if d.getVar('do_install_rootfs'): > + d.appendVarFlag('do_install_rootfs', 'depends', f' {p}:do_deploy_deb') > +} > + .git/rebase-apply/patch:69: new blank line at EOF. > diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass > index ce7c549c..550785ea 100644 > --- a/meta/classes/image.bbclass > +++ b/meta/classes/image.bbclass > @@ -80,6 +80,7 @@ image_do_mounts() { > } > > inherit multiarch > +inherit essential > > ROOTFSDIR = "${IMAGE_ROOTFS}" > ROOTFS_FEATURES += "clean-package-cache clean-pycache generate-manifest export-dpkg-status clean-log-files clean-debconf-cache" Under test... Jan -- Siemens AG, Technology Competence Center Embedded Linux