Linux 核心許可規則¶
Linux 核心根據 GNU 通用公共許可證第 2 版(GPL-2.0)的條款提供,詳見 LICENSES/preferred/GPL-2.0 檔案;並附帶在 LICENSES/exceptions/Linux-syscall-note 中描述的明確的系統呼叫(syscall)例外,如 COPYING 檔案所述。
本檔案描述瞭如何為每個原始檔添加註釋,以使其許可證清晰明確。它不取代核心的許可證。
COPYING 檔案中描述的許可證適用於整個核心原始碼,儘管單個原始檔可以擁有不同的許可證,但該許可證必須與 GPL-2.0 相容。
GPL-1.0+ : GNU General Public License v1.0 or later
GPL-2.0+ : GNU General Public License v2.0 or later
LGPL-2.0 : GNU Library General Public License v2 only
LGPL-2.0+ : GNU Library General Public License v2 or later
LGPL-2.1 : GNU Lesser General Public License v2.1 only
LGPL-2.1+ : GNU Lesser General Public License v2.1 or later
除此之外,單個檔案可以採用雙重許可,例如相容的 GPL 變體之一,或者採用 BSD、MIT 等寬鬆許可。
使用者空間 API (UAPI) 標頭檔案是特殊情況,它們描述了使用者空間程式與核心的介面。根據核心 COPYING 檔案中的說明,系統呼叫介面是一個清晰的邊界,它不會將 GPL 要求擴充套件到任何使用該介面與核心通訊的軟體。由於 UAPI 標頭檔案必須能夠被包含到任何生成在 Linux 核心上執行的可執行檔案的原始檔中,因此該例外必須透過特殊的許可證表示式進行記錄。
表達原始檔許可證的常見方式是在檔案頂部的註釋中新增匹配的樣板文字。由於格式、拼寫錯誤等原因,這些“樣板文字”對於用於許可證合規性檢查的工具來說很難驗證。
樣板文字的替代方案是在每個原始檔中使用軟體包資料交換 (SPDX) 許可證識別符號。SPDX 許可證識別符號是機器可解析的精確縮寫,用於表示檔案內容所依據的許可證。SPDX 許可證識別符號由 Linux 基金會的 SPDX 工作組管理,並已獲得行業合作伙伴、工具供應商和法律團隊的同意。欲瞭解更多資訊,請參閱 https://spdx.org/
Linux 核心要求所有原始檔中都包含精確的 SPDX 識別符號。核心中使用的有效識別符號在許可識別符號一節中解釋,並已從官方 SPDX 許可證列表 https://spdx.org/licenses/ 以及許可證文字中獲取。
許可識別符號語法¶
放置位置
核心檔案中的 SPDX 許可證識別符號應新增到檔案中可能包含註釋的第一行。對於大多數檔案來說,這是第一行,但指令碼除外,因為指令碼的第一行需要 ‘#!PATH_TO_INTERPRETER’。對於這些指令碼,SPDX 識別符號應放在第二行。
樣式
SPDX 許可證識別符號以註釋的形式新增。註釋樣式取決於檔案型別。
C source: // SPDX-License-Identifier: <SPDX License Expression> C header: /* SPDX-License-Identifier: <SPDX License Expression> */ ASM: /* SPDX-License-Identifier: <SPDX License Expression> */ scripts: # SPDX-License-Identifier: <SPDX License Expression> .rst: .. SPDX-License-Identifier: <SPDX License Expression> .dts{i}: // SPDX-License-Identifier: <SPDX License Expression>如果特定工具無法處理標準註釋樣式,則應使用該工具接受的適當註釋機制。這就是 C 標頭檔案中使用“/* */”樣式註釋的原因。曾觀察到生成的 .lds 檔案導致構建中斷,其中 ‘ld’ 無法解析 C++ 註釋。目前這已得到修復,但仍有一些較舊的彙編工具無法處理 C++ 樣式註釋。
語法
一個 <SPDX 許可證表示式> 可以是 SPDX 許可證列表上找到的 SPDX 簡短形式許可證識別符號,或者當許可證例外適用時,由“WITH”分隔的兩個 SPDX 簡短形式許可證識別符號的組合。當多個許可證適用時,表示式由關鍵字“AND”、“OR”分隔的子表示式組成,並由“(”、“)”包圍。
對於像 [L]GPL 這樣帶有“或更高版本”選項的許可證,其許可證識別符號透過使用“+”來表示“或更高版本”選項構建。
// SPDX-License-Identifier: GPL-2.0+ // SPDX-License-Identifier: LGPL-2.1+
當需要對許可證進行修飾時,應使用 WITH。例如,Linux 核心 UAPI 檔案使用以下表達式:
// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note // SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note
核心中發現的其他使用 WITH 例外的示例有:
// SPDX-License-Identifier: GPL-2.0 WITH mif-exception // SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0
例外只能與特定的許可證識別符號一起使用。有效的許可證識別符號列在例外文字檔案的標籤中。詳情請參閱許可識別符號章節中的例外。
如果檔案採用雙重許可且只選擇一個許可證,則應使用 OR。例如,一些 dtsi 檔案在雙重許可下可用:
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
核心中雙重許可檔案中許可證表示式的示例:
// SPDX-License-Identifier: GPL-2.0 OR MIT // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause // SPDX-License-Identifier: GPL-2.0 OR Apache-2.0 // SPDX-License-Identifier: GPL-2.0 OR MPL-1.1 // SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT // SPDX-License-Identifier: GPL-1.0+ OR BSD-3-Clause OR OpenSSL
如果檔案具有多個許可證且其所有條款均適用於該檔案的使用,則應使用 AND。例如,如果程式碼是從另一個專案繼承而來,並且已獲准將其放入核心,但原始許可證條款需要保持有效:
// SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) AND MIT
另一個需要遵守兩套許可證條款的示例是:
// SPDX-License-Identifier: GPL-1.0+ AND LGPL-2.1+
許可識別符號¶
目前使用的許可證以及新增到核心中的程式碼的許可證可分為:
首選許可證:
在可能的情況下,應使用這些許可證,因為它們已知完全相容且被廣泛使用。這些許可證可從以下目錄獲取:
LICENSES/preferred/
在核心原始碼樹中。
此目錄中的檔案包含完整的許可證文字和元標籤。檔名與應在原始檔中使用的 SPDX 許可證識別符號相同。
示例
LICENSES/preferred/GPL-2.0
包含 GPL 版本 2 許可證文字和所需的元標籤
LICENSES/preferred/MIT
包含 MIT 許可證文字和所需的元標籤
元標籤:
許可證檔案中必須包含以下元標籤:
Valid-License-Identifier
一行或多行宣告專案內部哪些許可證識別符號有效,用於引用此特定許可證文字。通常這是一個單個有效識別符號,但例如對於帶有“或更高版本”選項的許可證,兩個識別符號是有效的。
SPDX-URL
包含與許可證相關附加資訊的 SPDX 頁面的 URL。
Usage-Guidance
關於使用建議的自由格式文字。文字必須包含正確的 SPDX 許可證識別符號示例,這些示例應根據許可識別符號語法指南放入原始檔中。
License-Text
此標籤之後的所有文字都被視為原始許可證文字
檔案格式示例
Valid-License-Identifier: GPL-2.0 Valid-License-Identifier: GPL-2.0+ SPDX-URL: https://spdx.org/licenses/GPL-2.0.html Usage-Guide: To use this license in source code, put one of the following SPDX tag/value pairs into a comment according to the placement guidelines in the licensing rules documentation. For 'GNU General Public License (GPL) version 2 only' use: SPDX-License-Identifier: GPL-2.0 For 'GNU General Public License (GPL) version 2 or any later version' use: SPDX-License-Identifier: GPL-2.0+ License-Text: Full license textSPDX-License-Identifier: MIT SPDX-URL: https://spdx.org/licenses/MIT.html Usage-Guide: To use this license in source code, put the following SPDX tag/value pair into a comment according to the placement guidelines in the licensing rules documentation. SPDX-License-Identifier: MIT License-Text: Full license text
已棄用許可證
這些許可證僅應用於現有程式碼或從不同專案匯入的程式碼。這些許可證可從以下目錄獲取:
LICENSES/deprecated/
在核心原始碼樹中。
此目錄中的檔案包含完整的許可證文字和元標籤。檔名與應在原始檔中使用的 SPDX 許可證識別符號相同。
示例
LICENSES/deprecated/ISC
包含 Internet Systems Consortium 許可證文字和所需的元標籤
LICENSES/deprecated/GPL-1.0
包含 GPL 版本 1 許可證文字和所需的元標籤。
元標籤
‘其他’許可證的元標籤要求與首選許可證的要求相同。
檔案格式示例
Valid-License-Identifier: ISC SPDX-URL: https://spdx.org/licenses/ISC.html Usage-Guide: Usage of this license in the kernel for new code is discouraged and it should solely be used for importing code from an already existing project. To use this license in source code, put the following SPDX tag/value pair into a comment according to the placement guidelines in the licensing rules documentation. SPDX-License-Identifier: ISC License-Text: Full license text
僅限雙重許可
這些許可證僅應用於與首選許可證一起對程式碼進行雙重許可。這些許可證可從以下目錄獲取:
LICENSES/dual/
在核心原始碼樹中。
此目錄中的檔案包含完整的許可證文字和元標籤。檔名與應在原始檔中使用的 SPDX 許可證識別符號相同。
示例
LICENSES/dual/MPL-1.1
包含 Mozilla 公共許可證版本 1.1 許可證文字和所需的元標籤
LICENSES/dual/Apache-2.0
包含 Apache 許可證版本 2.0 許可證文字和所需的元標籤。
元標籤
‘其他’許可證的元標籤要求與首選許可證的要求相同。
檔案格式示例
Valid-License-Identifier: MPL-1.1 SPDX-URL: https://spdx.org/licenses/MPL-1.1.html Usage-Guide: Do NOT use. The MPL-1.1 is not GPL2 compatible. It may only be used for dual-licensed files where the other license is GPL2 compatible. If you end up using this it MUST be used together with a GPL2 compatible license using "OR". To use the Mozilla Public License version 1.1 put the following SPDX tag/value pair into a comment according to the placement guidelines in the licensing rules documentation: SPDX-License-Identifier: MPL-1.1 License-Text: Full license text
例外:
某些許可證可以透過例外進行修訂,這些例外授予原始許可證不具備的某些權利。這些例外可從以下目錄獲取:
LICENSES/exceptions/
在核心原始碼樹中。此目錄中的檔案包含完整的例外文字和所需的例外元標籤。
示例
LICENSES/exceptions/Linux-syscall-note
包含 Linux 核心 COPYING 檔案中記錄的 Linux 系統呼叫例外,該例外用於 UAPI 標頭檔案。例如:/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
LICENSES/exceptions/GCC-exception-2.0
包含 GCC ‘連結例外’,它允許將任何二進位制檔案(無論其許可證如何)連結到標記有此例外的檔案的編譯版本。這對於從與 GPL 不相容的原始碼建立可執行的可執行檔案是必需的。
例外元標籤:
例外檔案中必須包含以下元標籤:
SPDX-Exception-Identifier
一個可與 SPDX 許可證識別符號一起使用的例外識別符號。
SPDX-URL
包含與例外相關附加資訊的 SPDX 頁面的 URL。
SPDX-Licenses
一個逗號分隔的 SPDX 許可證識別符號列表,用於指定例外可應用於哪些許可證。
Usage-Guidance
關於使用建議的自由格式文字。文字必須包含正確的 SPDX 許可證識別符號示例,這些示例應根據許可識別符號語法指南放入原始檔中。
Exception-Text
此標籤之後的所有文字都被視為原始例外文字
檔案格式示例
SPDX-Exception-Identifier: Linux-syscall-note SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html SPDX-Licenses: GPL-2.0, GPL-2.0+, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+ Usage-Guidance: This exception is used together with one of the above SPDX-Licenses to mark user-space API (uapi) header files so they can be included into non GPL compliant user-space application code. To use this exception add it with the keyword WITH to one of the identifiers in the SPDX-Licenses tag: SPDX-License-Identifier: <SPDX-License> WITH Linux-syscall-note Exception-Text: Full exception textSPDX-Exception-Identifier: GCC-exception-2.0 SPDX-URL: https://spdx.org/licenses/GCC-exception-2.0.html SPDX-Licenses: GPL-2.0, GPL-2.0+ Usage-Guidance: The "GCC Runtime Library exception 2.0" is used together with one of the above SPDX-Licenses for code imported from the GCC runtime library. To use this exception add it with the keyword WITH to one of the identifiers in the SPDX-Licenses tag: SPDX-License-Identifier: <SPDX-License> WITH GCC-exception-2.0 Exception-Text: Full exception text
所有 SPDX 許可證識別符號和例外都必須在 LICENSES 子目錄中有一個對應的檔案。這是為了允許工具驗證(例如 checkpatch.pl),並使許可證可以直接從原始碼中讀取和提取,這也是各種 FOSS 組織推薦的做法,例如 FSFE REUSE 倡議。
MODULE_LICENSE¶
可載入核心模組也需要 MODULE_LICENSE() 標籤。此標籤既不能替代正確的原始碼許可證資訊(SPDX-License-Identifier),也與表達或確定模組原始碼所依據的確切許可證無關。
此標籤的唯一目的是為核心模組載入器和使用者空間工具提供足夠的資訊,以判斷模組是自由軟體還是專有軟體。
MODULE_LICENSE() 的有效許可證字串有:
“GPL”
模組根據 GPL 版本 2 獲得許可。這不區分 GPL-2.0-only 或 GPL-2.0-or-later。確切的許可證資訊只能透過相應原始檔中的許可證資訊來確定。
“GPL v2”
與“GPL”相同。它因歷史原因而存在。
“GPL and additional rights”
表示模組原始碼在 GPL v2 變體和 MIT 許可證下雙重許可的歷史變體。請勿在新程式碼中使用。
“Dual MIT/GPL”
表示模組在 GPL v2 變體或 MIT 許可證選擇下雙重許可的正確方式。
“Dual BSD/GPL”
模組在 GPL v2 變體或 BSD 許可證選擇下雙重許可。BSD 許可證的確切變體只能透過相應原始檔中的許可證資訊來確定。
“Dual MPL/GPL”
模組在 GPL v2 變體或 Mozilla 公共許可證(MPL)選擇下雙重許可。MPL 許可證的確切變體只能透過相應原始檔中的許可證資訊來確定。
“Proprietary”
模組受專有許可證約束。“Proprietary”應僅理解為“許可證與 GPLv2 不相容”。此字串僅用於與 GPLv2 不相容的第三方模組,不能用於其原始碼位於核心樹中的模組。以這種方式標記的模組在載入時會用‘P’標誌汙染核心,並且核心模組載入器拒絕將此類模組連結到透過 EXPORT_SYMBOL_GPL() 匯出的符號。