yannstatic/static/2023/05/29/PC1-EndeavourOS-XFCE-ASUS_H110M_A-nvme_1To-LVM-Chiffre.html

4938 lines
340 KiB
HTML
Raw Permalink Normal View History

2024-10-31 20:18:37 +01:00
<!DOCTYPE html><html lang="fr">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>Mini tour PC1 - EndeavourOS XFCE sur partition LVM chiffrée - YannStatic</title>
<meta name="description" content="EndeavourOS est une distribution GNU/Linux basée sur Arch Linux">
<link rel="canonical" href="https://static.rnmkcy.eu/2023/05/29/PC1-EndeavourOS-XFCE-ASUS_H110M_A-nvme_1To-LVM-Chiffre.html"><link rel="alternate" type="application/rss+xml" title="YannStatic" href="/feed.xml">
<!-- - include head/favicon.html - -->
<link rel="shortcut icon" type="image/png" href="/assets/favicon/favicon.png"><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" ><!-- start custom head snippets --><link rel="stylesheet" href="/assets/css/expand.css">
<!-- end custom head snippets --><script>(function() {
window.isArray = function(val) {
return Object.prototype.toString.call(val) === '[object Array]';
};
window.isString = function(val) {
return typeof val === 'string';
};
window.hasEvent = function(event) {
return 'on'.concat(event) in window.document;
};
window.isOverallScroller = function(node) {
return node === document.documentElement || node === document.body || node === window;
};
window.isFormElement = function(node) {
var tagName = node.tagName;
return tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';
};
window.pageLoad = (function () {
var loaded = false, cbs = [];
window.addEventListener('load', function () {
var i;
loaded = true;
if (cbs.length > 0) {
for (i = 0; i < cbs.length; i++) {
cbs[i]();
}
}
});
return {
then: function(cb) {
cb && (loaded ? cb() : (cbs.push(cb)));
}
};
})();
})();
(function() {
window.throttle = function(func, wait) {
var args, result, thisArg, timeoutId, lastCalled = 0;
function trailingCall() {
lastCalled = new Date;
timeoutId = null;
result = func.apply(thisArg, args);
}
return function() {
var now = new Date,
remaining = wait - (now - lastCalled);
args = arguments;
thisArg = this;
if (remaining <= 0) {
clearTimeout(timeoutId);
timeoutId = null;
lastCalled = now;
result = func.apply(thisArg, args);
} else if (!timeoutId) {
timeoutId = setTimeout(trailingCall, remaining);
}
return result;
};
};
})();
(function() {
var Set = (function() {
var add = function(item) {
var i, data = this._data;
for (i = 0; i < data.length; i++) {
if (data[i] === item) {
return;
}
}
this.size ++;
data.push(item);
return data;
};
var Set = function(data) {
this.size = 0;
this._data = [];
var i;
if (data.length > 0) {
for (i = 0; i < data.length; i++) {
add.call(this, data[i]);
}
}
};
Set.prototype.add = add;
Set.prototype.get = function(index) { return this._data[index]; };
Set.prototype.has = function(item) {
var i, data = this._data;
for (i = 0; i < data.length; i++) {
if (this.get(i) === item) {
return true;
}
}
return false;
};
Set.prototype.is = function(map) {
if (map._data.length !== this._data.length) { return false; }
var i, j, flag, tData = this._data, mData = map._data;
for (i = 0; i < tData.length; i++) {
for (flag = false, j = 0; j < mData.length; j++) {
if (tData[i] === mData[j]) {
flag = true;
break;
}
}
if (!flag) { return false; }
}
return true;
};
Set.prototype.values = function() {
return this._data;
};
return Set;
})();
window.Lazyload = (function(doc) {
var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
var createNode = function(name, attrs) {
var node = doc.createElement(name), attr;
for (attr in attrs) {
if (attrs.hasOwnProperty(attr)) {
node.setAttribute(attr, attrs[attr]);
}
}
return node;
};
var end = function(type, url) {
var s, q, qi, cbs, i, j, cur, val, flag;
if (type === 'js' || type ==='css') {
s = sources[type], q = queue[type];
s[url] = true;
for (i = 0; i < q.length; i++) {
cur = q[i];
if (cur.urls.has(url)) {
qi = cur, val = qi.urls.values();
qi && (cbs = qi.callbacks);
for (flag = true, j = 0; j < val.length; j++) {
cur = val[j];
if (!s[cur]) {
flag = false;
}
}
if (flag && cbs && cbs.length > 0) {
for (j = 0; j < cbs.length; j++) {
cbs[j].call(context);
}
qi.load = true;
}
}
}
}
};
var load = function(type, urls, callback) {
var s, q, qi, node, i, cur,
_urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
if (type === 'js' || type ==='css') {
s = sources[type], q = queue[type];
for (i = 0; i < q.length; i++) {
cur = q[i];
if (_urls.is(cur.urls)) {
qi = cur;
break;
}
}
val = _urls.values();
if (qi) {
callback && (qi.load || qi.callbacks.push(callback));
callback && (qi.load && callback());
} else {
q.push({
urls: _urls,
callbacks: callback ? [callback] : [],
load: false
});
for (i = 0; i < val.length; i++) {
node = null, url = val[i];
if (s[url] === undefined) {
(type === 'js' ) && (node = createNode('script', { src: url }));
(type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
if (node) {
node.onload = (function(type, url) {
return function() {
end(type, url);
};
})(type, url);
(doc.head || doc.body).appendChild(node);
s[url] = false;
}
}
}
}
}
};
return {
js: function(url, callback) {
load('js', url, callback);
},
css: function(url, callback) {
load('css', url, callback);
}
};
})(this.document);
})();
</script><script>
(function() {
var TEXT_VARIABLES = {
version: '2.2.6',
sources: {
font_awesome: 'https://use.fontawesome.com/releases/v5.0.13/css/all.css',
jquery: '/assets/js/jquery.min.js',
leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js',
chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js',
gitalk: {
js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js',
css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
},
valine: 'https://unpkg.com/valine/dist/Valine.min.js'
},
site: {
toc: {
selectors: 'h1,h2,h3'
}
},
paths: {
search_js: '/assets/search.js'
}
};
window.TEXT_VARIABLES = TEXT_VARIABLES;
})();
</script>
</head>
<body>
<div class="root" data-is-touch="false">
<div class="layout--page js-page-root"><!----><div class="page__main js-page-main page__viewport hide-footer has-aside has-aside cell cell--auto">
<div class="page__main-inner"><div class="page__header d-print-none"><header class="header"><div class="main">
<div class="header__title">
<div class="header__brand"><svg id="svg" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="478.9473684210526" viewBox="0, 0, 400,478.9473684210526"><g id="svgg"><path id="path0" d="M308.400 56.805 C 306.970 56.966,303.280 57.385,300.200 57.738 C 290.906 58.803,278.299 59.676,269.200 59.887 L 260.600 60.085 259.400 61.171 C 258.010 62.428,256.198 63.600,255.645 63.600 C 255.070 63.600,252.887 65.897,252.598 66.806 C 252.460 67.243,252.206 67.600,252.034 67.600 C 251.397 67.600,247.206 71.509,247.202 72.107 C 247.201 72.275,246.390 73.190,245.400 74.138 C 243.961 75.517,243.598 76.137,243.592 77.231 C 243.579 79.293,241.785 83.966,240.470 85.364 C 239.176 86.740,238.522 88.365,237.991 91.521 C 237.631 93.665,236.114 97.200,235.554 97.200 C 234.938 97.200,232.737 102.354,232.450 104.472 C 232.158 106.625,230.879 109.226,229.535 110.400 C 228.933 110.926,228.171 113.162,226.434 119.500 C 226.178 120.435,225.795 121.200,225.584 121.200 C 225.373 121.200,225.200 121.476,225.200 121.813 C 225.200 122.149,224.885 122.541,224.500 122.683 C 223.606 123.013,223.214 123.593,223.204 124.600 C 223.183 126.555,220.763 132.911,219.410 134.562 C 218.443 135.742,217.876 136.956,217.599 138.440 C 217.041 141.424,215.177 146.434,214.532 146.681 C 214.240 146.794,214.000 147.055,214.000 147.261 C 214.000 147.467,213.550 148.086,213.000 148.636 C 212.450 149.186,212.000 149.893,212.000 150.208 C 212.000 151.386,208.441 154.450,207.597 153.998 C 206.319 153.315,204.913 150.379,204.633 147.811 C 204.365 145.357,202.848 142.147,201.759 141.729 C 200.967 141.425,199.200 137.451,199.200 135.974 C 199.200 134.629,198.435 133.224,196.660 131.311 C 195.363 129.913,194.572 128.123,193.870 125.000 C 193.623 123.900,193.236 122.793,193.010 122.540 C 190.863 120.133,190.147 118.880,188.978 115.481 C 188.100 112.928,187.151 111.003,186.254 109.955 C 185.358 108.908,184.518 107.204,183.847 105.073 C 183.280 103.273,182.497 101.329,182.108 100.753 C 181.719 100.177,180.904 98.997,180.298 98.131 C 179.693 97.265,178.939 95.576,178.624 94.378 C 178.041 92.159,177.125 90.326,175.023 87.168 C 174.375 86.196,173.619 84.539,173.342 83.486 C 172.800 81.429,171.529 79.567,170.131 78.785 C 169.654 78.517,168.697 77.511,168.006 76.549 C 167.316 75.587,166.594 74.800,166.402 74.800 C 166.210 74.800,164.869 73.633,163.421 72.206 C 160.103 68.936,161.107 69.109,146.550 69.301 C 133.437 69.474,128.581 70.162,126.618 72.124 C 126.248 72.495,125.462 72.904,124.872 73.033 C 124.282 73.163,123.088 73.536,122.219 73.863 C 121.349 74.191,119.028 74.638,117.061 74.858 C 113.514 75.254,109.970 76.350,108.782 77.419 C 107.652 78.436,100.146 80.400,97.388 80.400 C 95.775 80.400,93.167 81.360,91.200 82.679 C 90.430 83.195,89.113 83.804,88.274 84.031 C 85.875 84.681,78.799 90.910,74.400 96.243 L 73.400 97.456 73.455 106.028 C 73.526 117.055,74.527 121.238,77.820 124.263 C 78.919 125.273,80.400 127.902,80.400 128.842 C 80.400 129.202,81.075 130.256,81.900 131.186 C 83.563 133.059,85.497 136.346,86.039 138.216 C 86.233 138.886,87.203 140.207,88.196 141.153 C 89.188 142.098,90.000 143.104,90.000 143.388 C 90.000 144.337,92.129 148.594,92.869 149.123 C 93.271 149.410,93.600 149.831,93.600 150.059 C 93.600 150.286,93.932 150.771,94.337 151.136 C 94.743 151.501,95.598 153.004,96.237 154.475 C 96.877 155.947,97.760 157.351,98.200 157.596 C 98.640 157.841,99.900 159.943,101.000 162.267 C 102.207 164.817,103.327 166.644,103.825 166.876 C 104.278 167.087,105.065 168.101,105.573 169.130 C 107.658 173.348,108.097 174.093,110.006 176.647 C 111.103 178.114,112.000 179.725,112.000 180.227 C 112.000 181.048,113.425 183.163,114.678 184.200 C 115.295 184.711,117.396 188.733,117.720 190.022 C 117.855 190.562,118.603 191.633,119.381 192.402 C 120.160 193.171,121.496 195.258,122.351 197.039 C 123.206 198.820,124.167 200.378,124.487 200.501 C 124.807 200.624,125.953 202.496,127.034 204.662 C 128.114 206.828,129.676 209.299,130.505 210.153 C 131.333 211.007,132.124 212.177,132.262 212.753 C 132.618 214.239,134.291 217.048,136.288 219.5
" href="/">YannStatic</a></div><!--<button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button>--><!-- <li><button class="button button--secondary button--circle search-button js-search-toggle"><i class="fas fa-search"></i></button></li> -->
<!-- Champ de recherche -->
<div id="searchbox" class="search search--dark" style="visibility: visible">
<div class="main">
<div class="search__header"></div>
<div class="search-bar">
<div class="search-box js-search-box">
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
<input id="search-input" type="text" />
<!-- <div class="search-box__icon-clear js-icon-clear">
<a><i class="fas fa-times"></i></a>
</div> -->
</div>
</div>
</div>
</div>
<!-- Script pointing to search-script.js -->
<script>/*!
* Simple-Jekyll-Search
* Copyright 2015-2020, Christian Fei
* Licensed under the MIT License.
*/
(function(){
'use strict'
var _$Templater_7 = {
compile: compile,
setOptions: setOptions
}
const options = {}
options.pattern = /\{(.*?)\}/g
options.template = ''
options.middleware = function () {}
function setOptions (_options) {
options.pattern = _options.pattern || options.pattern
options.template = _options.template || options.template
if (typeof _options.middleware === 'function') {
options.middleware = _options.middleware
}
}
function compile (data) {
return options.template.replace(options.pattern, function (match, prop) {
const value = options.middleware(prop, data[prop], options.template)
if (typeof value !== 'undefined') {
return value
}
return data[prop] || match
})
}
'use strict';
function fuzzysearch (needle, haystack) {
var tlen = haystack.length;
var qlen = needle.length;
if (qlen > tlen) {
return false;
}
if (qlen === tlen) {
return needle === haystack;
}
outer: for (var i = 0, j = 0; i < qlen; i++) {
var nch = needle.charCodeAt(i);
while (j < tlen) {
if (haystack.charCodeAt(j++) === nch) {
continue outer;
}
}
return false;
}
return true;
}
var _$fuzzysearch_1 = fuzzysearch;
'use strict'
/* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
function FuzzySearchStrategy () {
this.matches = function (string, crit) {
return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
}
}
'use strict'
var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
function LiteralSearchStrategy () {
this.matches = function (str, crit) {
if (!str) return false
str = str.trim().toLowerCase()
crit = crit.trim().toLowerCase()
return crit.split(' ').filter(function (word) {
return str.indexOf(word) >= 0
}).length === crit.split(' ').length
}
}
'use strict'
var _$Repository_4 = {
put: put,
clear: clear,
search: search,
setOptions: __setOptions_4
}
/* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
/* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
function NoSort () {
return 0
}
const data = []
let opt = {}
opt.fuzzy = false
opt.limit = 10
opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = NoSort
opt.exclude = []
function put (data) {
if (isObject(data)) {
return addObject(data)
}
if (isArray(data)) {
return addArray(data)
}
return undefined
}
function clear () {
data.length = 0
return data
}
function isObject (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
}
function isArray (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
}
function addObject (_data) {
data.push(_data)
return data
}
function addArray (_data) {
const added = []
clear()
for (let i = 0, len = _data.length; i < len; i++) {
if (isObject(_data[i])) {
added.push(addObject(_data[i]))
}
}
return added
}
function search (crit) {
if (!crit) {
return []
}
return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
}
function __setOptions_4 (_opt) {
opt = _opt || {}
opt.fuzzy = _opt.fuzzy || false
opt.limit = _opt.limit || 10
opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = _opt.sort || NoSort
opt.exclude = _opt.exclude || []
}
function findMatches (data, crit, strategy, opt) {
const matches = []
for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
const match = findMatchesInObject(data[i], crit, strategy, opt)
if (match) {
matches.push(match)
}
}
return matches
}
function findMatchesInObject (obj, crit, strategy, opt) {
for (const key in obj) {
if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
return obj
}
}
}
function isExcluded (term, excludedTerms) {
for (let i = 0, len = excludedTerms.length; i < len; i++) {
const excludedTerm = excludedTerms[i]
if (new RegExp(excludedTerm).test(term)) {
return true
}
}
return false
}
/* globals ActiveXObject:false */
'use strict'
var _$JSONLoader_2 = {
load: load
}
function load (location, callback) {
const xhr = getXHR()
xhr.open('GET', location, true)
xhr.onreadystatechange = createStateChangeListener(xhr, callback)
xhr.send()
}
function createStateChangeListener (xhr, callback) {
return function () {
if (xhr.readyState === 4 && xhr.status === 200) {
try {
callback(null, JSON.parse(xhr.responseText))
} catch (err) {
callback(err, null)
}
}
}
}
function getXHR () {
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
}
'use strict'
var _$OptionsValidator_3 = function OptionsValidator (params) {
if (!validateParams(params)) {
throw new Error('-- OptionsValidator: required options missing')
}
if (!(this instanceof OptionsValidator)) {
return new OptionsValidator(params)
}
const requiredOptions = params.required
this.getRequiredOptions = function () {
return requiredOptions
}
this.validate = function (parameters) {
const errors = []
requiredOptions.forEach(function (requiredOptionName) {
if (typeof parameters[requiredOptionName] === 'undefined') {
errors.push(requiredOptionName)
}
})
return errors
}
function validateParams (params) {
if (!params) {
return false
}
return typeof params.required !== 'undefined' && params.required instanceof Array
}
}
'use strict'
var _$utils_9 = {
merge: merge,
isJSON: isJSON
}
function merge (defaultParams, mergeParams) {
const mergedOptions = {}
for (const option in defaultParams) {
mergedOptions[option] = defaultParams[option]
if (typeof mergeParams[option] !== 'undefined') {
mergedOptions[option] = mergeParams[option]
}
}
return mergedOptions
}
function isJSON (json) {
try {
if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
return true
}
return false
} catch (err) {
return false
}
}
var _$src_8 = {};
(function (window) {
'use strict'
let options = {
searchInput: null,
resultsContainer: null,
json: [],
success: Function.prototype,
searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
templateMiddleware: Function.prototype,
sortMiddleware: function () {
return 0
},
noResultsText: 'No results found',
limit: 10,
fuzzy: false,
debounceTime: null,
exclude: []
}
let debounceTimerHandle
const debounce = function (func, delayMillis) {
if (delayMillis) {
clearTimeout(debounceTimerHandle)
debounceTimerHandle = setTimeout(func, delayMillis)
} else {
func.call()
}
}
const requiredOptions = ['searchInput', 'resultsContainer', 'json']
/* removed: const _$Templater_7 = require('./Templater') */;
/* removed: const _$Repository_4 = require('./Repository') */;
/* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
const optionsValidator = _$OptionsValidator_3({
required: requiredOptions
})
/* removed: const _$utils_9 = require('./utils') */;
window.SimpleJekyllSearch = function (_options) {
const errors = optionsValidator.validate(_options)
if (errors.length > 0) {
throwError('You must specify the following required options: ' + requiredOptions)
}
options = _$utils_9.merge(options, _options)
_$Templater_7.setOptions({
template: options.searchResultTemplate,
middleware: options.templateMiddleware
})
_$Repository_4.setOptions({
fuzzy: options.fuzzy,
limit: options.limit,
sort: options.sortMiddleware,
exclude: options.exclude
})
if (_$utils_9.isJSON(options.json)) {
initWithJSON(options.json)
} else {
initWithURL(options.json)
}
const rv = {
search: search
}
typeof options.success === 'function' && options.success.call(rv)
return rv
}
function initWithJSON (json) {
_$Repository_4.put(json)
registerInput()
}
function initWithURL (url) {
_$JSONLoader_2.load(url, function (err, json) {
if (err) {
throwError('failed to get JSON (' + url + ')')
}
initWithJSON(json)
})
}
function emptyResultsContainer () {
options.resultsContainer.innerHTML = ''
}
function appendToResultsContainer (text) {
options.resultsContainer.innerHTML += text
}
function registerInput () {
options.searchInput.addEventListener('input', function (e) {
if (isWhitelistedKey(e.which)) {
emptyResultsContainer()
debounce(function () { search(e.target.value) }, options.debounceTime)
}
})
}
function search (query) {
if (isValidQuery(query)) {
emptyResultsContainer()
render(_$Repository_4.search(query), query)
}
}
function render (results, query) {
const len = results.length
if (len === 0) {
return appendToResultsContainer(options.noResultsText)
}
for (let i = 0; i < len; i++) {
results[i].query = query
appendToResultsContainer(_$Templater_7.compile(results[i]))
}
}
function isValidQuery (query) {
return query && query.length > 0
}
function isWhitelistedKey (key) {
return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
}
function throwError (message) {
throw new Error('SimpleJekyllSearch --- ' + message)
}
})(window)
}());
</script>
<!-- Configuration -->
<script>
SimpleJekyllSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('results-container'),
json: '/search.json',
//searchResultTemplate: '<li><a href="https://static.rnmkcy.eu{url}">{date}&nbsp;{title}</a></li>'
searchResultTemplate: '<li><a href="{url}">{date}&nbsp;{title}</a></li>'
})
</script>
<!-- Fin déclaration champ de recherche --></div><nav class="navigation">
<ul><li class="navigation__item"><a href="/archive.html">Etiquettes</a></li><li class="navigation__item"><a href="/htmldoc.html">Documents</a></li><li class="navigation__item"><a href="/liens_ttrss.html">Liens</a></li><li class="navigation__item"><a href="/aide-jekyll-text-theme.html">Aide</a></li></ul>
</nav></div>
</header>
</div><div class="page__content"><div class ="main"><div class="grid grid--reverse">
<div class="col-main cell cell--auto"><!-- start custom main top snippet --><div id="results-container" class="search-result js-search-result"></div><!-- end custom main top snippet -->
<article itemscope itemtype="http://schema.org/Article"><div class="article__header"><header><h1 style="color:Tomato;">Mini tour PC1 - EndeavourOS XFCE sur partition LVM chiffrée</h1></header></div><meta itemprop="headline" content="Mini tour PC1 - EndeavourOS XFCE sur partition LVM chiffrée"><div class="article__info clearfix"><ul class="left-col menu"><li>
2024-11-08 14:10:33 +01:00
<a class="button button--secondary button--pill button--sm" style="color:#00FFFF" href="/archive.html?tag=archlinux">archlinux</a>
2024-10-31 20:18:37 +01:00
</li><li>
2024-11-08 14:10:33 +01:00
<a class="button button--secondary button--pill button--sm" style="color:#00FFFF" href="/archive.html?tag=chiffrement">chiffrement</a>
2024-10-31 20:18:37 +01:00
</li><li>
2024-11-08 14:10:33 +01:00
<a class="button button--secondary button--pill button--sm" style="color:#00FFFF" href="/archive.html?tag=lvm">lvm</a>
2024-10-31 20:18:37 +01:00
</li></ul><ul class="right-col menu"><li>
<i class="far fa-calendar-alt"></i>&nbsp;<span title="Création" style="color:#FF00FF">29&nbsp;mai&nbsp;&nbsp;&nbsp;2023</span>
<span title="Modification" style="color:#00FF7F">24&nbsp;sept.&nbsp;2024</span></li></ul></div><meta itemprop="datePublished" content="2024-09-24T00:00:00+02:00">
<meta itemprop="keywords" content="archlinux,chiffrement,lvm"><div class="js-article-content">
<div class="layout--article"><!-- start custom article top snippet -->
<style>
#myBtn {
display: none;
position: fixed;
bottom: 10px;
right: 10px;
z-index: 99;
font-size: 12px;
font-weight: bold;
border: none;
outline: none;
background-color: white;
color: black;
cursor: pointer;
padding: 5px;
border-radius: 4px;
}
#myBtn:hover {
background-color: #555;
}
</style>
<button onclick="topFunction()" id="myBtn" title="Haut de page">&#8679;</button>
<script>
//Get the button
var mybutton = document.getElementById("myBtn");
// When the user scrolls down 20px from the top of the document, show the button
window.onscroll = function() {scrollFunction()};
function scrollFunction() {
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
mybutton.style.display = "block";
} else {
mybutton.style.display = "none";
}
}
// When the user clicks on the button, scroll to the top of the document
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
</script>
<!-- end custom article top snippet -->
<div class="article__content" itemprop="articleBody"><details>
<summary><b>Afficher/cacher Sommaire</b></summary>
<!-- affichage sommaire -->
<div class="toc-aside js-toc-root"></div>
</details><p><em>EndeavourOS est une distribution GNU/Linux basée sur Arch Linux</em></p>
<ul>
<li><a href="/2023/01/20/Description_materiel_minitour_PC1.html">Description matériel mini tour PC1</a></li>
</ul>
<p><img src="/images/yannick.drawio.png" alt="" /></p>
<h2 id="création-clé-endeavouros-usb-live">Création clé EndeavourOS USB Live</h2>
<p>Télécharger le dernier fichier iSO <a href="https://endeavouros.com/latest-release/">https://endeavouros.com/latest-release/</a><br />
<strong>EndeavourOS_Cassini_Nova-03-2023_R1.iso</strong> et <strong>EndeavourOS_Cassini_Nova-03-2023_R1.iso.sha512sum</strong></p>
<p>Vérifier checksum</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sha512sum -c EndeavourOS_Cassini_Nova-03-2023_R1.iso.sha512sum
</code></pre></div></div>
<p><strong>EndeavourOS_Cassini_Nova-03-2023_R1.iso: Réussi</strong></p>
<p>Créer la clé bootable <br />
Pour savoir sur quel périphérique, connecter la clé sur un port USB dun ordinateur et lancer la commande <code class="language-plaintext highlighter-rouge">sudo dmesg</code><br />
Dans le cas présent , le périphérique est <strong>/dev/sde</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo dd if=EndeavourOS_Cassini_Nova-03-2023_R1.iso of=/dev/sde bs=4M
</code></pre></div></div>
<p><code class="language-plaintext warning highlighter-rouge">Installer une distribution EndeavourOS sur une partition LVM est impossible avec l'outil "Calamarès"</code></p>
<h2 id="installation-endeavouros-xfce-sur-partition-lvm-entièrement-chiffrée">Installation EndeavourOS XFCE sur partition LVM entièrement chiffrée</h2>
<h3 id="installation-via-usb-live">Installation via USB LIVE</h3>
<p>Démarrage avec la clé USB insérée dans le Mini tour PC1 et appui sur F12 pour un accès au menu <br />
Choisir UEFI specific storage</p>
<p>Vous arrivez sur la page de sélection<br />
<img src="/images/endos0001.png" alt="" width="400" /><br />
Valider le choix par défaut</p>
<p>Changer le clavier en FR<br />
<img src="/images/endos0001a.png" alt="" width="600" /><br />
<img src="/images/endos0001b.png" alt="" width="400" /><br />
<img src="/images/endos0001c.png" alt="" width="200" /><br />
Supprimer <strong>English(US)</strong> pour ne garder que <strong>French</strong> et <strong>Close</strong></p>
<p>Ouvrir un <strong>Terminal Emulator</strong> dans le live endeavour<br />
<img src="/images/endos0001d.png" alt="" width="600" /></p>
<h3 id="partionner-un-disque">Partionner un disque</h3>
<p>en mode su</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo -s
</code></pre></div></div>
<p>Le disque : <code class="language-plaintext highlighter-rouge">lsblk</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme0n1 259:0 0 931,5G 0 disk
</code></pre></div></div>
<p>On partitionne un disque en 3 avec <code class="language-plaintext highlighter-rouge">gdisk</code></p>
<ul>
<li>Partition 1 : 512M EFI (code ef00) système de fichier FAT32</li>
<li>Partition 2 : 920G LVM (code 8e00) système de fichier EXT4</li>
<li>Partition restante pour Installation temporaire</li>
</ul>
<p>Zapper le disque,</p>
<p>(<strong>Attention</strong> Ceci effacera de manière irréversible toutes les données de votre disque, veuillez sauvegarder toutes les données importantes) :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sgdisk --zap-all /dev/nvme0n1
# OU
wipefs -a /dev/nvme0n1
</code></pre></div></div>
<p>Partitionnement du disque NVME 1To GPT + LVM</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gdisk /dev/nvme0n1
</code></pre></div></div>
<p>Format la partition EFI</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkfs.fat -F32 /dev/nvme0n1p1
</code></pre></div></div>
<h3 id="installer-endeavouros-sur-une-partition-temporaire">Installer EndeavourOS sur une partition temporaire</h3>
<p>Lancer linstallation<br />
<img src="/images/endos0002.png" alt="" width="600" /></p>
<p><img src="/images/endos0003.png" alt="" width="600" /><br />
Choix du “pas en ligne”</p>
<p><img src="/images/endos0004.png" alt="" width="600" /><br />
Français</p>
<p>Pour ne pas installer le parefeu firewalld<br />
<img src="/images/endos0004a.png" alt="" width="600" /></p>
<p><img src="/images/endos0005.png" alt="" width="600" /></p>
<p><img src="/images/endos0006.png" alt="" width="600" /></p>
<p><img src="/images/endos0006n.png" alt="" width="600" /></p>
<p><img src="/images/endos0007n.png" alt="" width="600" /></p>
<p><img src="/images/endos0007n1.png" alt="" width="600" /></p>
<p>Laissez Calamares terminer linstallation.</p>
<p>Linstallation démarre<br />
<img src="/images/endos0013.png" alt="" width="600" /><br />
Installation en cours, patienter …</p>
<p><img src="/images/endos0014.png" alt="" width="600" /><br />
Linstallation est terminée, cliquer “Redémarrer maintenant” et sur <strong>Terminé</strong>, oter la clé USB, et redémarrer sur endeavour</p>
<p>Vérifiez si vous pouvez accéder au système crypté.
Vous devriez maintenant avoir un système crypté LUKS (sans les trucs amusants comme les volumes logiques, la partition /home séparée, etc.).</p>
<p><code class="language-plaintext info highlighter-rouge">Réinsérer la clé USB et redémarrer dans l'environnement Live-Cd</code></p>
<p>Commuter le clavier en FR<br />
Ouvrir un terminal et basculer en mode su : <code class="language-plaintext highlighter-rouge">sudo -s</code></p>
<p><strong>Facultatif</strong><br />
Pour un accès sur la machine via SSH depuis un poste distant<br />
Lancer le service : <code class="language-plaintext highlighter-rouge">sudo systemctl start sshd</code><br />
Créer un mot de passe à liveuser : <code class="language-plaintext highlighter-rouge">passwd liveuser</code>
Relever ladresse ip de la machine : <code class="language-plaintext highlighter-rouge">ip a</code></p>
<h3 id="convertir-déchiffrer-et-monter-le-système-temporaire">Convertir Déchiffrer et monter le système temporaire</h3>
<p>Le système temporaire chiffré /dev/nvme0n1p3</p>
<p>Conversion chiffrement luks2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup convert /dev/nvme0n1p3 --type luks2
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>WARNING!
========
This operation will convert /dev/nvme0n1p3 to LUKS2 format.
Are you sure? (Type 'yes' in capital letters): YES
</code></pre></div></div>
<p>Confirmer par la saisie YES</p>
<p>Dans lenvironnement live-CD, ouvrez un Terminal ,basulez en mode su et tapez (ou marquez et copiez la ligne avec ctrl-c et collez dans le terminal avec shift-ctrl-v ) …</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p3 crypttemp <span class="c"># saisir la phrase mot de passe de l'installation</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> /media/crypttemp
mount /dev/mapper/crypttemp /media/crypttemp
</code></pre></div></div>
<p>Nos données dinstallation temporaires sont désormais accessibles sous <code class="language-plaintext highlighter-rouge">/media/crypttemp</code> et peuvent être copiées sur le nouveau système que nous allons mettre en place dans les prochaines étapes.</p>
<h3 id="configurer-le-nouveau-système-lvmonluks">Configurer le nouveau système LVMonLUKS</h3>
<p>Chiffrer la partition /dev/nvme0n1p2</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksFormat <span class="nt">--type</span> luks2 /dev/nvme0n1p2
</code></pre></div></div>
<p>Une demande de confirmation est exigée</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>WARNING!
========
This will overwrite data on /dev/nvme0n1p2 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/nvme0n1p2:
Verify passphrase:
</code></pre></div></div>
<p>Choisissez un mot de passe sécurisé ( <a href="https://xkcd.com/936/">https://xkcd.com/936/</a> )</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p2 crypt
Enter passphrase <span class="k">for</span> /dev/nvme0n1p2:
pvcreate /dev/mapper/crypt
Physical volume <span class="s2">"/dev/mapper/crypt"</span> successfully created.
vgcreate vg0 /dev/mapper/crypt
Volume group <span class="s2">"vg0"</span> successfully created
</code></pre></div></div>
<p>Une bonne taille de départ pour le volume racine (lvroot) est denviron 30 Go. Si vous envisagez dutiliser ultérieurement un fichier déchange résidant sur root, vous devez en tenir compte.<br />
Le redimensionnement ultérieur des volumes est assez facile, alors ny réfléchissez pas trop.<br />
Vous pouvez attribuer tout lespace libre restant au volume daccueil,<br />
<code class="language-plaintext highlighter-rouge">lvcreate --extents 100%FREE vg0 -n lvhome</code><br />
mais pour augmenter les volumes plus tard et pour les instantanés , il faut de lespace vide à lintérieur du groupe de volumes, donc je choisis généralement une taille pour lvhome qui laisse environ 30 Go despace inutilisé global dans le volume groupe (en supposant un lecteur de 500 Go, par exemple 500 0,512 40 430 = 29,488)</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 60G root dont 8 swapfile</span>
lvcreate <span class="nt">-L</span> 60G vg0 <span class="nt">-n</span> lvroot <span class="c"># Logical volume "lvroot" created.</span>
lvcreate <span class="nt">-L</span> 120G vg0 <span class="nt">-n</span> lvhome <span class="c"># Logical volume "lvhome" created.</span>
</code></pre></div></div>
<p>Créez un système de fichiers ext4 sur les volumes logiques.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkfs.ext4 <span class="nt">-L</span> root /dev/mapper/vg0-lvroot
mkfs.ext4 <span class="nt">-L</span> home /dev/mapper/vg0-lvhome
</code></pre></div></div>
<h3 id="monter-le-nouveau-système-sur-mnt">Monter le nouveau système sur “mnt”</h3>
<p>Monter le nouveau système sur <code class="language-plaintext highlighter-rouge">/mnt</code> pour les systèmes UEFI</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/mapper/vg0-lvroot /mnt
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/home
mount /dev/mapper/vg0-lvhome /mnt/home
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/efi
mount /dev/nvme0n1p1 /mnt/efi
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>
<p>devrait maintenant fournir une sortie similaire à la suivante (ignorez les tailles, celles-ci proviennent dune installation de test) …</p>
<p>pour les systèmes UEFI :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 931.5G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /mnt/efi
├─nvme0n1p2 259:2 0 920G 0 part
│ └─crypt 254:4 0 920G 0 crypt
│ ├─vg0-lvroot 254:5 0 60G 0 lvm /mnt
│ └─vg0-lvhome 254:6 0 120G 0 lvm /mnt/home
└─nvme0n1p3 259:3 0 11G 0 part
└─crypttemp 254:3 0 11G 0 crypt /media/crypttemp
</code></pre></div></div>
<h3 id="copier-le-système-temporaire">Copier le système temporaire</h3>
<p>pour vider les nouveaux points de montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rsync -avA /media/crypttemp/ /mnt
</code></pre></div></div>
<p><em>Veuillez patienter quelques minutes</em></p>
<p>A la fin</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sent 4,371,397,995 bytes received 3,121,049 bytes 138,873,620.44 bytes/sec
total size is 4,358,374,092 speedup is 1.00
</code></pre></div></div>
<h3 id="démonter-le-système-temporaire">Démonter le système temporaire</h3>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>umount /media/crypttemp
cryptsetup luksClose crypttemp
</code></pre></div></div>
<h3 id="ajouter-un-fichier-de-clé-existant-luks">Ajouter un fichier de clé existant LUKS</h3>
<p>Nous allons maintenant ajouter une deuxième clé saisie à la création chiffrement sur /dev/nvme0n1p2<br />
Nous ferons référence à cette clé à létape suivante.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksAddKey /dev/nvme0n1p2 /mnt/crypto_keyfile.bin
</code></pre></div></div>
<p>Il faut saisir le phrase mot de passe</p>
<h3 id="configurer-crypttab">Configurer “crypttab”</h3>
<p>Configuration <code class="language-plaintext highlighter-rouge">/etc/crypttab</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksUUID /dev/nvme0n1p2
</code></pre></div></div>
<p>renvoie <strong>2c8e7bb4-9286-47e9-8823-12b79bf2810c</strong><br />
Votre UUID sera différent, alors <u>**assurez-vous d'utiliser votre UUID à l'étape suivante !**</u></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /mnt/etc/crypttab
</code></pre></div></div>
<p>contient une ligne non commentée commençant par <code class="language-plaintext highlighter-rouge">luks-</code><br />
Remplacez cette ligne par la suivante ; <u>**n'oubliez pas d' utiliser votre UUID**</u></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptlvm UUID=2c8e7bb4-9286-47e9-8823-12b79bf2810c /crypto_keyfile.bin luks
</code></pre></div></div>
<p>Sauvegarder et quitter.</p>
<h3 id="basculer-en-chroot">Basculer en chroot</h3>
<p>Passer en chroot</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>arch-chroot /mnt
</code></pre></div></div>
<h3 id="configurer-fstab">Configurer “fstab”</h3>
<p>Configurer /etc/fstab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvroot
</code></pre></div></div>
<p>renvoie lUUID du volume racine : <strong>6727ede1-2ba5-45fb-9c5a-379c263ec078</strong>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvhome
</code></pre></div></div>
<p>renvoie lUUID du volume daccueil : <strong>52a1074e-72df-46d5-acf1-6553cdce1eaa</strong>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/fstab
</code></pre></div></div>
<p>contient une ligne commençant par <code class="language-plaintext highlighter-rouge">/dev/mapper/luks-</code><br />
<strong>Supprimez</strong> cette ligne et ajoutez ce qui suit (<u>**n'oubliez pas d' utiliser vos UUID**</u>)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>UUID=6727ede1-2ba5-45fb-9c5a-379c263ec078 / ext4 defaults,acl,noatime,discard 0 0
UUID=52a1074e-72df-46d5-acf1-6553cdce1eaa /home ext4 defaults,acl,noatime,discard 0 0
</code></pre></div></div>
<p>Sauvegarder et quitter.</p>
<h3 id="ajout-fichier-échange">Ajout fichier échange</h3>
<p>Utilisez dd pour créer un fichier déchange de la taille de votre choix.<br />
Création dun fichier déchange de 8192 Mo (pour tous les systèmes de fichiers)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dd if=/dev/zero of=/swapfile bs=1M count=8192 status=progress
</code></pre></div></div>
<p>Remplacez <code class="language-plaintext highlighter-rouge">count=8192</code> par la quantité de Mo que vous souhaitez installer pour lutilisation du fichier déchange :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chmod 600 /swapfile
</code></pre></div></div>
<p>Pour donner au fichier déchange des permissions de racine seulement.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkswap /swapfile
</code></pre></div></div>
<p>Pour faire du fichier un espace de pagination et enfin pour activer le fichier :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>swapon /swapfile
</code></pre></div></div>
<p>Modifier /etc/fstab pour activer le fichier déchange</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/fstab
</code></pre></div></div>
<p>Ajoutez la ligne suivante…</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/swapfile none swap defaults,pri=-2 0 0
</code></pre></div></div>
<p>Sauvegarder et quitter.</p>
<blockquote>
<p>Remarque : le fichier déchange doit être spécifié par son emplacement sur le système de fichiers, et non par son UUID ou son LABEL.</p>
</blockquote>
<p>pour vérifier :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>swapon --show
</code></pre></div></div>
<p><img src="/images/swapon.png" alt="Texte alternatif" /></p>
<h3 id="modifier-les-options-du-noyau">Modifier les options du noyau</h3>
<p>Dans <strong>systemd-boot</strong>, vous éditez le fichier dentrée approprié qui se trouve sur votre partition EFI dans le répertoire <code class="language-plaintext highlighter-rouge">loader/entries</code><br />
Chaque entrée est une option de démarrage dans le menu et chacune a une ligne appelée options. Vous pouvez modifier ces entrées directement, mais ces changements peuvent être écrasés lors de linstallation ou de la mise à jour de paquets.</p>
<p>Pour effectuer les changements, au lieu de modifier les entrées, modifiez le fichier <code class="language-plaintext highlighter-rouge">/etc/kernel/cmdline</code> qui est un fichier dune ligne contenant une liste doptions du noyau.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/kernel/cmdline
</code></pre></div></div>
<p>UUID de /dev/nvme0n1p2 : <code class="language-plaintext highlighter-rouge">blkid -s UUID -o value /dev/nvme0n1p2</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme_load=YES nowatchdog rw rd.luks.uuid=2c8e7bb4-9286-47e9-8823-12b79bf2810c root=/dev/mapper/vg0-lvroot
</code></pre></div></div>
<p>Exécutez ensuite <code class="language-plaintext highlighter-rouge">sudo reinstall-kernels</code> qui remplira les entrées et régénérera les initrds.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>reinstall-kernels
</code></pre></div></div>
<p>Si vous préférez utiliser les options actuelles du noyau du système en cours dexécution, vous pouvez rm le fichier /etc/kernel/cmdline, puis exécuter sudo reinstall-kernels.</p>
<h3 id="sortie-du-chroot-et-démontage">Sortie du chroot et démontage</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>exit
umount -R /mnt
</code></pre></div></div>
<h2 id="redémarrez-sur-le-système-lvm-on-luks-chiffré">Redémarrez sur le système LVM on LUKS chiffré</h2>
<p>Oter la clé USB , redémarrer</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>reboot
</code></pre></div></div>
<blockquote>
<p>FINI! Vous devriez maintenant avoir un système LVMonLUKS fonctionnel avec un volume logique séparé pour /home.</p>
</blockquote>
<h3 id="compléments">Compléments</h3>
<h4 id="accès-sudo">Accès sudo</h4>
<p>Modifier sudoers pour accès sudo sans mot de passe à lutilisateur yano</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>su # mot de passe root identique utilisateur
echo "yann ALL=(ALL) NOPASSWD: ALL" &gt;&gt; /etc/sudoers.d/20-yann
</code></pre></div></div>
<h4 id="historique-de-la-ligne-de-commande">Historique de la ligne de commande</h4>
<p>Ajoutez la recherche dhistorique de la ligne de commande au terminal<br />
Se connecter en utilisateur<br />
Tapez un début de commande précédent, puis utilisez shift + up (flèche haut) pour rechercher lhistorique filtré avec le début de la commande.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Global, tout utilisateur</span>
<span class="nb">echo</span> <span class="s1">'"\e[1;2A": history-search-backward'</span> | <span class="nb">sudo tee</span> <span class="nt">-a</span> /etc/inputrc
<span class="nb">echo</span> <span class="s1">'"\e[1;2B": history-search-forward'</span> | <span class="nb">sudo tee</span> <span class="nt">-a</span> /etc/inputrc
</code></pre></div></div>
<h4 id="modification-fstab">Modification fstab</h4>
<p>Ajout au fichier <code class="language-plaintext highlighter-rouge">/etc/fstab</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /dev/mapper/vg0-lvmedia
UUID=2b44ad46-3fd5-4f36-a503-b1e7507aa561 /srv/media ext4 rw,relatime 0 2
# /dev/mapper/ssd--512-virtuel
UUID=84bc1aa9-23ac-4530-b861-bc33171b7b42 /virtuel ext4 defaults 0 2
# /dev/mapper/vg--nas--one-sav
UUID=c5b9eefc-1daa-4a0d-8a72-6169b3c8c91f /sauvegardes ext4 defaults 0 2
# /dev/vg-nas-one/iso - Volume logique 200G du disque 4To
UUID=58f4b6c7-3811-41d5-9964-f47ac32375f6 /iso ext4 defaults 0 2
# LXC kvmdebeye dossiers partagés
#/srv/media /var/lib/lxc/kvmdebeye/rootfs/home/nspyan/media none bind 0 0
#/home/yann/scripts /var/lib/lxc/kvmdebeye/rootfs/home/nspyan/scripts none bind 0 0
#/dev/sdd1: LABEL="hdd500g" UUID="21b413f5-196e-49e2-995b-07eb39e32e23" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="ee37e746-3f0f-11ed-9462-066ab000c657"
UUID=21b413f5-196e-49e2-995b-07eb39e32e23 /mnt/freebox ext4 defaults 0 2
</code></pre></div></div>
<p>On monte les unités</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mount -a
</code></pre></div></div>
<p>On modifie les droits /srv/media</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chown $USER:$USER -R /srv/media/
</code></pre></div></div>
<h4 id="images-fond-décran--logos-connexion-et-grub">Images (fond décran + logos, connexion et grub)</h4>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo cp /srv/media/dplus/images/yannick/plouzane-nb.jpg /usr/share/backgrounds/xfce/ # écran 2
sudo cp /srv/media/dplus/images/yannick/Linux-Arch-1920x1080.jpg /usr/share/backgrounds/xfce/ # écran 1
sudo cp /srv/media/dplus/images/yannick/yannick-green.png /usr/share/pixmaps/
</code></pre></div></div>
<p>les images de fond décran <strong>/usr/share/backgrounds/xfce</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo cp /srv/media/dplus/images/Fonds/Linux-Arch-1920x1080.jpg /usr/share/backgrounds/xfce/
sudo cp /srv/media/dplus/images/yannick/yannick-green.png /usr/share/pixmaps/
</code></pre></div></div>
<p>Ecran et logo pour lightdm de la page de connexion</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo cp /srv/media/dplus/images/Fonds/archlinux-lightdm.png /usr/share/backgrounds/
sudo cp /srv/media/dplus/images/yannick/yannick53x64.png /usr/share/pixmaps/
</code></pre></div></div>
<h3 id="partage-disque">Partage disque</h3>
<p><a href="/2022/08/03/Partage_disque_externe_USB_sur_Freebox.html">Partage disque externe USB sur Freebox</a></p>
<h4 id="disque-freebox-partagé-freeusb2to">Disque freebox partagé FreeUSB2To</h4>
<p><strong>FreeBox</strong><br />
HDD Mobile 2To connecté en USB sur la freebox<br />
Nom de partage : FreeUSB2To + EXT4 + vérification après formatage<br />
Partage windows activé : yannfreebox + mot de passe</p>
<p><strong>PC1</strong><br />
Partage linux samba : <code class="language-plaintext highlighter-rouge">sudo pacman -S cifs-utils</code> Installé par défaut <br />
Point de montage : <code class="language-plaintext highlighter-rouge">sudo mkdir /mnt/FreeUSB2To</code> <br />
Lien : <code class="language-plaintext highlighter-rouge">sudo ln -s /mnt/FreeUSB2To $HOME/FreeUSB2To</code></p>
<p>Credential : /root/.smbcredentials avec 2 lignes<br />
username=XXXXXX<br />
password=XXXXXX</p>
<p>Droits</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo chown</span> <span class="nt">-R</span> root:root /root/.smbcredentials
<span class="nb">sudo chmod</span> <span class="nt">-R</span> 600 /root/.smbcredentials
</code></pre></div></div>
<p>Les fichiers systèmes</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /etc/systemd/system/mnt-FreeUSB2To.mount
[Unit]
Description=cifs mount script
Requires=network-online.target
After=network-online.service
[Mount]
What=//192.168.0.254/FreeUSB2To
Where=/mnt/FreeUSB2To
Options=credentials=/root/.smbcredentials,rw,uid=1000,gid=1000,vers=3.0
Type=cifs
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/mnt-FreeUSB2To.automount
[Unit]
Description=cifs mount script
Requires=network-online.target
After=network-online.service
[Automount]
Where=/mnt/FreeUSB2To
TimeoutIdleSec=10
[Install]
WantedBy=multi-user.target
</code></pre></div></div>
<p>Activation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable mnt-FreeUSB2To.automount --now
</code></pre></div></div>
<h4 id="partage-avec-lenovo-serveur-nfs">Partage avec Lenovo serveur NFS</h4>
<p><strong>PC1</strong><br />
Points de montage : <code class="language-plaintext highlighter-rouge">sudo mkdir /mnt/sharenfs</code> <br />
Lien : <code class="language-plaintext highlighter-rouge">sudo ln -s /mnt/sharenfs $HOME/sharenfs</code></p>
<p>Ajouter les points de montage du serveur nfs au fichier <code class="language-plaintext highlighter-rouge">/etc/fstab</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Les montage NFS du serveur lenovo 192.168.0.215
192.168.0.215:/ /mnt/sharenfs nfs4 nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10s,rsize=8192,wsize=8192
</code></pre></div></div>
<p>Rechargement et montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl daemon-reload &amp;&amp; sudo mount-a
</code></pre></div></div>
<h4 id="disque-lenovo-partagé-thinkshare-inactif">Disque Lenovo partagé thinkshare (INACTIF)</h4>
<p><strong>FreeBox</strong><br />
Nom de partage : thinkshare</p>
<p><strong>PC1</strong><br />
Partage linux samba : <code class="language-plaintext highlighter-rouge">sudo pacman -S cifs-utils</code> Installé par défaut <br />
Point de montage : <code class="language-plaintext highlighter-rouge">sudo mkdir /mnt/thinkshare</code> <br />
Lien : <code class="language-plaintext highlighter-rouge">sudo ln -s /mnt/thinkshare $HOME/thinkshare</code></p>
<p>Credential : /root/.smbthink avec 2 lignes<br />
username=XXXXXX<br />
password=XXXXXX</p>
<p>Droits</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo chown</span> <span class="nt">-R</span> root:root /root/.smbthink
<span class="nb">sudo chmod</span> <span class="nt">-R</span> 600 /root/.smbthink
</code></pre></div></div>
<p>Les fichiers systèmes</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /etc/systemd/system/mnt-thinkshare.mount
[Unit]
Description=cifs mount script
Requires=network-online.target
After=network-online.service
[Mount]
What=//192.168.0.215/thinkshare
Where=/mnt/thinkshare
Options=credentials=/root/.smbthink,rw,uid=1000,gid=1000,vers=3.0
Type=cifs
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/mnt-thinkshare.automount
[Unit]
Description=cifs mount script
Requires=network-online.target
After=network-online.service
[Automount]
Where=/mnt/thinkshare
TimeoutIdleSec=10
[Install]
WantedBy=multi-user.target
</code></pre></div></div>
<p>Activation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl enable mnt-thinkshare.automount --now
</code></pre></div></div>
<h4 id="dossiers-et-liens">Dossiers et Liens</h4>
<p>LVM , ajout media</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo lvcreate -L 500G vg0 -n lvmedia
sudo mkfs.ext4 /dev/mapper/vg0-lvmedia
sudo blkid -s UUID -o value /dev/mapper/vg0-lvmedia
</code></pre></div></div>
<p>renvoie lUUID du volume racine : <strong>1ca4bfc7-3d31-4859-aeb3-656214fab490</strong>.<br />
Ajouter au fstab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /dev/mapper/vg0-lvmedia
UUID=1ca4bfc7-3d31-4859-aeb3-656214fab490 /srv/media ext4 rw,relatime 0 2
</code></pre></div></div>
<p>Les dossiers et <strong>Liens sur les autres unités</strong> et les dossiers <code class="language-plaintext highlighter-rouge">.keepassx</code> , <code class="language-plaintext highlighter-rouge">Notes</code> , <code class="language-plaintext highlighter-rouge">scripts</code> <code class="language-plaintext highlighter-rouge">statique/images</code> et <code class="language-plaintext highlighter-rouge">statique/_posts</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /srv/media/{Notes,statique}
sudo mkdir -p /srv/media/statique/{images,_posts}
sudo ln -s /srv/media $HOME/media
sudo mkdir -p /virtuel
sudo ln -s /virtuel $HOME/virtuel
mkdir -p ~/{.ssh,.keepassx}
</code></pre></div></div>
<p>Créer liens sharenfs</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ln</span> <span class="nt">-s</span> /mnt/sharenfs/pc1/.borg <span class="nv">$HOME</span>/.borg
<span class="nb">ln</span> <span class="nt">-s</span> /mnt/sharenfs/pc1/scripts <span class="nv">$HOME</span>/scripts
</code></pre></div></div>
<p><strong>Liens “statique” et “Notes”</strong><br />
les liens pour la rédaction des posts markdown et le dossier des fichiers</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Lien pour affichage des images avec éditeur Retext</span>
<span class="nb">sudo ln</span> <span class="nt">-s</span> /srv/media/statique/images /images
<span class="c"># Lien pour les fichiers autres</span>
<span class="nb">sudo ln</span> <span class="nt">-s</span> /srv/media/statique/files /files
</code></pre></div></div>
<p>les liens pour les images de Nextcloud Notes</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir /div
sudo ln -s /srv/media/img /div/img
</code></pre></div></div>
<p><strong>Dossiers Documents et Musique</strong><br />
Supprimer les dossiers par défaut Documents et Musique et créer des liens</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># suppression Documents et Musique
sudo rm -r $HOME/Documents
sudo rm -r $HOME/Musique
#Création des liens
sudo ln -s /srv/media/Documents $HOME/Documents
sudo ln -s /mnt/sharenfs/Musique $HOME/Musique
</code></pre></div></div>
<h2 id="endeavouros-xfce">EndeavourOS XFCE</h2>
<h3 id="mise-à-jour-endeavouros">Mise à jour EndeavourOS</h3>
<h4 id="mode-graphique">Mode graphique</h4>
<p><img src="/images/eos-cassini-009.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-009a.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-009c.png" alt="" width="300" /></p>
<p><img src="/images/eos-cassini-010.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-010a.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-010b.png" alt="" width="300" /></p>
<p><img src="/images/eos-cassini-011.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-011a.png" alt="" width="400" /><br />
<img src="/images/eos-cassini-011b.png" alt="" width="300" /><br />
<img src="/images/eos-cassini-011c.png" alt="" width="400" /></p>
<h4 id="résumé">Résumé</h4>
<p><img src="/images/eos-welcome.png" alt="" /></p>
<h3 id="déverrouillage-des-volumes-luks2">Déverrouillage des volumes LUKS2</h3>
<p>Description</p>
<ul>
<li>Slot 0 pour le déverrouillage du volume par saisie dune phrase mot de passe.</li>
<li>Slot 1 et 2 pour le déverrouillage par des clés (2 ième clé en cas de perte ou casse) avec un appui sur une touche.</li>
<li>Slot 3 - Ajout dune phrase mot de passe pour le recovery</li>
</ul>
<p>Au final nous aurons 4 “slot” utilisés</p>
<p>Installer librairie libfido2 pour la prise en charge des clés Yubico et SoloKeys</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman -S libfido2
</code></pre></div></div>
<h4 id="enroler-clé-usb-yubikey-5-nfc">Enroler clé USB YubiKey 5 NFC</h4>
<p><img src="/images/yubikey5nfc.png" alt="" height="150" /></p>
<p>Vérifier que la YubiKey est insérée dans un port USB</p>
<p>Lister et enroler la yubikey</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemd-cryptenroll --fido2-device=list
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PATH MANUFACTURER PRODUCT
/dev/hidraw5 Yubico YubiKey OTP+FIDO+CCID
</code></pre></div></div>
<p>Enroler la clé pour le déverrouillage du disque chiffré nvme0n1p2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemd-cryptenroll --fido2-device=auto /dev/nvme0n1p2
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🔐 Please enter current passphrase for disk /dev/nvme0n1p2: *********************
Requested to lock with PIN, but FIDO2 device /dev/hidraw5 does not support it, disabling.
Initializing FIDO2 credential on security token.
👆 (Hint: This might require confirmation of user presence on security token.)
Generating secret key on FIDO2 security token.
👆 In order to allow secret key generation, please confirm presence on security token.
New FIDO2 token enrolled as key slot 1.
</code></pre></div></div>
<p class="info">Le <strong>Y</strong> de la clé se met à clignoter , il suffit de poser son doigt sur lemplacement du <strong>Y</strong> pour le déverrouillage</p>
<p>Retirer la première clé et insérer la seconde clé USB YubiKey 5 NFC, puis exécuter la commande</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemd-cryptenroll --fido2-device=auto /dev/nvme0n1p2
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🔐 Please enter current passphrase for disk /dev/nvme0n1p2: *********************
Requested to lock with PIN, but FIDO2 device /dev/hidraw5 does not support it, disabling.
Initializing FIDO2 credential on security token.
👆 (Hint: This might require confirmation of user presence on security token.)
Generating secret key on FIDO2 security token.
👆 In order to allow secret key generation, please confirm presence on security token.
New FIDO2 token enrolled as key slot 2.
</code></pre></div></div>
<h4 id="enroler-une-passphrase-de-recouvrement">Enroler une passphrase de recouvrement</h4>
<p>Les jetons et puces de sécurité FIDO2, PKCS#11 et TPM2 sassocient bien avec les clés de recouvrement : puisque vous navez plus besoin de taper votre mot de passe tous les jours, il est logique de vous en débarrasser et denregistrer à la place une clé de recouvrement à forte entropie que vous imprimez ou scannez hors écran et conservez dans un endroit physique sûr.<br />
Voici comment procéder :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemd-cryptenroll --recovery-key /dev/nvme0n1p2
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🔐 Please enter current passphrase for disk /dev/nvme0n1p2: ***********
A secret recovery key has been generated for this volume:
🔐 vbcrnbjn-vkrkihte-rctbufne-nlihihjl-tegudteu-rkjthcgd-hvhuvgik-rugeregh
Please save this secret recovery key at a secure location. It may be used to
regain access to the volume if the other configured access credentials have
been lost or forgotten. The recovery key may be entered in place of a password
whenever authentication is requested.
New recovery key enrolled as key slot 3.
</code></pre></div></div>
<p>Cette opération génère une clé, lenregistre dans le volume LUKS2, laffiche à lécran et génère un code QR que vous pouvez scanner en dehors de lécran si vous le souhaitez.<br />
La clé possède la plus grande entropie et peut être saisie partout où vous pouvez saisir une phrase dauthentification.<br />
Cest pourquoi il nest pas nécessaire de modifier le fichier /etc/crypttab pour que la clé de récupération fonctionne.</p>
<h4 id="enroler-une-clé-usb-solokeys-optionnel">Enroler une clé USB SoloKeys (OPTIONNEL)</h4>
<p><img src="/images/solokeys.png" alt="" /></p>
<p>Lister la clé</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemd-cryptenroll --fido2-device=list
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PATH MANUFACTURER PRODUCT
/dev/hidraw4 SoloKeys Solo 4.1.5
</code></pre></div></div>
<p>Ajout de la solokeys</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemd-cryptenroll --fido2-device=auto /dev/nvme0n1p2
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🔐 Please enter current passphrase for disk /dev/nvme0n1p2: ***********
Requested to lock with PIN, but FIDO2 device /dev/hidraw1 does not support it, disabling.
Initializing FIDO2 credential on security token.
👆 (Hint: This might require confirmation of user presence on security token.)
Generating secret key on FIDO2 security token.
👆 In order to allow secret key generation, please confirm presence on security token.
New FIDO2 token enrolled as key slot 3.
</code></pre></div></div>
<p class="info">Lors du boot , le <strong>S</strong> de la SoloKeys passe au ROUGE et il suffit dappuyer sur le voyant pour quil repasse au vert afin de lancer le processus de déchiffrement et finir le démarrage</p>
<h4 id="prise-en-charge-yubikey-et-solokey">Prise en charge YubiKey et SoloKey</h4>
<p>Les options timeout de <a href="https://www.man7.org/linux/man-pages/man5/crypttab.5.html">crypttab</a></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>timeout=
Spécifie le délai d'attente pour la demande d'un mot de passe. Si aucune unité
n'est spécifiée, l'unité utilisée est la seconde. Les unités prises en charge sont s, ms, us,
min, h, d. Un délai de 0 permet d'attendre indéfiniment (valeur par défaut).
token-timeout=
Spécifie le temps d'attente maximum pour que les dispositifs de sécurité configurés (c'est-à-dire FIDO2, PKCS#11, TPM2) apparaissent.
configurés (c'est-à-dire FIDO2, PKCS#11, TPM2). Prend une valeur
en secondes (mais d'autres unités de temps peuvent être spécifiées,
voir systemd.time(7) pour les formats supportés). La valeur par défaut est 30s.
Une fois le délai spécifié écoulé, l'authentification par
mot de passe est tentée. Notez que ce délai s'applique à
l'attente de l'apparition du dispositif de sécurité - il ne s'applique pas
ne s'applique pas à la demande de code PIN pour le dispositif (le cas échéant)
ou autre. Passez 0 pour désactiver le délai et attendre indéfiniment.
</code></pre></div></div>
<p>Configurer /etc/crypttab pour la prise en charge des clés</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/crypttab
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># &lt;name&gt; &lt;device&gt; &lt;password&gt; &lt;options&gt;
#cryptlvm UUID=2c8e7bb4-9286-47e9-8823-12b79bf2810c /crypto_keyfile.bin luks
cryptlvm UUID=2c8e7bb4-9286-47e9-8823-12b79bf2810c - fido2-device=auto,token-timeout=20s
</code></pre></div></div>
<p>Sauvegarder et quitter.</p>
<p>Réinitialiser</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo reinstall-kernels
</code></pre></div></div>
<p><code class="language-plaintext info highlighter-rouge">Redémarrer la machine</code></p>
<h3 id="plymouth---processus-de-démarrage-graphique">Plymouth - Processus de démarrage graphique</h3>
<p><a href="/2023/10/14/Plymouth_Processus_de_demarrage_graphique.html">Plymouth - Processus de démarrage graphique</a></p>
<h3 id="pavé-numérique-au-boot">Pavé numérique au boot</h3>
<p><strong>Avec un service systemd</strong></p>
<p>installer le paquetage AUR et en activer le service numLockOnTty</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S systemd-numlockontty
sudo systemctl enable numLockOnTty --now
</code></pre></div></div>
<h3 id="paramètres-xfce">Paramètres XFCE</h3>
<h4 id="tableau-de-bord">Tableau de bord</h4>
<p>On déplace le <strong>tableau de bord</strong> du bas vers le haut de lécran</p>
<p>Modification du <strong>tableau de bord</strong> , clic-droit → Tableau de bord → Préférences de tableau de bord → Eléments</p>
<p>Affichage date et heure<br />
<img src="/images/eos-cassini-012.png" alt="" /><br />
ou <strong>format personnalisé</strong> dans <strong>Horloge</strong> : <code class="language-plaintext highlighter-rouge">%e %b %Y %R</code></p>
<p>Gestionnaire dalimentation (Batterie et Branché)<br />
<img src="/images/eos-cassini-013.png" alt="" width="400" /></p>
<h4 id="fond-écran">Fond écran</h4>
<p>Facultatif - Les fonds décran → <code class="language-plaintext highlighter-rouge">/usr/share/endeavouros/backgrounds/</code></p>
<h4 id="lightdm">LightDM</h4>
<p><em>Utilise <code class="language-plaintext highlighter-rouge">lightdm-slick-greeter</code> Un greeter basé sur GTK plus axé sur lapparence que <code class="language-plaintext highlighter-rouge">lightdm-gtk-greeter</code></em></p>
<p>Les paramètres sont dans le fichier <code class="language-plaintext highlighter-rouge">/etc/lightdm/slick-greeter.conf</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Greeter]
background=/usr/share/endeavouros/backgrounds/endeavouros-wallpaper.png
draw-user-backgrounds=false
draw-grid=true
theme-name=Arc-Dark
icon-theme-name=Qogir
cursor-theme-name=Qogir
cursor-theme-size=16
show-a11y=false
show-power=false
background-color=#000000
</code></pre></div></div>
<p>Démarre auto ou pas de la session, modifier le fichier <code class="language-plaintext highlighter-rouge">/etc/lightdm/lightdm.conf</code> , (début ligne sans ou avec commentaire <code class="language-plaintext highlighter-rouge">#</code>)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/lightdm/lightdm.conf
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Seat:*]
autologin-user=yann
</code></pre></div></div>
<p>Ecran principal pour la fenêtre de connexion : <a href="/2023/08/02/EndeavourOS_XFCE_-_Environnements_de_bureau_LightDM.html">EndeavourOS XFCE - LightDM sur les systèmes multi-affichages</a></p>
<p>Si vous changez limage de fond, il désactiver draw-grid</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>background=/usr/share/endeavouros/backgrounds/light_sky_stars_85555_1366x768_yano.jpg
draw-grid=false
</code></pre></div></div>
<h3 id="applications-et-paquets">Applications et Paquets</h3>
<p>On commence par tout ce qui est graphique : gimp, cups (gestion de limprimante) et hplip (si vous avez une imprimante scanner Hewlett Packard). Le paquet python-pyqt5 est indispensable pour linterface graphique de HPLIP+scan. Webkigtk2 étant indispensable pour la lecture de laide en ligne de Gimp. outil rsync, Retext éditeur markdown, firefox fr, thunderbird, libreoffice, gdisk, bluefish, <strong>Double Commander</strong> , <strong>Menulibre</strong> pour la gestion des menus , outils android clementine</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay <span class="nt">-S</span> cups system-config-printer gimp hplip libreoffice-fresh-fr thunderbird-i18n-fr jq figlet p7zip xsane tmux calibre retext bluefish gedit doublecmd-gtk2 terminator filezilla minicom zenity android-tools yt-dlp qrencode zbar xclip nmap jre-openjdk-headless openbsd-netcat borg xterm gparted tigervnc xournalpp qbittorrent ldns
<span class="c"># Fuse borg mount</span>
yay <span class="nt">-S</span> python-llfuse
<span class="c"># Scripts to aid in installing Arch Linux (ex: arch-chroot)</span>
yay <span class="nt">-S</span> arch-install-scripts
<span class="c"># Autres avec compilation</span>
yay <span class="nt">-S</span> freetube brave-nightly signal-desktop
</code></pre></div></div>
<p>Gestion des menus du bureau, construction du paquet avant installation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S menulibre
</code></pre></div></div>
<p>Firefox en français</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S firefox-i18n-fr
</code></pre></div></div>
<h4 id="tmux">Tmux</h4>
<details>
<summary><b>Etendre Réduire fichier de configuration "~/.tmux.conf"</b></summary>
<figure class="highlight"><pre><code class="language-text" data-lang="text">
#Configuration de tmux
#Origine : http://denisrosenkranz.com
#Yannick juin 2017
# Copier/Coller par la souris se fait avec la touche "Shift" appuyée
##################################
#Changements des raccourcis claviers
##################################
#On change Control +b par Control +x
#set -g prefix C-x
#unbind C-b
#bind C-x send-prefix
#On utilise control + flèches pour naviguer entre les terminaux
bind-key -n C-right next
bind-key -n C-left prev
#on utilise alt + flèches our naviguer entre les panels
bind-key -n M-left select-pane -L
bind-key -n M-right select-pane -R
bind-key -n M-up select-pane -U
bind-key -n M-down select-pane -D
#On change les raccourcis pour faire du split vertical et horizontal
#On utilise la touche "|" (pipe) pour faire un split vertical
bind | split-window -h
#Et la touche "-" pour faire un split horizontal
bind - split-window -v
##################################
#Changements pratiques
##################################
#On permet l'utilisation de la souris pour changer de terminal et de panel
set -g mouse on
# Sélection zone par clic gauche souris (texte sélectionné sur fond jaune)
# Après relachement du clic , le texte sélectionné est copié dans le presse-papier
# Le fond jaune disparaît
set-option -s set-clipboard off
# For emacs copy mode bindings
# Il faut installer l'utilitaire 'xclip' (sudo pacman -S xclip)
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
#Les fenêtres commencent par 1 et non par 0
set -g base-index 1
##################################
#Changements visuels
##################################
#On met les panneaux non actif en gris
#set -g pane-border-fg colour244
#set -g pane-border-bg default
#On met le panneau actif en rouge
#set -g pane-active-border-fg colour124
#set -g pane-active-border-bg default
#On met la barre de status en gris
set -g status-fg colour235
set -g status-bg colour250
#set -g status-attr dim
# On surligne les fenêtres actives dans la barre de status en gris foncés
#set-window-option -g window-status-current-fg colour15
#set-window-option -g window-status-current-bg colour0</code></pre></figure>
</details>
<h4 id="minicom">Minicom</h4>
<p>Paramétrage de lapplication terminale <strong>minicom</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> sudo minicom -s
</code></pre></div></div>
<blockquote>
<p>Seul les paramètres à modifier sont cités</p>
</blockquote>
<p>Configuration du port série<br />
<img src="/images/minicom01.png" alt="" /><br />
A - Port série : <strong>/dev/ttyUSB0</strong> <br />
F - Contrôle de flux matériel : <strong>Non</strong><br />
<img src="/images/minicom02.png" alt="" /><br />
Echap<br />
Enregistrer config. sous dfl<br />
<img src="/images/minicom03.png" alt="" /><br />
Sortir de Minicom</p>
<h4 id="flameshot-copie-écran">Flameshot (copie écran)</h4>
<p><strong>Copie écran (flameshot)</strong><br />
<strong><a href="https://github.com/lupoDharkael/flameshot">Flameshot</a></strong> cest un peu THE TOOL pour faire des captures décrans</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S flameshot
</code></pre></div></div>
<p>Lancer lapplication XFCE Flameshot et licône est visible dans la barre des tâches<br />
<img src="/images/flameshot_e6230-1a.png" alt="" width="300" /></p>
<p>Paramétrage de flameshot, clic droit sur icône , Configuration <br />
<img src="/images/flameshot_e6230-1b.png" alt="" width="300" /><br />
Paramétrage de flameshot<br />
<img src="/images/flameshot01.png" alt="" width="300" /></p>
<h4 id="scrpy-émulation-android">scrpy émulation android</h4>
<p>Utilise adb et le port USB</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S scrcpy
</code></pre></div></div>
<p><code class="language-plaintext warning highlighter-rouge">Ce qui suit n'est pas nécessaire car l'installation crée l'icône de lancement de l'application</code></p>
<p>Créer le dossier</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir -p $HOME/.local/share/applications
</code></pre></div></div>
<p>Créer le fichier <code class="language-plaintext highlighter-rouge">$HOME/.local/share/applications/scrcpy-android.desktop</code> avec le contenu suivant</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Desktop Entry]
Version=1.1
Type=Application
Name=ScrCpy (Android)
Comment=Votre smartphone sur le bureau
Icon=phone
Exec=/usr/bin/scrcpy
Path=/home/yann
Actions=
Categories=Utility;X-XFCE;X-Xfce-Toplevel;
Terminal=false
StartupNotify=false
</code></pre></div></div>
<h4 id="client-nextcloud">Client Nextcloud</h4>
<p>Installation client nextcloud</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S nextcloud-client libgnome-keyring gnome-keyring
</code></pre></div></div>
<p>Démarrer le client nextcloud , après avoir renseigné lurl ,login et mot de passe pour la connexion</p>
<p>Trousseau de clé avec mot de passe idem connexion utilisateur</p>
<p>Paramétrage</p>
<ul>
<li>Menu → Lancer <strong>Client de synchronisation nextcloud</strong></li>
<li>Adresse du serveur : <a href="https://cloud.xoyaz.xyz">https://cloud.xoyaz.xyz</a><br />
<img src="/images/nextcloud_xfce01.png" alt="" width="300" /></li>
<li>Nom dutilisateur : yann</li>
<li>Mot de passe : xxxxx<br />
<img src="/images/nextcloud_xfce02.png" alt="" width="200" /><br />
<img src="/images/nextcloud_xfce03.png" alt="" width="300" /><br />
<img src="/images/nextcloud_xfce04.png" alt="" width="200" /></li>
<li>Sauter les dossiers à synchroniser, Ignorer la configuration des dossiers</li>
<li>Trousseau de clés = mot de passe connexion utilisateur<br />
<img src="/images/nextcloud_xfce05.png" alt="" width="400" /></li>
<li>Paramètres nextcloud<br />
<img src="/images/e6230-nextcloud-a.png" alt="" width="400" /></li>
</ul>
<p>Saisir les différents dossiers à synhroniser<br />
<img src="/images/e6230-nextcloud.png" alt="" width="400" /></p>
<p>Au prochain redémarrage, il faudra confirmer le mot de passe du trousseau</p>
<h4 id="gestion-mot-de-passe-keepassxc">Gestion mot de passe (keepassxc)</h4>
<p><img src="/images/KeePassXC.png" alt="" width="50" /><br />
Ajouter une synchronisation de dossier nextcloud : /home/yano/.keepassx (local) → Home/.keepasx (serveur)<br />
Télécharger la clé <strong>yannick_keepassxc.key</strong> dans <strong>~/.ssh</strong></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>scp <span class="nt">-P</span> 56230 <span class="nt">-i</span> ~/.ssh/e6230 ~/.ssh/yannick_keepassxc.key yano@192.168.0.20:/home/yano/.ssh/
</code></pre></div></div>
<p>Installer keepassxc</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S keepassxc
</code></pre></div></div>
<p>Ajouter aux favoris “KeepassXC” et lancer lapplication → <strong>Ouvrir une base de données existante</strong><br />
Base de données &gt; Ouvrir une base de données (afficher les fichiers cachés) : <strong>~/.keepassx/yannick_xc.kdbx</strong> &gt; Ouvrir<br />
<img src="/images/e6230-keepassx01.png" alt="" width="400" /></p>
<p><strong>Affichage → Thème</strong> : Sombre<br />
<strong>Affichage → Mode compact</strong> , un redémarrage de lapplication est nécessaire</p>
<h4 id="sshfs-facultatif">SSHFS (facultatif)</h4>
<p><img src="/images/sshfs-logo.png" alt="" width="50" /><br />
<em>SSHFS sert à monter sur son système de fichier, un autre système de fichier distant, à travers une connexion SSH, le tout avec des droits utilisateur.</em></p>
<p>Installer paquet SSHFS</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S sshfs
</code></pre></div></div>
<p class="warning">sshfs est installé par défaut sur la distribution EndeavourOS</p>
<p>Création des partages utilisés par sshfs (facultatif)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir -p $HOME/vps/{borgbackup,lxc,vdb,xoyaz.xyz,xoyize.xyz}
</code></pre></div></div>
<p>Exemple de montage manuel<br />
<code class="language-plaintext highlighter-rouge">sshfs -oIdentityFile=&lt;clé privée&gt; utilisateur@domaine.tld:&lt;dossier distant&gt; &lt;dossier local&gt; -C -p &lt;port si dfférent de 22&gt;</code></p>
<h4 id="thunderbird">Thunderbird</h4>
<p>Lancer thunderbird à louverture de session xfce<br />
Paramètres → Session et démarrage → Démarrage automatique dapplication<br />
<img src="/images/thunderbird01.png" alt="" width="300" /></p>
<p>Ajouter thunderbird aux favoris et lancer</p>
<p><strong>Comptes de messagerie</strong></p>
<ul>
<li>Paramètrer les différents compte de messagerie</li>
<li>Compte ProtonMail
<ol>
<li>Comment paramétrer Mozilla Thunderbird pour ProtonMail Bridge, ouvrir le lien suivant <a href="/2022/08/06/Proton_Mail.html">Proton Mail</a>
<ul>
<li>Paramétrer le compte de messagerie ProtonMail</li>
</ul>
</li>
</ol>
</li>
</ul>
<p><em>Si vous souhaitez que Thunderbird soit minimisé dans la zone de notification, vous devez installer une application indépendante pour déplacer Thunderbird dans la zone de notification chaque fois quil est minimisé. Sous Linux, je recommande KDocker (disponible dans de nombreuses distributions Linux).</em></p>
<p><em>KDocker est pratique lorsque vous souhaitez intégrer une application graphique dans la barre détat système, étant donné que lapplication en question ne dispose pas de sa propre fonctionnalité pour la placer dans la barre détat système. Bien quelle nait pas été mise à jour depuis 2005, la dernière version publiée le 5 avril 2005 est suffisamment bonne et, selon le site officiel, elle fonctionne avec tous les gestionnaires de fenêtres conformes à la norme NET WM. Pour nen citer que quelques-uns : KDE, GNOME, Xfce, Blackbox ou Fluxbox. Je ne lai utilisé que dans KDE 3.5.9, mais je suis sûr quil fonctionne bien dans les autres environnements de bureau aussi, si vous ne voulez pas utiliser une application dancrage native, comme ALLTray pour GNOME.</em></p>
<ul>
<li>Paramètres → Modules complémentaires et thèmes
<ul>
<li><strong>Thèmes</strong> : Activer <strong>sombre</strong></li>
<li><strong>Extensions</strong> : Installer <strong>Minimize on Close</strong></li>
</ul>
</li>
</ul>
<p><strong>Calendriers et contacts</strong></p>
<p><code class="language-plaintext highlighter-rouge">Alt+m</code> pour afficher la bare de menu<br />
<img src="/images/e6230-thunderbird02.png" alt="" width="400" /></p>
<ul>
<li><strong>Calendrier</strong><br />
<img src="/images/e6230-thunderbird03.png" alt="" width="400" /><br />
<img src="/images/e6230-thunderbird04.png" alt="" width="400" /><br />
<img src="/images/e6230-thunderbird05.png" alt="" width="400" /><br />
Saisir le mot de passe<br />
<img src="/images/e6230-thunderbird06.png" alt="" width="400" /><br />
<img src="/images/e6230-thunderbird07.png" alt="" width="400" /></li>
<li><strong>Contacts</strong><br />
Outils → Carnet dadresses<br />
<img src="/images/e6230-thunderbird08.png" alt="" width="400" /><br />
<img src="/images/e6230-thunderbird09.png" alt="" width="250" /><br />
<img src="/images/e6230-thunderbird10.png" alt="" width="250" /><br />
<img src="/images/e6230-thunderbird11.png" alt="" width="250" /></li>
</ul>
<h4 id="radio-via-internet-facultatif">Radio via internet (facultatif)</h4>
<p>Installation au choix</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S radiotray
yay -S geocode-glib tuner-git
</code></pre></div></div>
<h4 id="gestionnaire-de-fichiers">Gestionnaire de fichiers</h4>
<p><em>Double Commander est un gestionnaire de fichiers open source multiplateforme avec deux panneaux côte à côte. Il sinspire de Total Commander</em></p>
<p>Application GTK ou QT</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S doublecmd-gtk2
yay -S doublecmd-qt5
</code></pre></div></div>
<p>Les paramètres sont stockés dans le dossier <code class="language-plaintext highlighter-rouge">~/.config/doublecmd</code></p>
<h4 id="bashrc---alias-et-couleurs">bashrc - alias et couleurs</h4>
<p>Dans le fichier ~/.bashrc</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>alias
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>alias aide='xdg-open https://static.lxcdeb.local/aide-jekyll-text-theme.html#autres-styles'
alias android='/home/yann/virtuel/KVM/bliss.sh'
alias audio='yt-dlp --extract-audio --audio-format m4a --audio-quality 0 --output "~/Musique/%(title)s.%(ext)s"'
alias audiomp3='yt-dlp --extract-audio --audio-format mp3 --audio-quality 0 --output "~/Musique/%(title)s.%(ext)s"'
alias borglist='/home/yann/scripts/borglist.sh'
alias certok='/home/yann/scripts/ssl-cert-check'
alias compress='/home/yann/scripts/compress'
alias dnsleak='/home/yann/scripts/dnsleaktest.py'
alias domain='/home/yann/scripts/domain-check-2.sh -f /home/yann/scripts/domain-list.txt'
alias findh='cat /home/yann/scripts/findhelp.txt'
alias homer='/home/yann/media/dplus/python-dev/homer/remoh.py'
alias ipleak='curl https://ipv4.ipleak.net/json/'
alias l='ls -lav --ignore=.?*'
alias ll='ls -lav --ignore=..'
alias ls='ls --color=auto'
alias mediasync='/home/yann/scripts/sav-yann-media.sh'
alias nmapl='sudo nmap -T4 -sP 192.168.0.0/24'
alias odt2html='/home/yann/scripts/_odt2html+index'
alias orphelin='sudo pacman -Rsn $(pacman -Qdtq)'
alias otp='/home/yann/scripts/generer-code-2fa-vers-presse-papier-toutes-les-30s.sh'
alias rename='/home/yann/scripts/remplacer-les-espaces-accents-dans-une-expression.sh'
alias service='systemctl --type=service'
alias sshm='/home/yann/scripts/ssh-manager.sh'
alias ssl='/home/yann/scripts/ssl-cert-check'
alias static='cd /home/yann/media/yannstatic; /home/yann/.rbenv/shims/bundle exec jekyll build -d /home/yann/media/yannstatic/static; cd ~'
alias status='/home/yann/scripts/status.sh'
alias toc='/home/yann/scripts/toc/toc.sh'
alias tocplus='/home/yann/scripts/toc/tocplus.sh'
alias traduc='/usr/local/bin/trans'
alias vncasus='sh /home/yann/scripts/vncasus.sh'
alias vncdell='sh /home/yann/scripts/vncdell.sh'
alias vncmarina='sh /home/yann/scripts/vncmarina.sh'
alias x96='adb connect 192.168.0.22:5555'
alias youtube='yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" --output "~/Vidéos/%(title)s.%(ext)s" --ignore-errors'
</code></pre></div></div>
<p>Couleurs</p>
<p>Générons un fichier de configuration par défaut en utilisant l option print-database de la commande dircolors</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dircolors --print-database &gt; ~/.dir_colors
</code></pre></div></div>
<details>
<summary><b>Etendre Réduire .dir_colors</b></summary>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash">
<span class="c"># Configuration file for dircolors, a utility to help you set the</span>
<span class="c"># LS_COLORS environment variable used by GNU ls with the --color option.</span>
<span class="c"># Copyright (C) 1996-2023 Free Software Foundation, Inc.</span>
<span class="c"># Copying and distribution of this file, with or without modification,</span>
<span class="c"># are permitted provided the copyright notice and this notice are preserved.</span>
<span class="c">#</span>
<span class="c"># The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the</span>
<span class="c"># slackware version of dircolors) are recognized but ignored.</span>
<span class="c"># Global config options can be specified before TERM or COLORTERM entries</span>
<span class="c"># ===================================================================</span>
<span class="c"># Terminal filters</span>
<span class="c"># ===================================================================</span>
<span class="c"># Below are TERM or COLORTERM entries, which can be glob patterns, which</span>
<span class="c"># restrict following config to systems with matching environment variables.</span>
COLORTERM ?<span class="k">*</span>
TERM Eterm
TERM ansi
TERM <span class="k">*</span>color<span class="k">*</span>
TERM con[0-9]<span class="k">*</span>x[0-9]<span class="k">*</span>
TERM cons25
TERM console
TERM cygwin
TERM <span class="k">*</span>direct<span class="k">*</span>
TERM dtterm
TERM gnome
TERM hurd
TERM jfbterm
TERM konsole
TERM kterm
TERM linux
TERM linux-c
TERM mlterm
TERM putty
TERM rxvt<span class="k">*</span>
TERM screen<span class="k">*</span>
TERM st
TERM terminator
TERM tmux<span class="k">*</span>
TERM vt100
TERM xterm<span class="k">*</span>
<span class="c"># ===================================================================</span>
<span class="c"># Basic file attributes</span>
<span class="c"># ===================================================================</span>
<span class="c"># Below are the color init strings for the basic file types.</span>
<span class="c"># One can use codes for 256 or more colors supported by modern terminals.</span>
<span class="c"># The default color codes use the capabilities of an 8 color terminal</span>
<span class="c"># with some additional attributes as per the following codes:</span>
<span class="c"># Attribute codes:</span>
<span class="c"># 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed</span>
<span class="c"># Text color codes:</span>
<span class="c"># 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white</span>
<span class="c"># Background color codes:</span>
<span class="c"># 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white</span>
<span class="c">#NORMAL 00 # no color code at all</span>
<span class="c">#FILE 00 # regular file: use no color at all</span>
RESET 0 <span class="c"># reset to "normal" color</span>
FILE 01<span class="p">;</span>33
DIR 01<span class="p">;</span>34 <span class="c"># directory</span>
LINK 01<span class="p">;</span>36 <span class="c"># symbolic link. (If you set this to 'target' instead of a</span>
<span class="c"># numerical value, the color is as for the file pointed to.)</span>
MULTIHARDLINK 00 <span class="c"># regular file with more than one link</span>
FIFO 40<span class="p">;</span>33 <span class="c"># pipe</span>
SOCK 01<span class="p">;</span>35 <span class="c"># socket</span>
DOOR 01<span class="p">;</span>35 <span class="c"># door</span>
BLK 40<span class="p">;</span>33<span class="p">;</span>01 <span class="c"># block device driver</span>
CHR 40<span class="p">;</span>33<span class="p">;</span>01 <span class="c"># character device driver</span>
ORPHAN 40<span class="p">;</span>31<span class="p">;</span>01 <span class="c"># symlink to nonexistent file, or non-stat'able file ...</span>
MISSING 00 <span class="c"># ... and the files they point to</span>
SETUID 37<span class="p">;</span>41 <span class="c"># file that is setuid (u+s)</span>
SETGID 30<span class="p">;</span>43 <span class="c"># file that is setgid (g+s)</span>
CAPABILITY 00 <span class="c"># file with capability (very expensive to lookup)</span>
STICKY_OTHER_WRITABLE 30<span class="p">;</span>42 <span class="c"># dir that is sticky and other-writable (+t,o+w)</span>
OTHER_WRITABLE 34<span class="p">;</span>42 <span class="c"># dir that is other-writable (o+w) and not sticky</span>
STICKY 37<span class="p">;</span>44 <span class="c"># dir with the sticky bit set (+t) and not other-writable</span>
<span class="c"># This is for files with execute permission:</span>
EXEC 01<span class="p">;</span>32
<span class="c"># ===================================================================</span>
<span class="c"># File extension attributes</span>
<span class="c"># ===================================================================</span>
<span class="c"># List any file extensions like '.gz' or '.tar' that you would like ls</span>
<span class="c"># to color below. Put the suffix, a space, and the color init string.</span>
<span class="c"># (and any comments you want to add after a '#').</span>
<span class="c"># Suffixes are matched case insensitively, but if you define different</span>
<span class="c"># init strings for separate cases, those will be honored.</span>
<span class="c">#</span>
<span class="c"># If you use DOS-style suffixes, you may want to uncomment the following:</span>
<span class="c">#.cmd 01;32 # executables (bright green)</span>
<span class="c">#.exe 01;32</span>
<span class="c">#.com 01;32</span>
<span class="c">#.btm 01;32</span>
<span class="c">#.bat 01;32</span>
<span class="c"># Or if you want to color scripts even if they do not have the</span>
<span class="c"># executable bit actually set.</span>
<span class="c">#.sh 01;32</span>
<span class="c">#.csh 01;32</span>
<span class="c"># archives or compressed (bright red)</span>
.tar 01<span class="p">;</span>31
.tgz 01<span class="p">;</span>31
.arc 01<span class="p">;</span>31
.arj 01<span class="p">;</span>31
.taz 01<span class="p">;</span>31
.lha 01<span class="p">;</span>31
.lz4 01<span class="p">;</span>31
.lzh 01<span class="p">;</span>31
.lzma 01<span class="p">;</span>31
.tlz 01<span class="p">;</span>31
.txz 01<span class="p">;</span>31
.tzo 01<span class="p">;</span>31
.t7z 01<span class="p">;</span>31
.zip 01<span class="p">;</span>31
.z 01<span class="p">;</span>31
.dz 01<span class="p">;</span>31
.gz 01<span class="p">;</span>31
.lrz 01<span class="p">;</span>31
.lz 01<span class="p">;</span>31
.lzo 01<span class="p">;</span>31
.xz 01<span class="p">;</span>31
.zst 01<span class="p">;</span>31
.tzst 01<span class="p">;</span>31
.bz2 01<span class="p">;</span>31
.bz 01<span class="p">;</span>31
.tbz 01<span class="p">;</span>31
.tbz2 01<span class="p">;</span>31
.tz 01<span class="p">;</span>31
.deb 01<span class="p">;</span>31
.rpm 01<span class="p">;</span>31
.jar 01<span class="p">;</span>31
.war 01<span class="p">;</span>31
.ear 01<span class="p">;</span>31
.sar 01<span class="p">;</span>31
.rar 01<span class="p">;</span>31
.alz 01<span class="p">;</span>31
.ace 01<span class="p">;</span>31
.zoo 01<span class="p">;</span>31
.cpio 01<span class="p">;</span>31
.7z 01<span class="p">;</span>31
.rz 01<span class="p">;</span>31
.cab 01<span class="p">;</span>31
.wim 01<span class="p">;</span>31
.swm 01<span class="p">;</span>31
.dwm 01<span class="p">;</span>31
.esd 01<span class="p">;</span>31
<span class="c"># image formats</span>
.avif 01<span class="p">;</span>35
.jpg 01<span class="p">;</span>35
.jpeg 01<span class="p">;</span>35
.mjpg 01<span class="p">;</span>35
.mjpeg 01<span class="p">;</span>35
.gif 01<span class="p">;</span>35
.bmp 01<span class="p">;</span>35
.pbm 01<span class="p">;</span>35
.pgm 01<span class="p">;</span>35
.ppm 01<span class="p">;</span>35
.tga 01<span class="p">;</span>35
.xbm 01<span class="p">;</span>35
.xpm 01<span class="p">;</span>35
.tif 01<span class="p">;</span>35
.tiff 01<span class="p">;</span>35
.png 01<span class="p">;</span>35
.svg 01<span class="p">;</span>35
.svgz 01<span class="p">;</span>35
.mng 01<span class="p">;</span>35
.pcx 01<span class="p">;</span>35
.mov 01<span class="p">;</span>35
.mpg 01<span class="p">;</span>35
.mpeg 01<span class="p">;</span>35
.m2v 01<span class="p">;</span>35
.mkv 01<span class="p">;</span>35
.webm 01<span class="p">;</span>35
.webp 01<span class="p">;</span>35
.ogm 01<span class="p">;</span>35
.mp4 01<span class="p">;</span>35
.m4v 01<span class="p">;</span>35
.mp4v 01<span class="p">;</span>35
.vob 01<span class="p">;</span>35
.qt 01<span class="p">;</span>35
.nuv 01<span class="p">;</span>35
.wmv 01<span class="p">;</span>35
.asf 01<span class="p">;</span>35
.rm 01<span class="p">;</span>35
.rmvb 01<span class="p">;</span>35
.flc 01<span class="p">;</span>35
.avi 01<span class="p">;</span>35
.fli 01<span class="p">;</span>35
.flv 01<span class="p">;</span>35
.gl 01<span class="p">;</span>35
.dl 01<span class="p">;</span>35
.xcf 01<span class="p">;</span>35
.xwd 01<span class="p">;</span>35
.yuv 01<span class="p">;</span>35
.cgm 01<span class="p">;</span>35
.emf 01<span class="p">;</span>35
<span class="c"># https://wiki.xiph.org/MIME_Types_and_File_Extensions</span>
.ogv 01<span class="p">;</span>35
.ogx 01<span class="p">;</span>35
<span class="c"># audio formats</span>
.aac 00<span class="p">;</span>36
.au 00<span class="p">;</span>36
.flac 00<span class="p">;</span>36
.m4a 00<span class="p">;</span>36
.mid 00<span class="p">;</span>36
.midi 00<span class="p">;</span>36
.mka 00<span class="p">;</span>36
.mp3 00<span class="p">;</span>36
.mpc 00<span class="p">;</span>36
.ogg 00<span class="p">;</span>36
.ra 00<span class="p">;</span>36
.wav 00<span class="p">;</span>36
<span class="c"># https://wiki.xiph.org/MIME_Types_and_File_Extensions</span>
.oga 00<span class="p">;</span>36
.opus 00<span class="p">;</span>36
.spx 00<span class="p">;</span>36
.xspf 00<span class="p">;</span>36
<span class="c"># backup files</span>
<span class="k">*</span>~ 00<span class="p">;</span>90
<span class="k">*</span><span class="c"># 00;90</span>
.bak 00<span class="p">;</span>90
.crdownload 00<span class="p">;</span>90
.dpkg-dist 00<span class="p">;</span>90
.dpkg-new 00<span class="p">;</span>90
.dpkg-old 00<span class="p">;</span>90
.dpkg-tmp 00<span class="p">;</span>90
.old 00<span class="p">;</span>90
.orig 00<span class="p">;</span>90
.part 00<span class="p">;</span>90
.rej 00<span class="p">;</span>90
.rpmnew 00<span class="p">;</span>90
.rpmorig 00<span class="p">;</span>90
.rpmsave 00<span class="p">;</span>90
.swp 00<span class="p">;</span>90
.tmp 00<span class="p">;</span>90
.ucf-dist 00<span class="p">;</span>90
.ucf-new 00<span class="p">;</span>90
.ucf-old 00<span class="p">;</span>90
<span class="c">#</span>
<span class="c"># Subsequent TERM or COLORTERM entries, can be used to add / override</span>
<span class="c"># config specific to those matching environment variables.</span></code></pre></figure>
</details>
<p>Après avoir modifié le fichier de configuration pour personnaliser le jeu de couleurs</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "eval $(dircolors ~/.dir_colors)" &gt;&gt; ~/.bashrc
</code></pre></div></div>
<p>nous rechargeons le fichier pour appliquer les modifications</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>source ~/.bashrc
</code></pre></div></div>
<h4 id="imprimante-et-scanner">Imprimante et scanner</h4>
<p>Prérequis , paquets <strong>cups cups-filters cups-pdf system-config-printer hplip installés</strong> (Pilotes HP pour DeskJet, OfficeJet, Photosmart, Business Inkjet et quelques modèles de LaserJet aussi bien quun certain nombre dimprimantes Brother)…</p>
<p><strong>Assurez-vous que les bons ports sont ouverts.</strong><br />
Assurez-vous que les ports 161 (udp et tcp), 162 (udp et tcp) et 9100 (udp et tcp) sont ouverts dans votre pare-feu. Si ces ports ne sont pas ouverts, HPLIP ne fonctionnera pas.</p>
<p>Ouvrir <strong>pare-feu</strong> , saisir le mot de passe<br />
passer en configuration permanente et activer les services ipp, ipp-client et mdns.<br />
Cette configuration sera permanente au fil des redémarrages.</p>
<p>On démarre le service cups</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl start cups.service <span class="c"># lancement cups</span>
<span class="nb">sudo </span>systemctl <span class="nb">enable </span>cups.service <span class="c"># activation cups</span>
</code></pre></div></div>
<p>Installer graphiquement limprimante<br />
<img src="/images/hp7510-00.png" alt="" width="300" /><br />
<img src="/images/hp7510-01.png" alt="" /><br />
<img src="/images/hp7510-02.png" alt="" /></p>
<p class="warning"><img src="/images/hp7510-03.png" alt="" width="300" /><br />
Pour contourner le problème , éditer le fichier <code class="language-plaintext highlighter-rouge">/etc/nsswitch.conf</code><br />
Ajouter <code class="language-plaintext highlighter-rouge">mdns_minimal [NOTFOUND=return]</code> avant <code class="language-plaintext highlighter-rouge">resolve</code> <br />
<code class="language-plaintext highlighter-rouge">hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns</code></p>
<p>Après correctif<br />
<img src="/images/hp7510-04.png" alt="" width="300" /></p>
<p>Avec cups : http://localhost:631/<br />
<img src="/images/hp_cups.png" alt="" /></p>
<p>Installation du scanner<br />
Coté logiciel il vous faudra <strong>sane</strong> et son interface graphique <strong>xsane</strong>, ainsi quéventuellement xsane-gimp le plugin pour gimp.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S xsane xsane-gimp
</code></pre></div></div>
<p>Vérifier si le scaner est reconnu : <code class="language-plaintext highlighter-rouge">sudo scanimage -L</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>device `escl:https://192.168.0.24:443' is a HP OfficeJet 7510 series [C22036] platen,adf scanner
device `hpaio:/net/officejet_7510_series?ip=192.168.0.24&amp;queue=false' is a Hewlett-Packard officejet_7510_series all-in-one
</code></pre></div></div>
<p>Test scan, placer un original pour photocopie</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>scanimage --device hpaio:/net/officejet_7510_series?ip=192.168.0.24 --format=png &gt; test.png
</code></pre></div></div>
<h4 id="son-casquehdmi">Son Casque/HDMI</h4>
<p><em>Ceux qui travaillent à domicile sur une machine Linux ont peut-être déjà remarqué quil est difficile de passer dun périphérique audio dentrée à un périphérique audio de sortie. Vous pouvez vouloir passer rapidement dun casque à un autre ou du haut-parleur au casque et vice versa. Ouvrir la boîte de dialogue des paramètres à chaque fois que vous voulez changer de périphérique audio nest pas très productif. Certaines distributions de bureau comme Cinnamon fournissent des solutions prêtes à lemploi pour changer le périphérique audio en quelques clics. Pour Gnome, il existe une extension qui active cette fonctionnalité. Cet article couvre ces options qui permettent de passer dun périphérique audio à lautre sans trop defforts.<a href="https://www.linuxedo.com/2021/11/easily-switch-audio-devices-on-linux.html">Easily Switch Audio Devices on Linux</a></em></p>
<p><strong>Toutes les distributions Linux</strong><br />
<a href="https://github.com/yktoo/indicator-sound-switcher">Sound Switcher Indicator</a> est une application simple qui permet de changer laudio dentrée et de sortie à partir de licône de la barre des tâches. Contrairement aux deux premières options, cette application nest pas limitée à une distribution particulière. Si vous naimez pas les longs noms de matériel, lapplication propose également une option permettant de renommer les périphériques détectés.</p>
<p>Les utilisateurs dArch peuvent utiliser la commande suivante pour installer lapplication</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S indicator-sound-switcher
</code></pre></div></div>
<p><img src="/images/Switcher_Indicator01.png" alt="" /></p>
<p><img src="/images/Switcher_Indicator02.png" alt="" /></p>
<h4 id="mariadb---dbeaver">MariaDB - DBeaver</h4>
<p><a href="/2019/02/09/MariaDB-sur-Debian-Stretch.html#archlinux">MariaDB archlinux</a></p>
<p>Résumé des commandes en mode su</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman <span class="nt">-S</span> mariadb
mysql_install_db <span class="nt">--user</span><span class="o">=</span>mysql <span class="nt">--basedir</span><span class="o">=</span>/usr <span class="nt">--datadir</span><span class="o">=</span>/var/lib/mysql
systemctl <span class="nb">enable </span>mariadb <span class="nt">--now</span>
systemctl status <span class="nt">--no-pager</span> <span class="nt">--full</span> mariadb <span class="nt">--full</span>
</code></pre></div></div>
<p>Sécuriser</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mysql_secure_installation
</code></pre></div></div>
<p><em>DBeaver est basé sur le framework Eclipse, il est open source et il supporte plusieurs types de serveurs de bases de données comme : MySQL, SQLite, DB2, PostgreSQL, Oracle…</em></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S dbeaver
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>:: jdk-openjdk et jre-openjdk-headless sont en conflit. Supprimer jre-openjdk-headless ? [o/N] o
</code></pre></div></div>
<h4 id="freetuxtv">FreeTuxTv</h4>
<p><em>FreetuxTV est une application qui permet de regarder et enregistrer facilement les chaînes de télévision sous GNU/Linux et les chaînes de télévision de votre fournisseur daccès internet.</em></p>
<p>En mode su</p>
<p>Installation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S freetuxtv
</code></pre></div></div>
<p>Paramétrage du parefeu firewalld (<a href="https://forums.fedora-fr.org/d/59161-configuration-de-firewalld-pour-le-multicast-vlc-freebox-de-chez-free">Configuration de firewalld pour le multicast VLC freebox</a>)</p>
<p>Créer les services <strong>mafreebox.xml</strong> et <strong>vlc.xml</strong> pour firewalld</p>
<p><strong>mafreebox.xml</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="nt">&lt;service&gt;</span>
<span class="nt">&lt;short&gt;</span>mafreebox<span class="nt">&lt;/short&gt;</span>
<span class="nt">&lt;description&gt;</span>Permission pour mafreebox et vlc<span class="nt">&lt;/description&gt;</span>
<span class="nt">&lt;port</span> <span class="na">protocol=</span><span class="s">"udp"</span> <span class="na">port=</span><span class="s">""</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/service&gt;</span>
</code></pre></div></div>
<p><strong>vlc.xml</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="nt">&lt;service&gt;</span>
<span class="nt">&lt;short&gt;</span>vlc2<span class="nt">&lt;/short&gt;</span>
<span class="nt">&lt;description&gt;</span>Permission pour mafreebox et vlc<span class="nt">&lt;/description&gt;</span>
<span class="nt">&lt;port</span> <span class="na">protocol=</span><span class="s">"udp"</span> <span class="na">port=</span><span class="s">"15947"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;destination</span> <span class="na">ipv4=</span><span class="s">"228.67.43.91"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/service&gt;</span>
</code></pre></div></div>
<p>Les ajouter à la <strong>zone public</strong> pour rendre ces règles permanentes</p>
<p>/etc/firewalld/zones/public.xml</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="nt">&lt;zone&gt;</span>
<span class="nt">&lt;short&gt;</span>Public<span class="nt">&lt;/short&gt;</span>
<span class="nt">&lt;description&gt;</span>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.<span class="nt">&lt;/description&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"ssh"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"dhcpv6-client"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"ipp-client"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"mdns"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"ipp"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"mafreebox"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">"vlc"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;forward/&gt;</span>
<span class="nt">&lt;/zone&gt;</span>
</code></pre></div></div>
<p>Recharger le parefeu</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>firewall-cmd --reload
</code></pre></div></div>
<h4 id="photini-facultatif">Photini (Facultatif)</h4>
<p><em>Photini est un outil Linux qui permet de visualiser, mais également déditer les métadonnées de vos photos</em></p>
<p><a href="https://photini.readthedocs.io/en/latest/other/installation.html">Installation</a></p>
<p>Installer et vérifier python et pip</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python -V # Python 3.11.5
sudo pacman -S python-pip
pip --version # pip 23.2.1 from /usr/lib/python3.11/site-packages/pip (python 3.11)
</code></pre></div></div>
<p class="info">Avant dinstaller Photini, vous devez décider si vous linstallez pour un seul utilisateur ou pour plusieurs. Les installations multi-utilisateurs utilisent un environnement virtuel Python pour créer une installation autonome qui peut être facilement partagée. Lutilisation dun environnement virtuel présente dautres avantages, tels quune désinstallation facile, et vous pouvez donc également lutiliser pour une installation mono-utilisateur.</p>
<p><strong>Environnement virtuel</strong><br />
Configurer avec le nom photini et création dans le répertoire personnel</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python -m venv photini --system-site-packages
source photini/bin/activate
python -m pip install -U pip
</code></pre></div></div>
<p>Notez que pip peut avoir besoin dêtre mis à jour à nouveau à partir de lenvironnement virtuel. Loption Linux / MacOS system-site-packages rend les paquets installés avec le gestionnaire de paquets du système (par exemple PySide6 / PySide2 / PyQt6 / PyQt5) disponibles dans lenvironnement virtuel. Vous devez rester dans cet environnement virtuel pendant linstallation et les tests de Photini.</p>
<p><strong>Installer Photini avec pip</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip install photini
</code></pre></div></div>
<p>Les dépendances optionnelles de Photini peuvent être incluses dans linstallation en les listant comme “extras” dans la commande pip. Par exemple, si vous souhaitez pouvoir télécharger sur Flickr et Ipernity</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip install "photini[flickr,ipernity]"
</code></pre></div></div>
<p><code class="language-plaintext info highlighter-rouge">Notez que les noms des extras ne sont pas sensibles à la casse.</code></p>
<p>Nouveau dans la version 2023.7.0 : Vous pouvez installer toutes les dépendances optionnelles de Photini en ajoutant un “all extra”. Vous pouvez également installer nimporte quel paquet Qt en tant quextra</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip install "photini[all,pyqt6,pyside6]"
</code></pre></div></div>
<p>Lancez maintenant la commande <code class="language-plaintext highlighter-rouge">photini-configure</code> pour choisir le paquetage Qt à utiliser</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>photini-configure
</code></pre></div></div>
<p>Liste des réponses aux questions</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Which Qt package would you like to use?
0 PyQt5 [installed, WebEngine not installed]
1 PySide2 [not installed]
2 PyQt6 [installed]
3 PySide6 [installed]
Choose 0/1/2/3: 2
Would you like to upload pictures to Flickr? (y/n): n
Would you like to upload pictures to Google Photos? (y/n): n
Would you like to upload pictures to Ipernity? (y/n): n
Would you like to upload pictures to Pixelfed or Mastodon? (y/n): n
Would you like to check spelling of metadata? (y/n) [y]: n
Would you like to import GPS track data? (y/n) [y]: y
Would you like to make higher quality thumbnails? (y/n) [y]: n
Would you like to import pictures from a camera? (y/n): n
</code></pre></div></div>
<p>Tester linstallation : <code class="language-plaintext highlighter-rouge">python -m photini</code><br />
<img src="/images/photini01.png" alt="" /></p>
<p><strong>Menu de démarrage / menu dapplication</strong><br />
Bien que vous puissiez lancer Photini à partir dun shell de commande, la plupart des utilisateurs préfèreront probablement utiliser le menu Démarrer / Application ou une icône sur le bureau. Ceux-ci peuvent être installés avec la commande <code class="language-plaintext highlighter-rouge">photini-post-install</code></p>
<p><strong>Utilisateurs supplémentaires</strong><br />
Si vous avez installé Photini dans un environnement virtuel, dautres utilisateurs devraient pouvoir exécuter la commande photini en utilisant son chemin daccès complet.(exemple utilisatrice sarah)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># dans le dossier home de sarah
sarah@mint:~$/home/yann/photini/bin/photini
</code></pre></div></div>
<p>Ce nest pas une façon très pratique de lancer Photini, donc la plupart des utilisateurs voudront lajouter à leur menu de démarrage ou dapplication</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># dans le dossier home de sarah
sarah@mint:~$ /home/yann/photini/bin/photini-post-install
</code></pre></div></div>
<h4 id="météo-radar">Météo Radar</h4>
<p><img src="/images/wetteronline.png" alt="" /><br />
<a href="https://www.meteoetradar.com/meteo/beaupreau-en-mauges/9983268">https://www.meteoetradar.com/meteo/beaupreau-en-mauges/9983268</a></p>
<h4 id="flatpak-non-installe">Flatpak (NON INSTALLE)</h4>
<p><em>Flatpak offre une plate-forme universelle pour installer, gérer et désinstaller les logiciels sur toutes les distributions Linux.</em></p>
<ul>
<li><a href="https://doc.ubuntu-fr.org/flatpak">Flatpak, un format de paquets universel</a></li>
<li><a href="https://www.malekal.com/flatpak-telecharger-installer-applications-linux/">Flatpak : Télécharger et installer des applications sur Linux</a></li>
</ul>
<p>Installer flatpak</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S flatpak
</code></pre></div></div>
<p>Accédez à la plateforme flashhub : <a href="https://flathub.org/home">https://flathub.org/home</a><br />
Rechercher lapplication “FreeTube”<br />
<img src="/images/flatpak01.png" alt="" /><br />
cliquez sur le bouton bleu <strong>Install</strong> pour télécharger le paquet <code class="language-plaintext highlighter-rouge">io.freetubeapp.FreeTube.flatpakref</code></p>
<p>Ouvrir un terminal et lancer la commande</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo flatpak install io.freetubeapp.FreeTube.flatpakref
</code></pre></div></div>
<p><img src="/images/flatpak02.png" alt="" /></p>
<p><code class="language-plaintext warning highlighter-rouge">Les fichiers de configuration des logiciels installés ne sont pas dans les répertoires "classiques" ~/.config ou ~/.local, ils sont dans ~/.var</code></p>
<p><code class="language-plaintext warning highlighter-rouge">Les icônes et fichiers des applications Flatpak ne se trouvent pas dans /usr/share/, mais dans /var/lib/flatpak/exports/share/</code></p>
<p>Autres commandes:<br />
Lister les applications installées <code class="language-plaintext highlighter-rouge">flatpak list</code><br />
Afficher lhistorique → <code class="language-plaintext highlighter-rouge">sudo flatpak history</code><br />
Désinstaller un logiciel → <code class="language-plaintext highlighter-rouge">sudo flatpak uninstall &lt;nom paquet&gt;</code>, ex FreeTube → <code class="language-plaintext highlighter-rouge">sudo flatpak uninstall FreeTube</code><br />
Dans certains cas, vous pouvez vous retrouver avec une installation corrompue dun paquet → <code class="language-plaintext highlighter-rouge">sudo flatpak repair</code></p>
<p>Désinstallation complète</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo flatpak uninstall --unused
</code></pre></div></div>
<h4 id="vscodium-non-installe">VSCodium (NON INSTALLE)</h4>
<p><em>Si le code de Visual Studio est bien libre, lapplication officielle de Microsoft ne lest pas vraiment. Cest ici quentre en jeu VSCodium, une alternative à Visual Studio Code sous licence MIT, disponible pour de nombreux systèmes dexploitation</em></p>
<p><a href="/2024/09/24/VSCodium.html">VSCodium, éditeur de code source multiplateforme et multi langage</a></p>
<h4 id="synchro-serveur-dossier-bibliocalibre">Synchro serveur dossier “BiblioCalibre”</h4>
<p class="info">Le but est de synchroniser le dossier <strong>~/media/BiblioCalibre</strong> avec le(s) serveur(s) web distant(s)<br />
Avec les unités de chemin, vous pouvez surveiller les fichiers et les répertoires pour certains événements. Si un événement spécifique se produit, une unité de service est exécutée, et elle porte généralement le même nom que lunité de chemin</p>
<p>Nous allons surveiller dans le dossier <em>/srv/media/statique/</em> toute modification du fichier <strong>metadata.db</strong> qui entrainera lexécution dun script</p>
<p>Dans le répertoire systemd utilisateur nous créons une unité de cheminement <strong>media_BiblioCalibre_site.path</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano ~/.config/systemd/user/media_BiblioCalibre_site.path
</code></pre></div></div>
<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[Unit]</span>
<span class="py">Description</span><span class="p">=</span><span class="s">Surveiller metadata.db pour les changements</span>
<span class="nn">[Path]</span>
<span class="py">PathChanged</span><span class="p">=</span><span class="s">/srv/media/BiblioCalibre/metadata.db</span>
<span class="py">Unit</span><span class="p">=</span><span class="s">media_BiblioCalibre_site.service</span>
<span class="nn">[Install]</span>
<span class="py">WantedBy</span><span class="p">=</span><span class="s">default.target</span>
</code></pre></div></div>
<p>Dans la section <code class="language-plaintext highlighter-rouge">[Path]</code>, <code class="language-plaintext highlighter-rouge">PathChanged=</code> indique le chemin absolu du fichier à surveiller, tandis que <code class="language-plaintext highlighter-rouge">Unit=</code> indique lunité de service à exécuter si le fichier change. Cette unité (<strong>media_BiblioCalibre_site.path</strong>) doit être lancée lorsque le système est en mode multi-utilisateur.</p>
<p>Ensuite, nous créons lunité de service correspondante, <strong>media_BiblioCalibre_site.service</strong>, dans le répertoire <code class="language-plaintext highlighter-rouge">~/.config/systemd/user/</code> <br />
Si le fichier <strong>metadata.db</strong> change (cest-à-dire quil est à la fois écrit et fermé), lunité de service suivante sera appelée pour exécuter le script spécifié :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano ~/.config/systemd/user/media_BiblioCalibre_site.service
</code></pre></div></div>
<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[Unit]</span>
<span class="py">Description</span><span class="p">=</span><span class="s">"Exécute le script si metadata.db a été modifié."</span>
<span class="nn">[Service]</span>
<span class="py">ExecStart</span><span class="p">=</span><span class="s">/home/yann/scripts/media_BiblioCalibre_site.sh</span>
<span class="nn">[Install]</span>
<span class="py">WantedBy</span><span class="p">=</span><span class="s">default.target</span>
</code></pre></div></div>
<p>Le script <code class="language-plaintext highlighter-rouge">media_BiblioCalibre_site.sh</code> lance une synchronisation locale distante via rsync ssh</p>
<details>
<summary><b>Etendre Réduire media_BiblioCalibre_site.sh</b></summary>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c">#!/bin/bash</span>
<span class="c">#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</span>
<span class="c"># Modification mode rsync suivant serveur distant</span>
<span class="c">#</span>
<span class="c"># Chaque modification du fichier metadata.db dans le dossier local /srv/media/BiblioCalibre </span>
<span class="c"># déclenche une synchronisation du dossier local avec le dossier distant '/sharenfs/multimedia/eBook/BiblioCalibre' </span>
<span class="c"># des serveurs VPS Yunohost</span>
<span class="c"># le dossier local est également sauvegardé dans le dossier 'backup/datayan/static' de la boîte de stockage</span>
<span class="c">#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</span>
<span class="c"># Fonction pour tester si le serveur est présent</span>
<span class="c"># Host=$1 et Port=$2</span>
<span class="c"># Réponse $?=0 -&gt; OK $?=1 -&gt; NOK</span>
host_ok <span class="o">()</span> <span class="o">{</span>
nc <span class="nt">-4</span> <span class="nt">-d</span> <span class="nt">-z</span> <span class="nt">-w</span> 1 <span class="nv">$1</span> <span class="nv">$2</span> &amp;&gt; /dev/null
<span class="o">}</span>
synchro <span class="o">()</span> <span class="o">{</span>
<span class="c"># Synchronisation locale distante du dossier _site</span>
host_ok <span class="nv">$SERVER</span> <span class="nv">$PORT</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$?</span> <span class="o">==</span> 0 <span class="o">]]</span>
<span class="k">then
</span><span class="nb">echo</span> <span class="s1">'rsync -avz --progress --stats --human-readable --delete -e "ssh -p '</span><span class="nv">$PORT</span><span class="s1">' -i '</span><span class="nv">$PRIVKEY</span><span class="s1">'" '</span><span class="nv">$REPLOC</span><span class="s1">' '</span><span class="nv">$USERDIS</span><span class="s1">':'</span><span class="nv">$REPDIS</span><span class="s1">'/Divers/'</span>
rsync <span class="nt">-avz</span> <span class="nt">--progress</span> <span class="nt">--stats</span> <span class="nt">--human-readable</span> <span class="nt">--delete</span> <span class="nt">--rsync-path</span><span class="o">=</span><span class="s2">"</span><span class="nv">$RSYNCMOD</span><span class="s2">"</span> <span class="nt">-e</span> <span class="s2">"ssh -p </span><span class="nv">$PORT</span><span class="s2"> -i </span><span class="nv">$PRIVKEY</span><span class="s2">"</span> <span class="nv">$REPLOC</span> <span class="nv">$USERDIS</span>:<span class="nv">$REPDIS</span>/Divers/ <span class="o">&gt;</span> /dev/null
<span class="c"># Analyse résultat de la commande rsync</span>
<span class="k">if</span> <span class="o">[</span> <span class="o">!</span> <span class="nv">$?</span> <span class="nt">-eq</span> 0 <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="c">#echo "Synchro $REPLOC avec $SERVER -&gt; OK" | systemd-cat -t BiblioCalibre -p info </span>
<span class="c">#echo "Synchro $REPLOC avec $SERVER -&gt; OK"</span>
<span class="c">#else </span>
<span class="nb">echo</span> <span class="s2">"Synchro </span><span class="nv">$REPLOC</span><span class="s2"> avec </span><span class="nv">$SERVER</span><span class="s2"> -&gt; ERREUR"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> emerg
<span class="c">#echo "Synchro $REPLOC avec $SERVER -&gt; ERREUR"</span>
<span class="k">fi
else
</span><span class="nb">echo</span> <span class="s2">"Site </span><span class="nv">$SERVER</span><span class="s2"> port </span><span class="nv">$PORT</span><span class="s2"> Inaccessible !"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> emerg
<span class="c">#echo "Site $SERVER port $PORT Inaccessible !"</span>
<span class="k">fi</span>
<span class="o">}</span>
<span class="c">#*******************************************************************</span>
<span class="c">#</span>
<span class="c"># DEPART SCRIPT</span>
<span class="c">#</span>
<span class="c">#*******************************************************************</span>
<span class="c"># Tester la présence du fichier des serveurs distants</span>
<span class="k">if</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-f</span> /home/yann/scripts/serveurs.csv <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nb">echo</span> <span class="s2">"Fichier serveurs.csv inexistant!"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> emerg
<span class="nb">exit </span>1
<span class="k">fi</span>
<span class="c"># Mesure temps exécution</span>
<span class="nv">begin</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +<span class="s2">"%s"</span><span class="si">)</span>
<span class="nb">echo</span> <span class="s2">"***DEPART*** Exécution script </span><span class="nv">$0</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"***DEPART*** Exécution script </span><span class="nv">$0</span><span class="s2">"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> info
<span class="c">#echo "Exécution script $0"</span>
<span class="c"># Dossier local</span>
<span class="nv">REPLOC</span><span class="o">=</span><span class="s2">"/srv/media/BiblioCalibre"</span>
<span class="c"># Synchro serveurs</span>
<span class="k">while </span><span class="nv">IFS</span><span class="o">=</span><span class="s2">","</span> <span class="nb">read</span> <span class="nt">-r</span> SERVER REPDIS USERDIS PORT PRIVKEY RSYNCMOD LOCAL
<span class="k">do</span>
<span class="c">#echo " $SERVER $REPDIS $USERDIS $PORT $PRIVKEY $RSYNCMOD $LOCAL"</span>
<span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$SERVER</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"rnmkcy.eu"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
</span>synchro
<span class="nb">echo</span> <span class="s2">"ssh </span><span class="nv">$USERDIS</span><span class="s2"> -p </span><span class="nv">$PORT</span><span class="s2"> -i </span><span class="nv">$PRIVKEY</span><span class="s2"> 'sudo systemctl restart calibreweb'"</span>
ssh <span class="nv">$USERDIS</span> <span class="nt">-p</span> <span class="nv">$PORT</span> <span class="nt">-i</span> <span class="nv">$PRIVKEY</span> <span class="s1">'sudo systemctl restart calibreweb'</span>
<span class="k">fi
done</span> &lt; &lt;<span class="o">(</span><span class="nb">tail</span> <span class="nt">-n</span> +2 /home/yann/scripts/serveurs.csv<span class="o">)</span>
<span class="c"># Calcul et affichage temps exécution</span>
<span class="nv">termin</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +<span class="s2">"%s"</span><span class="si">)</span>
<span class="nv">difftimelps</span><span class="o">=</span><span class="k">$((</span><span class="nv">$termin</span><span class="o">-</span><span class="nv">$begin</span><span class="k">))</span>
<span class="nb">echo</span> <span class="s2">"***FIN*** </span><span class="nv">$0</span><span class="s2"> exécuté en </span><span class="k">$((</span><span class="nv">$difftimelps</span> <span class="o">/</span> <span class="m">60</span><span class="k">))</span><span class="s2"> mn </span><span class="k">$((</span><span class="nv">$difftimelps</span> <span class="o">%</span> <span class="m">60</span><span class="k">))</span><span class="s2"> s"</span> | systemd-cat <span class="nt">-t</span> BiblioCalibre <span class="nt">-p</span> info
<span class="nb">echo</span> <span class="s2">"***FIN*** </span><span class="nv">$0</span><span class="s2"> exécuté en </span><span class="k">$((</span><span class="nv">$difftimelps</span> <span class="o">/</span> <span class="m">60</span><span class="k">))</span><span class="s2"> mn </span><span class="k">$((</span><span class="nv">$difftimelps</span> <span class="o">%</span> <span class="m">60</span><span class="k">))</span><span class="s2"> s"</span>
<span class="nb">exit </span>0</code></pre></figure>
</details>
<p>Activer et lancer</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl --user enable media_BiblioCalibre_site.path --now
</code></pre></div></div>
<p>Voir le fichier journal</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>journalctl --user -f -u media_BiblioCalibre_site.service
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>juin 06 09:39:32 yann-pc1 systemd[1537]: Started "Exécute le script si metadata.db a été modifié.".
juin 06 09:39:32 yann-pc1 media_BiblioCalibre_site.sh[11100]: ***DEPART*** Exécution script /home/yann/scripts/media_BiblioCalibre_site.sh
juin 06 09:39:32 yann-pc1 media_BiblioCalibre_site.sh[11100]: rsync -avz --progress --stats --human-readable --delete -e "ssh -p 55215 -i /home/yann/.ssh/lenovo-ed25519" /srv/media/BiblioCalibre leno@192.168.0.215:/sharenfs/multimedia/Divers/
juin 06 09:39:33 yann-pc1 media_BiblioCalibre_site.sh[11100]: ***FIN*** /home/yann/scripts/media_BiblioCalibre_site.sh exécuté en 0 mn 1 s
juin 06 09:44:40 yann-pc1 systemd[1537]: Started "Exécute le script si metadata.db a été modifié.".
juin 06 09:44:40 yann-pc1 media_BiblioCalibre_site.sh[11278]: ***DEPART*** Exécution script /home/yann/scripts/media_BiblioCalibre_site.sh
juin 06 09:44:40 yann-pc1 media_BiblioCalibre_site.sh[11278]: rsync -avz --progress --stats --human-readable --delete -e "ssh -p 55215 -i /home/yann/.ssh/lenovo-ed25519" /srv/media/BiblioCalibre leno@192.168.0.215:/sharenfs/multimedia/Divers/
juin 06 09:44:41 yann-pc1 media_BiblioCalibre_site.sh[11278]: ssh leno@192.168.0.215 -p 55215 -i /home/yann/.ssh/lenovo-ed25519 'sudo systemctl restart calibreweb'
juin 06 09:44:42 yann-pc1 media_BiblioCalibre_site.sh[11278]: ***FIN*** /home/yann/scripts/media_BiblioCalibre_site.sh exécuté en 0 mn 2 s
</code></pre></div></div>
<p>On peut créer un accès graphique sur le poste archlinux</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/.local/share/applications/suivi_BiblioCalibre_site.desktop
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Desktop Entry]
Version=1.1
Type=Application
Name=Synchro BiblioCalibre
Comment=synchro site rnmkcy.eu
Icon=xterm-color_48x48
Exec=xterm -rv -geometry 250x30+10+50 -T suivi_BiblioCalibre_site -e 'journalctl --user -u media_BiblioCalibre_site.service --no-pager; read -p "Touche Entrée pour sortir..."'
Actions=
Categories=Utility;
Path=
Terminal=false
StartupNotify=false
</code></pre></div></div>
<h4 id="synchro-serveur-dossier-scripts">Synchro serveur dossier “scripts”</h4>
<p class="info">Le but est de synchroniser le dossier <strong>~/scripts</strong> avec le serveur distant rnmkcy.eu</p>
<p>Nous allons surveiller dans le dossier <strong>~/scripts/</strong> toute modification qui entrainera lexécution dun script</p>
<p>Dans le répertoire systemd utilisateur nous créons une unité de cheminement <strong>media_BiblioCalibre_site.path</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano ~/.config/systemd/user/home_scripts.path
</code></pre></div></div>
<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[Unit]</span>
<span class="py">Description</span><span class="p">=</span><span class="s">Surveiller dossier scripts</span>
<span class="nn">[Path]</span>
<span class="py">PathChanged</span><span class="p">=</span><span class="s">/home/yann/scripts/</span>
<span class="py">Unit</span><span class="p">=</span><span class="s">home_scripts.service</span>
<span class="nn">[Install]</span>
<span class="py">WantedBy</span><span class="p">=</span><span class="s">default.target</span>
</code></pre></div></div>
<p>Dans la section <code class="language-plaintext highlighter-rouge">[Path]</code>, <code class="language-plaintext highlighter-rouge">PathChanged=</code> indique le chemin absolu du fichier à surveiller, tandis que <code class="language-plaintext highlighter-rouge">Unit=</code> indique lunité de service à exécuter si le fichier change.</p>
<p>Ensuite, nous créons lunité de service correspondante, <strong>home_scripts.service</strong>, dans le répertoire <code class="language-plaintext highlighter-rouge">~/.config/systemd/user/</code> <br />
Si on modifie le contenu du dossier <strong>/home/yann/scripts/</strong>, lunité de service suivante sera appelée pour exécuter le script spécifié :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano ~/.config/systemd/user/home_scripts.service
</code></pre></div></div>
<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[Unit]</span>
<span class="py">Description</span><span class="p">=</span><span class="s">"Modification dossier scripts"</span>
<span class="nn">[Service]</span>
<span class="py">ExecStart</span><span class="p">=</span><span class="s">/home/yann/scripts/home_scripts.sh</span>
</code></pre></div></div>
<p>On supprime les lignes de fin du fichier <code class="language-plaintext highlighter-rouge">home_scripts.service</code> pour éviter un lancement de la procédure au démarrage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Install]
WantedBy=default.target
</code></pre></div></div>
<p>Le script <code class="language-plaintext highlighter-rouge">/home/yann/scripts/home_scripts.sh</code> lance une synchronisation locale distante via rsync ssh et envoie un message par ntfy</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c">#/usr/bin/curl -H "Title: Modification dossier scripts" \</span>
<span class="c"># -H "Authorization: Bearer tk_fjh5bfo3zu2cpibgi2jyfkif49xws" \</span>
<span class="c"># -H prio:high \</span>
<span class="c"># -H tags:warning,parachute -d "Le dossier /home/yann/scripts a été modifié </span>
<span class="c">#Synchronistaion du dossier :</span>
<span class="c">#rsync -av --delete /home/yann/scripts/* /mnt/sharenfs/rnmkcy/scripts/" \</span>
<span class="c">#https://noti.rnmkcy.eu/notif_infos</span>
<span class="nb">echo</span> <span class="s2">"rsync -av --delete /home/yann/scripts/* /mnt/sharenfs/rnmkcy/scripts/"</span> | systemd-cat <span class="nt">-t</span> scripts <span class="nt">-p</span> info
rsync <span class="nt">-av</span> <span class="nt">--delete</span> /home/yann/scripts/<span class="k">*</span> /mnt/sharenfs/rnmkcy/scripts/
</code></pre></div></div>
<p>Le rendre exécutable</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chmod +x /home/yann/scripts/home_scripts.sh
</code></pre></div></div>
<p>Activer et lancer</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl --user enable home_scripts.path --now
</code></pre></div></div>
<p>Pour visualiser les messages</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>journalctl --user -t scripts --since today --no-pager
</code></pre></div></div>
<p>On peut créer un accès graphique sur le poste archlinux</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/.local/share/applications/suivi_home_scripts.desktop
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Desktop Entry]
Version=1.1
Type=Application
Name=Synchro dossier scripts
Comment=synchro scripts avec rnmkcy.eu
Icon=xterm-color_48x48
Exec=xterm -rv -geometry 150x40+100+150 -T suivi_home_scripts -e 'journalctl --user -t scripts --since today --no-pager; read -p "Touche Entrée pour sortir..."'
Actions=
Categories=Utility;
Path=
Terminal=false
StartupNotify=false
</code></pre></div></div>
<h2 id="développement">Développement</h2>
<h3 id="python">Python</h3>
<h4 id="wing-personal-python-ide">Wing personal python IDE</h4>
<p><strong>Wing personal python IDE</strong><a href="https://wingware.com/downloads/wing-personal">Téléchargement</a></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Décompression de la version téléchargée
tar xjvf wing-personal-9.1.2.0-linux-x64.tar.bz2
# Passage en root
sudo -s
# Lancement procédure installation
cd wing-personal-9.1.2.0-linux-x64
./wing-install.py
</code></pre></div></div>
<p>Déroulement de la commande</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Where do you want to install the support files for Wing Personal (default
= /usr/local/lib/wing-personal9)?
/usr/local/lib/wing-personal9 does not exist, create it (y/N)? y
Where do you want to install links to the Wing Personal startup scripts
(default = /usr/local/bin)?
[...]
Writing file-list.txt
Icon/menu install returned err=0
Done installing. Make sure that /usr/local/bin is in your path and type
"wing-personal9" to start Wing Personal.
</code></pre></div></div>
<p>Effacer les fichiers</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Suppression dossier et fichier
cd ..
rm -rf wing-personal*
# sortie root
exit
</code></pre></div></div>
<p>En cas derreur de lancement de lapplication</p>
<p class="error">/usr/local/lib/wing-personal9/bin/<strong>os</strong>/linux-x64/runtime-python3.10/bin/python3.10: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory</p>
<p>Installer la librairie</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S libxcrypt-compat
</code></pre></div></div>
<h4 id="traitement-des-fichiers-gpx">Traitement des fichiers gpx</h4>
<p>Les fichiers à traiter sont déposés dans le dossier <code class="language-plaintext highlighter-rouge">~/media/osm-new/file/tmp/</code><br />
Ils sont déplacés après traitement dans le dossier <code class="language-plaintext highlighter-rouge">~/media/osm-new/file/</code><br />
Le script python <code class="language-plaintext highlighter-rouge">~/media/osm-new/file/tracesgpxtable.py</code></p>
<p>Créer un environnement virtuel <strong>env-osm</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python -m venv ~/media/dplus/python-dev/env-osm
</code></pre></div></div>
<p>Si vous répertoriez maintenant les fichiers figurant dans le répertoire python-dev , vous verrez que vous avez créé un répertoire appelé env-osm avec tous les éléments pour une exécution python en autonomie<br />
<img src="/images/venv01.png" alt="" /></p>
<p><u>Ligne de commande</u><br />
Pour activer lenvironnement virtuel python</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>source ~/media/dplus/python-dev/env-osm/bin/activate
</code></pre></div></div>
<p>À ce stade, votre terminal (selon celui que vous utilisez) ajoutera probablement le nom de votre environnement au début de chaque ligne de votre terminal, dans notre cas <code class="language-plaintext highlighter-rouge">(env-osm)</code><br />
Pour désactiver lenvironnement virtuel python , dans le dossier <code class="language-plaintext highlighter-rouge">~/media/dplus/python-dev/env-osm/</code> saisir <code class="language-plaintext highlighter-rouge">deactivate</code> et <code class="language-plaintext highlighter-rouge">(env-osm)</code> disparaît</p>
<p>Aucun paquet nest installé dans votre environnement virtuel. Cest le comportement par défaut lorsque vous créez un environnement virtuel.</p>
<p>Mise à niveau pip</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip install --upgrade pip
</code></pre></div></div>
<p>Installer les modules pour le traitement des fichiers gpx</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip install gpxpy geopy
</code></pre></div></div>
<p><u>Wing personal (IDE python)</u><br />
Ouvrir “wing personal” créer un nouveau projet “env-osm” répertoire <code class="language-plaintext highlighter-rouge">~/media/dplus/python-dev/env-osm</code></p>
<h3 id="go-et-nodejs">Go et NodeJS</h3>
<ul>
<li><a href="/2021/01/29/Debian_installer_Go+Node.html#installer-la-dernière-version-de-go">Installer la dernière version de Go</a>
<ul>
<li>go version go1.21.4 linux/amd64</li>
</ul>
</li>
<li><a href="/2021/01/29/Debian_installer_Go+Node.html#installer-nodejs-sur-debian-12-11-ou-10-via-nodesource">Installer Node.js</a>
<ul>
<li>Now using node v20.10.0 (npm v10.2.3)<br />
Creating default alias: default -&gt; 20.10.0 (-&gt; v20.10.0)</li>
</ul>
</li>
</ul>
<h2 id="générateur-site-statique">Générateur site statique</h2>
<p><em>Ensemble dapplications basé sur ruby et jekyll qui permet la génération de site statique à partir de fichiers markdown</em></p>
<p><a href="/2024/07/13/Archlinux_Ruby_Jekyll_site_statique.html">Archlinux Ruby + Jekyll + générateur site statique</a></p>
<h3 id="site-statique-en-local-inactif">Site statique en local (INACTIF)</h3>
<p>Sur lhôte PC1, on installe nginx (<code class="language-plaintext highlighter-rouge">yay -S nginx</code>) pour visualiser le site statique en local<br />
Modifier le fichier de configuration <code class="language-plaintext highlighter-rouge">/etc/nginx/nginx.conf</code></p>
<div class="language-nginx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">user</span> <span class="s">yann</span><span class="p">;</span>
<span class="k">worker_processes</span> <span class="mi">1</span><span class="p">;</span>
<span class="k">events</span> <span class="p">{</span>
<span class="kn">worker_connections</span> <span class="mi">1024</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">http</span> <span class="p">{</span>
<span class="kn">include</span> <span class="s">mime.types</span><span class="p">;</span>
<span class="kn">default_type</span> <span class="nc">application/octet-stream</span><span class="p">;</span>
<span class="kn">types_hash_max_size</span> <span class="mi">4096</span><span class="p">;</span>
<span class="kn">sendfile</span> <span class="no">on</span><span class="p">;</span>
<span class="kn">keepalive_timeout</span> <span class="mi">65</span><span class="p">;</span>
<span class="kn">server</span> <span class="p">{</span>
<span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
<span class="kn">server_name</span> <span class="s">localhost</span><span class="p">;</span>
<span class="kn">location</span> <span class="n">/</span> <span class="p">{</span>
<span class="kn">root</span> <span class="n">/home/yann/media/yannstatic/_site</span><span class="p">;</span>
<span class="kn">index</span> <span class="s">index.html</span> <span class="s">index.htm</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">#error_page 404 /404.html;</span>
<span class="c1"># redirect server error pages to the static page /50x.html</span>
<span class="c1">#</span>
<span class="kn">error_page</span> <span class="mi">500</span> <span class="mi">502</span> <span class="mi">503</span> <span class="mi">504</span> <span class="n">/50x.html</span><span class="p">;</span>
<span class="kn">location</span> <span class="p">=</span> <span class="n">/50x.html</span> <span class="p">{</span>
<span class="kn">root</span> <span class="n">/usr/share/nginx/html</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Lancer et activer nginx</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl start nginx
sudo systemctl enable nginx
</code></pre></div></div>
<h2 id="wireguard---mullvad">Wireguard - Mullvad</h2>
<h3 id="wireguard">Wireguard</h3>
<p>Installation</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S wireguard-tools openresolv
</code></pre></div></div>
<p>Dossier /etc /wireguard</p>
<h4 id="configuration-wg-quick">Configuration wg-quick</h4>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo -s
cd /etc/wireguard
</code></pre></div></div>
<p>Si le dossier <code class="language-plaintext highlighter-rouge">~/.local/share/gtkwg/mullvad_config_linux_all/</code> existe, on copie une configuration</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo cp ~/.local/share/gtkwg/mullvad_config_linux_all/fr-par-wg-003.conf /etc/wireguard/wg0.conf
</code></pre></div></div>
<p>Pour démarrer un tunnel avec un fichier de configuration <code class="language-plaintext highlighter-rouge">/etc/wireguard/wg0.conf</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Interface]
PrivateKey = 4Mcj/qVPOOWMwVD07bAefavy1kSSEAFnnOagiZzhgFk=
Address = 10.64.218.16/32,fc00:bbbb:bbbb:bb01::1:da0f/128
DNS = 10.64.0.1
[Peer]
PublicKey = cmqtm0PSjWUa4/0DKxdr0vQqf4nFVbENQDodarHc0hY=
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = 193.32.126.70:51820[root@yann-eos yann]#
</code></pre></div></div>
<p>Lancement en mode su</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wg-quick up wg0
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c"># wg-quick up &lt;nom de l'interface&gt;</span>
wg-quick up wg0 <span class="c"># lancement</span>
<span class="o">[</span><span class="c">#] ip link add wg0 type wireguard</span>
<span class="o">[</span><span class="c">#] wg setconf wg0 /dev/fd/63</span>
<span class="o">[</span><span class="c">#] ip -6 address add fd18:2941:ae9:7d96::3/128 dev wg0</span>
<span class="o">[</span><span class="c">#] ip -4 address add 10.14.94.3/32 dev wg0</span>
<span class="o">[</span><span class="c">#] ip link set mtu 1420 up dev wg0</span>
<span class="o">[</span><span class="c">#] resolvconf -a wg0 -m 0 -x</span>
<span class="o">[</span><span class="c">#] wg set wg0 fwmark 51820</span>
<span class="o">[</span><span class="c">#] ip -6 route add ::/0 dev wg0 table 51820</span>
<span class="o">[</span><span class="c">#] ip -6 rule add not fwmark 51820 table 51820</span>
<span class="o">[</span><span class="c">#] ip -6 rule add table main suppress_prefixlength 0</span>
<span class="o">[</span><span class="c">#] ip6tables-restore -n</span>
<span class="o">[</span><span class="c">#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820</span>
<span class="o">[</span><span class="c">#] ip -4 rule add not fwmark 51820 table 51820</span>
<span class="o">[</span><span class="c">#] ip -4 rule add table main suppress_prefixlength 0</span>
<span class="o">[</span><span class="c">#] sysctl -q net.ipv4.conf.all.src_valid_mark=1</span>
<span class="o">[</span><span class="c">#] iptables-restore -n</span>
wg-quick down wg0 <span class="c"># arrêt</span>
</code></pre></div></div>
<h4 id="application-mullvad">Application Mullvad</h4>
<ul>
<li><a href="/2024/09/14/Mullvad-2024.html#archlinux-mullvad">Archlinux Mullvad</a></li>
<li><a href="/htmldoc/Utilisation application VPN Mullvad.html">Utilisation application VPN Mullvad</a></li>
</ul>
<h4 id="gtkwg-inactif">GtkWg (INACTIF)</h4>
<p>Dossier : <code class="language-plaintext highlighter-rouge">mkdir -p ~/.local/share/gtkwg</code><br />
Droits <code class="language-plaintext highlighter-rouge">chown $USER.$USER -R /usr/local/share/gtkwg/</code><br />
Librairie : <code class="language-plaintext highlighter-rouge">yay -S libappindicator-gtk3</code><br />
Les configurations mullvad <code class="language-plaintext highlighter-rouge">/usr/local/share/gtkwg/mullvad_config_linux_all/</code></p>
<p>Le fichier <strong>desktop</strong> dans <code class="language-plaintext highlighter-rouge">~/.local/share/applications/menulibre-gtkwg.desktop</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Desktop Entry]
Version=1.0
Type=Application
Name=Wireguard
Comment=IconTray/Configuration
Icon=/usr/local/share/gtkwg/wireguard_icon.png
Exec=/usr/bin/python /usr/local/share/gtkwg/GtkWgTray.py
Path=/usr/local/share/gtkwg/
NoDisplay=false
Categories=Utility;
StartupNotify=false
Terminal=false
</code></pre></div></div>
<p>Le fichier de lancement</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/usr/local/share/gtkwg/GtkWgTray.sh
</code></pre></div></div>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">!</span>/bin/bash
<span class="c">#resul=`systemctl is-active wg-quick@wg0`</span>
<span class="c">#if ! [[ $resul == "active" ]]; then</span>
<span class="c"># sudo systemctl enable wg-quick@wg0</span>
<span class="c">#fi</span>
<span class="c">#sudo systemctl start wg-quick@wg0</span>
<span class="nb">cd</span> /usr/local/share/gtkwg/
python GtkWgTray.py
</code></pre></div></div>
<p>xfce: “Menu -&gt; Paramètres -&gt; Session et démarrage”, Démarrage automatique dapplications<br />
<img src="/images/sup-wireguard.png" alt="" width="400" /></p>
<p><code class="language-plaintext warning highlighter-rouge">Remplacer "yann" par votre nom d'utilisateur</code></p>
<h2 id="virtuel-qemu-kvm-vmm">Virtuel QEMU KVM VMM</h2>
<h3 id="installation-virt-manager">Installation Virt-Manager</h3>
<ul>
<li><a href="/2023/05/31/EndeavourOS-Virt-Manager_Complete_Edition.html">EndeavourOS Virt-Manager Complete Edition (VMM KVM QEMU)</a></li>
</ul>
<p>Les images disques</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[yann@yann-pc1 ~]$ tree ~/virtuel/KVM/
/home/yann/virtuel/KVM/
├── bliss-install.sh
├── bliss.sh
├── debian-12-nocloud-amd64.qcow2
├── eos-lvm-luks.qcow2
├── vm-bullseye.qcow2
├── vm-debian12.qcow2
├── wineleven.qcow2
└── winten.qcow2
</code></pre></div></div>
<p>Les configurations</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tree -L 2 /etc/libvirt/qemu
/etc/libvirt/qemu
├── archlinux.xml
├── autostart
├── networks
│   ├── autostart
│   ├── default.xml
│   └── host-bridge.xml
├── vm-bullseye.xml
├── vm-debian12.xml
├── win10.xml
└── win11.xml
</code></pre></div></div>
<h3 id="réseau">Réseau</h3>
<p><a href="/2023/05/31/EndeavourOS-Virt-Manager_Complete_Edition.html#hôte---networkmanager-bridge-network-br0-sur-autre-interface">Hôte - NetworkManager Bridge Network br0 sur autre interface</a></p>
<h3 id="erreur-de-redirection-usb">Erreur de redirection USB</h3>
<p class="warning">ATTENTION!!!<br />
Si vous avez installé la gestion des lecteurs NFC (<a href="#lecture-nfc-usbrfid">Lecture NFC USB/RFID</a>), il ne sera pas possible de rediriger certains périphériques USB dans les machines virtuelles<br />
La solution par arrêt et désactivation du socket pcscd ne peut être définitive car il est utlisée par des applications comme KeepassXC et dautres…</p>
<p>Lerreur suivante est affichée<br />
<img src="/images/kvm-erreur-usb-yubico.png" alt="" width="300" /><br />
et dans les logs</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sept. 17 07:10:03 yann-pc1 kernel: input: Yubico YubiKey OTP+FIDO+CCID as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:1050:0407.0015/input/input36
sept. 17 07:10:03 yann-pc1 kernel: hid-generic 0003:1050:0407.0015: input,hidraw0: USB HID v1.10 Keyboard [Yubico YubiKey OTP+FIDO+CCID] on usb-0000:00:14.0-3/input0
sept. 17 07:10:03 yann-pc1 kernel: hid-generic 0003:1050:0407.0016: hiddev96,hidraw1: USB HID v1.10 Device [Yubico YubiKey OTP+FIDO+CCID] on usb-0000:00:14.0-3/input1
sept. 17 07:10:03 yann-pc1 kernel: usb 1-3: usbfs: process 2152 (pcscd) did not claim interface 2 before use
</code></pre></div></div>
<p>Solution, arrêter et désactiver pcscd</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl stop pcscd.socket
<span class="nb">sudo </span>systemctl disable pcscd.socket
</code></pre></div></div>
<p>Réactivation</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl <span class="nb">enable </span>pcscd.socket <span class="nt">--now</span>
</code></pre></div></div>
<h2 id="maintenance">Maintenance</h2>
<h3 id="mise-à-jour--si-erreur-de-paquet-ou-signature-pgp">Mise à jour , si erreur de paquet ou signature PGP</h3>
<p>En cas derreur de paquet ou signature PGP</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S endeavouros-keyring archlinux-keyring
</code></pre></div></div>
<p><code class="language-plaintext info highlighter-rouge">Redémarrer la machine</code></p>
<h3 id="montage-partition-chiffrée-luks2">Montage partition chiffrée LUKS2</h3>
<p>Installer les outils archlinux</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman -S arch-install-scripts
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p2 crypt
mount /dev/mapper/vg0-lvroot /mnt
mkdir -p /mnt/home
mount /dev/mapper/vg0-lvhome /mnt/home
mkdir -p /mnt/efi
mount /dev/nvme0n1p1 /mnt/efi
</code></pre></div></div>
<h3 id="récupérer-la-partition-temporaire-option">Récupérer la partition temporaire (OPTION)</h3>
<p><strong>Ajouter la partition temporaire à la partition LUKS</strong></p>
<p>Vous pouvez simplement reformater /dev/nvme0n1p3 et lutiliser comme stockage non chiffré, mais ici, nous allons récupérer lespace</p>
<p><strong>Redémarrez sur un environnement Live-Cd</strong></p>
<p>Basculer le clavier en FR</p>
<p><strong>Supprimer sda3 (installation temporaire EndeavourOS)</strong></p>
<p>Pour supprimer /dev/nvme0n1p3</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo fdisk /dev/sda
</code></pre></div></div>
<p>Eentrez simplement les caractères ci-dessous dans lordre indiqué.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; p
&gt; d
&gt; 3 (delete partition 3)
&gt; w (write changes to disk)
</code></pre></div></div>
<p><strong>Étendre /dev/nvme0n1p2 (partition LUKS) et le groupe de volumes</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo fdisk /dev/sda
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; d
&gt; 2 (delete partition 2)
&gt; n
&gt; 2 (recreate partition 2)
&gt; (first sector is 'default'; press enter)
&gt; (last sector is 'default'; press enter)
&gt; n (keep existing filesystem signature)
&gt; w (write changes to disk)
</code></pre></div></div>
<p>Partition LUKS</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>cryptsetup luksOpen /dev/nvme0n1p2 crypt
<span class="nb">sudo </span>cryptsetup resize crypt <span class="nt">-v</span>
<span class="nb">sudo </span>e2fsck <span class="nt">-f</span> /dev/mapper/vg0-lvroot
<span class="nb">sudo </span>e2fsck <span class="nt">-f</span> /dev/mapper/vg0-lvhome
<span class="nb">sudo </span>pvresize /dev/mapper/crypt
</code></pre></div></div>
<p>Le groupe de volumes vg0 contient maintenant lespace que nous avons libéré en supprimant /dev/nvme0n1p3. Il a été ajouté en tant quespace libre pouvant être utilisé pour des instantanés ou une affectation future au volume racine</p>
<p>Oter la clé Live<br />
<code class="language-plaintext info highlighter-rouge">Redémarrer la machine</code></p>
<h3 id="pacman-hook-liste-paquets-installés">Pacman Hook Liste paquets installés</h3>
<p><em>Ce hook sauvegardera une liste de vos paquets natifs et étrangers (AUR) installés. Cela garantit que vous aurez toujours une liste à jour de tous vos paquets que vous pourrez réinstaller.</em></p>
<p>Prérequis pour la création du hook et des scripts, créez des sous-répertoires</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /etc/pacman.d/{hooks,hooks.bin}
</code></pre></div></div>
<p>Créez le hook</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nano /etc/pacman.d/hooks/50-pacman-list.hook
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#/etc/pacman.d/hooks/50-pacman-list.hook
[Trigger]
Type = Package
Operation = Install
Operation = Upgrade
Operation = Remove
Target = *
[Action]
Description = Création liste des paquets installés
When = PostTransaction
Exec = /bin/sh -c '/usr/bin/pacman -Qqe &gt; /mnt/FreeUSB2To/PC1_eos_pkg_list.txt'
</code></pre></div></div>
<p>Pour installer des paquets depuis une sauvegarde antérieure de la liste des paquets, tout en ne réinstallant pas ceux qui sont déjà installés et à jour, lancer:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo pacman -S --needed - &lt; PC1_eos_pkg_list.txt
sudo pacman -S --needed $(comm -12 &lt;(pacman -Slq | sort) &lt;(sort pkglist.txt))
</code></pre></div></div>
<h3 id="lecture-nfc-usbrfid">Lecture NFC USB/RFID</h3>
<p><a href="/2019/07/30/Lecteur-USB-RFID(NFC)-SCL3711.html#lecteur-usbrfid-scl3711">Lecteur USB/RFID SCL3711</a></p>
<p>Installer</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yay -S ccid libnfc acsccid pcsclite pcsc-tools
</code></pre></div></div>
<p>Le paquet pcsclite contient un pcscd.socket qui fera démarrer le serveur pcscd lorsquun programme le demandera. Vous pouvez également démarrer/activer manuellement le service pcscd.</p>
<p>Après avoir installé libnfc, il est important de rebrancher votre lecteur de cartes car il est livré avec quelques règles udev et une liste noire de modules du noyau qui doivent être chargées avant de charger le pilote proprement dit.</p>
<p>Brancher votre lecteur RFID (si ça nest pas déjà fait).</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo dmesg
</code></pre></div></div>
<p><img src="/images/2023-06-20_18-00.png" alt="" /></p>
<p>USB → <code class="language-plaintext highlighter-rouge">Bus 001 Device 016: ID 04e6:5591 SCM Microsystems, Inc. SCL3711-NFC&amp;RW</code></p>
<p>Après insertion, archlinux va alors charger automatiquement en arrière plan des modules qui vont perturber les NFC Tools et provoquer une erreur : <code class="language-plaintext error highlighter-rouge">error libnfc.driver.pn53x_usb Unable to set USB configuration (Device or resource busy)</code></p>
<p>Les modules perturbateurs</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsmod |grep pn533
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pn533_usb 20480 0
pn533 45056 1 pn533_usb
nfc 135168 1 pn533
</code></pre></div></div>
<p>Pour décharger ces modules, toujours dans votre fenêtre du terminal, entrez les commandes suivantes.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo modprobe -r pn533_usb
sudo modprobe -r pn533
</code></pre></div></div>
<p>Pour être sûr que le lecteur fonctionne correctement avec les NFC Tools, poser un tag RFID sur le lecteur et lancer la commande suivante</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nfc-list
</code></pre></div></div>
<p><img src="/images/2023-06-20_18-12.png" alt="" /></p>
<h3 id="sauvegardes-locales">Sauvegardes locales</h3>
<p><a href="/2021/05/28/Sauvegardes_locales_avec_systemd_utilisateur_service_et_timer.html">Sauvegardes locales avec systemd utilisateur service et timer</a></p>
<p>La sauvegarde démarre 3 minutes après la mise sous tension de PC1</p>
<p>Les logs : <code class="language-plaintext highlighter-rouge">journalctl --user -u savyann.service</code><br />
Liste des timers : <code class="language-plaintext highlighter-rouge">systemctl --user list-timers --all</code></p>
<h3 id="modifier-veille-écran-option">Modifier veille écran (OPTION)</h3>
<p><a href="/2023/09/12/Economiseur-et-Veille-Ecran-XFCE-xscreensaver.html">Economiseur et veille écran XFCE XScreensaver</a></p>
<h3 id="arborescence-dossiers-et-fichiers">Arborescence dossiers et fichiers</h3>
<p><img src="/images/tree_yann.png" alt="" /></p>
<p><img src="/images/tree_media.png" alt="" /> <img src="/images/tree_media_dplus.png" alt="" /></p>
<h3 id="changer-m2-2280-nvme">Changer M.2 2280 NVMe</h3>
<p>Remplacer M.2 2280 NVMe 1To par une 2To<br />
<img src="/images/ssd_Fikwot_FN501_Pro.png" alt="" /></p>
<p>Boot sur usb live EndeavourOS</p>
<p>Passer en mode su</p>
<p>Les partitions du disque chiffré nvme0n1</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme0n1 259:0 0 931.5G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part
├─nvme0n1p2 259:2 0 920G 0 part
│ └─crypttemp 254:3 0 920G 0 crypt
│ ├─vg0-lvroot 254:4 0 70G 0 lvm
│ ├─vg0-lvhome 254:5 0 120G 0 lvm
│ └─vg0-lvmedia 254:6 0 600G 0 lvm
└─nvme0n1p3 259:3 0 11G 0 part
</code></pre></div></div>
<p>Déchiffrer la partition nvme0n1p2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p2 crypttemp
</code></pre></div></div>
<p>Créer et monter le système à sauvegarder sur /media</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> /media
<span class="nb">mkdir</span> <span class="nt">-p</span> /media/home
<span class="nb">mkdir</span> <span class="nt">-p</span> /media/efi
mount /dev/vg0/lvroot /media
mount /dev/vg0/lvhome /media/home
mount /dev/nvme0n1p1 /media/efi
</code></pre></div></div>
<p>Monter le système qui va recevoir la sauvegarde</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/vg-nas-one/sav /mnt
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/pc1
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/pc1/efi
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/pc1/home
</code></pre></div></div>
<p>Sauvegarder le système actuel (racine,home et efi)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rsync -avA /media/ /mnt/pc1
</code></pre></div></div>
<p>Patienter plusieurs minutes, suivant la taille</p>
<p>Arrêter la machine PC1</p>
<p>Remplacer la carte SSD M2<br />
Redémarrer la machine sur un USB Live EndeavourOS</p>
<p>Zapper le nouveau disque SSD M.2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sgdisk --zap-all /dev/nvme0n1
</code></pre></div></div>
<p>Partitionnement du disque NVME 2To GPT + LVM</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gdisk /dev/nvme0n1
</code></pre></div></div>
<p>Créer 2 partitions<br />
Partition 1 : 512M EFI (code ef00) système de fichier FAT32<br />
Partition 2 : le reste LVM (code 8e00) système de fichier EXT4</p>
<p>Formater partition EFI</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkfs.fat -F32 /dev/nvme0n1p1
</code></pre></div></div>
<p>Chiffrer la partition /dev/nvme0n1p2</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksFormat --type luks2 /dev/nvme0n1p2
</code></pre></div></div>
<p>Ouvrir la partition chiffrée</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksOpen /dev/nvme0n1p2 crypt
</code></pre></div></div>
<p>Créer LVM</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pvcreate /dev/mapper/crypt
vgcreate vg0 /dev/mapper/crypt
</code></pre></div></div>
<p>Créer les volumes</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lvcreate <span class="nt">-L</span> 60G vg0 <span class="nt">-n</span> lvroot <span class="c"># Logical volume "lvroot" created.</span>
lvcreate <span class="nt">-L</span> 120G vg0 <span class="nt">-n</span> lvhome <span class="c"># Logical volume "lvhome" created.</span>
</code></pre></div></div>
<p>Système de fichier</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkfs.ext4 <span class="nt">-L</span> root /dev/mapper/vg0-lvroot
mkfs.ext4 <span class="nt">-L</span> home /dev/mapper/vg0-lvhome
</code></pre></div></div>
<p>Monter le nouveau système sur /mnt</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/mapper/vg0-lvroot /mnt
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/home
mount /dev/mapper/vg0-lvhome /mnt/home
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/efi
mount /dev/nvme0n1p1 /mnt/efi
</code></pre></div></div>
<p>Monter la sauvegarde sur media</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount /dev/vg-nas-one/sav /media
</code></pre></div></div>
<p>Restaurer le système</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rsync -avA /media/pc1/ /mnt
</code></pre></div></div>
<p>Patienter plusieurs minutes, suivant la taille</p>
<p>Création volume logique LVM media et montage</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lvcreate <span class="nt">-L</span> 800G vg0 <span class="nt">-n</span> lvmedia
mkfs.ext4 <span class="nt">-L</span> media /dev/mapper/vg0-lvmedia
<span class="nb">mkdir</span> <span class="nt">-p</span> /mnt/srv/media
mount /dev/vg0/lvmedia /mnt/srv/media
</code></pre></div></div>
<p>Restaurer la sauvegarde multimedia</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rsync -avA /media/pc1_20240201/media/srv/media/ /mnt/srv/media
</code></pre></div></div>
<p>Démonter le système de sauvegarde</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>umount /media
</code></pre></div></div>
<p>Ajouter un fichier de clé existant LUKS</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksAddKey /dev/nvme0n1p2 /mnt/crypto_keyfile.bin
</code></pre></div></div>
<p>Il faut saisir le phrase mot de passe</p>
<p>Configuration /etc/crypttab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cryptsetup luksUUID /dev/nvme0n1p2
</code></pre></div></div>
<p>Renvoie UUID ae37e59d-35f7-4920-8428-be8be8d15243</p>
<p>Modifier /mnt/etc/crypttab</p>
<p>Contenu</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># &lt;name&gt; &lt;device&gt; &lt;password&gt; &lt;options&gt;
cryptlvm UUID=ae37e59d-35f7-4920-8428-be8be8d15243 /crypto_keyfile.bin luks
</code></pre></div></div>
<p>Passer en chroot</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>arch-chroot /mnt
</code></pre></div></div>
<p>Relever les UUID</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvroot
</code></pre></div></div>
<p>renvoie lUUID du volume racine : 2a6cab35-6c52-4382-9aee-06a376a8acc0</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvhome
</code></pre></div></div>
<p>renvoie lUUID du volume daccueil : b4e52069-a8c9-459e-b39f-6ac1b682b0d6</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/mapper/vg0-lvmedia
</code></pre></div></div>
<p>renvoie lUUID du volume media : 1ca4bfc7-3d31-4859-aeb3-656214fab490</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid -s UUID -o value /dev/nvme0n1p1
</code></pre></div></div>
<p>renvoie lUUID du volume media : E5E4-A4AE</p>
<p>Configurer /etc/fstab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/fstab
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>UUID=E5E4-A4AE /efi vfat defaults,noatime 0 2
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
UUID=2a6cab35-6c52-4382-9aee-06a376a8acc0 / ext4 defaults,acl,noatime,discard 0 0
UUID=b4e52069-a8c9-459e-b39f-6ac1b682b0d6 /home ext4 defaults,acl,noatime,discard 0 0
/swapfile none swap defaults,pri=-2 0 0
# /dev/mapper/vg0-lvmedia
UUID=86a7c58c-8f30-42e2-bd39-d1ae7464c837 /srv/media ext4 rw,relatime 0 2
# /dev/mapper/ssd--512-virtuel
UUID=84bc1aa9-23ac-4530-b861-bc33171b7b42 /virtuel ext4 defaults 0 2
# /dev/mapper/vg--nas--one-sav
UUID=c5b9eefc-1daa-4a0d-8a72-6169b3c8c91f /sauvegardes ext4 defaults 0 2
# /dev/vg-nas-one/iso - Volume logique 200G du disque 4To
UUID=58f4b6c7-3811-41d5-9964-f47ac32375f6 /iso ext4 defaults 0 2
</code></pre></div></div>
<p>options du noyau</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>blkid <span class="nt">-s</span> UUID <span class="nt">-o</span> value /dev/nvme0n1p2 <span class="c"># --&gt; ae37e59d-35f7-4920-8428-be8be8d15243</span>
</code></pre></div></div>
<p>Modifier /etc/kernel/cmdline</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano /etc/kernel/cmdline
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme_load=YES nowatchdog rw rd.luks.uuid=ae37e59d-35f7-4920-8428-be8be8d15243 root=/dev/mapper/vg0-lvroot
</code></pre></div></div>
<p>Réinstaller noyau</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>reinstall-kernels
</code></pre></div></div>
<p>Sortie du chroot , retirer la clé USB Live et reboot de la machine</p>
<h3 id="suppression-disque-hdd4to">Suppression disque HDD4To</h3>
<p><em>Ce disque de très haute capacité est très peu utilisé</em></p>
<p>Démontage des partitions concernées</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>umount /sauvegardes
<span class="nb">sudo </span>umount /iso
</code></pre></div></div>
<p>Structure LVM du disque concerné</p>
<ul>
<li>Physical volume : /dev/sdc3</li>
<li>Volume : vg-nas-one</li>
<li>Volumes logiques :
<ul>
<li>iso</li>
<li>sav</li>
</ul>
</li>
</ul>
<p>Suppression des composants LVM du disque</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>lvremove /dev/vg-nas-one/iso
<span class="nb">sudo </span>lvremove /dev/vg-nas-one/sav
<span class="nb">sudo </span>vgremove vg-nas-one
<span class="nb">sudo </span>pvremove /dev/sdc3
</code></pre></div></div>
<p>Supprimer les partitions dans le fichier /etc/fstab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /dev/mapper/vg--nas--one-sav
UUID=c5b9eefc-1daa-4a0d-8a72-6169b3c8c91f /sauvegardes ext4 defaults 0 2
# /dev/vg-nas-one/iso - Volume logique 200G du disque 4To
UUID=58f4b6c7-3811-41d5-9964-f47ac32375f6 /iso ext4 defaults 0 2
</code></pre></div></div>
<p>Eteindre la machine, retirer le disque HDD et redémarrer.</p>
<h3 id="ajout-disque-lvm">Ajout disque LVM</h3>
<h4 id="ssd-120go">SSD 120Go</h4>
<p>Disque sda</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 111,8G 0 disk
</code></pre></div></div>
<p><strong>gdisk</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo gdisk /dev/sda
</code></pre></div></div>
<p>o : nouvelle partion dos<br />
n : nouvelle partition typt LVM 8e00</p>
<p>Format fichier ext4</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkfs.ext4 /dev/sda1
</code></pre></div></div>
<p><strong>LVM</strong> (Logical Volume Manager, ou gestionnaire de volumes logiques en français) permet la création et la gestion de volumes logiques sous Linux. Lutilisation de volumes logiques remplace en quelque sorte le partitionnement des disques.</p>
<p>Volume physique : <code class="language-plaintext highlighter-rouge">sudo pvcreate /dev/sda1</code><br />
GroupevVolumes : <code class="language-plaintext highlighter-rouge">sudo vgcreate ssd-120 /dev/sda1</code><br />
Volume logique : <code class="language-plaintext highlighter-rouge">sudo lvcreate -n lv120 -l +100%FREE ssd-120</code><br />
Fichier ext4 : <code class="language-plaintext highlighter-rouge">sudo mkfs.ext4 /dev/ssd-120/lv120</code></p>
<p>Relever UUID <code class="language-plaintext highlighter-rouge">sudo blkid |grep lv120</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/dev/mapper/ssd--120-lv120: UUID="6b48e98c-9b85-461b-9371-040765aae682" BLOCK_SIZE="4096" TYPE="ext4"
</code></pre></div></div>
<p>Création point de montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /mnt/ssd
</code></pre></div></div>
<p>Ajouter les lignes suivantes au fichier <strong>/etc/fstab</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /dev/mapper/ssd--120-lv120
UUID=6b48e98c-9b85-461b-9371-040765aae682 /mnt/ssd ext4 defaults 0 2
</code></pre></div></div>
<p>Rechargement et montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl daemon-reload
sudo mount -a
</code></pre></div></div>
<p>Vérification : <code class="language-plaintext highlighter-rouge">df -h /mnt/ssd/</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/mapper/ssd--120-lv120 110G 2,1M 104G 1% /mnt/ssd
</code></pre></div></div>
<p>Droits en écriture à lutilisateur</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo chown $USER:$USER /mnt/ssd/
</code></pre></div></div>
<h4 id="hdd-4to">HDD 4To</h4>
<p>Disque sdc</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdc 8:32 0 3,6T 0 disk
</code></pre></div></div>
<p><strong>gdisk</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo gdisk /dev/sdc
</code></pre></div></div>
<p>o : nouvelle partion dos<br />
n : nouvelle partition typt LVM 8e00</p>
<p>Format fichier ext4</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkfs.ext4 /dev/sdc1
</code></pre></div></div>
<p><strong>LVM</strong> (Logical Volume Manager, ou gestionnaire de volumes logiques en français) permet la création et la gestion de volumes logiques sous Linux. Lutilisation de volumes logiques remplace en quelque sorte le partitionnement des disques.</p>
<p>Volume physique : <code class="language-plaintext highlighter-rouge">sudo pvcreate /dev/sdc1</code><br />
GroupevVolumes : <code class="language-plaintext highlighter-rouge">sudo vgcreate hdd-4to /dev/sdc1</code><br />
Volume logique : <code class="language-plaintext highlighter-rouge">sudo lvcreate -n lv4to -l +100%FREE hdd-4to</code><br />
Fichier ext4 : <code class="language-plaintext highlighter-rouge">sudo mkfs.ext4 /dev/hdd-4to/lv4to</code></p>
<p>Relever UUID <code class="language-plaintext highlighter-rouge">sudo blkid |grep lv4to</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/dev/mapper/hdd--4to-lv4to: UUID="26466f5b-c1c0-45db-a9f2-25c0772468ff" BLOCK_SIZE="4096" TYPE="ext4"
</code></pre></div></div>
<p>Création point de montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo mkdir -p /mnt/hdd
</code></pre></div></div>
<p>Ajouter les lignes suivantes au fichier <strong>/etc/fstab</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /dev/mapper/hdd--4to-lv4to
UUID=26466f5b-c1c0-45db-a9f2-25c0772468ff /mnt/hdd ext4 defaults 0 2
</code></pre></div></div>
<p>Rechargement et montage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo systemctl daemon-reload
sudo mount -a
</code></pre></div></div>
<p>Vérification : <code class="language-plaintext highlighter-rouge">df -h /mnt/hdd/</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/mapper/hdd--4to-lv4to 3,6T 2,1M 3,4T 1% /mnt/hdd
</code></pre></div></div>
<p>Droits en écriture à lutilisateur</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo chown $USER:$USER /mnt/hdd/
</code></pre></div></div>
<h3 id="etat-des-liaux">Etat des liaux</h3>
<p>Les disques</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Disque /dev/sda : 111,79 GiB, 120034123776 octets, 234441648 secteurs
Modèle de disque : CT120BX300SSD1
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Type d'étiquette de disque : gpt
Identifiant de disque : 34D2504E-806A-47F2-AFB8-B2014C54DEFB
Périphérique Début Fin Secteurs Taille Type
/dev/sda1 2048 234440703 234438656 111,8G LVM Linux
Disque /dev/sdb : 476,94 GiB, 512110190592 octets, 1000215216 secteurs
Modèle de disque : Crucial_CT512MX1
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x19dd6163
Périphérique Amorçage Début Fin Secteurs Taille Id Type
/dev/sdb1 2048 1000214527 1000212480 476,9G 8e LVM Linux
Disque /dev/nvme0n1 : 1,86 TiB, 2048408248320 octets, 4000797360 secteurs
Modèle de disque : FIKWOT FN501 Pro 2TB
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : gpt
Identifiant de disque : 381BD67E-5015-4A43-BBF5-961489275B16
Périphérique Début Fin Secteurs Taille Type
/dev/nvme0n1p1 2048 1050623 1048576 512M Système EFI
/dev/nvme0n1p2 1050624 4000796671 3999746048 1,9T LVM Linux
</code></pre></div></div>
<p>Structure des volumes : <code class="language-plaintext highlighter-rouge">lsblk</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 111,8G 0 disk
└─sda1 8:1 0 111,8G 0 part
└─ssd--120-lv120 254:1 0 111,8G 0 lvm /mnt/ssd
sdb 8:16 0 476,9G 0 disk
└─sdb1 8:17 0 476,9G 0 part
└─ssd--512-virtuel 254:0 0 476,9G 0 lvm /virtuel
nvme0n1 259:0 0 1,9T 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /efi
└─nvme0n1p2 259:2 0 1,9T 0 part
└─cryptlvm 254:2 0 1,9T 0 crypt
├─vg0-lvroot 254:3 0 60G 0 lvm /
├─vg0-lvhome 254:4 0 120G 0 lvm /home
└─vg0-lvmedia 254:5 0 800G 0 lvm /srv/media
</code></pre></div></div>
<p>Les volumes LVM</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[root@yann-pc1 yann]# pvs
PV VG Fmt Attr PSize PFree
/dev/mapper/cryptlvm vg0 lvm2 a-- 1,86t 927,21g
/dev/sda1 ssd-120 lvm2 a-- &lt;111,79g 0
/dev/sdb1 ssd-512 lvm2 a-- &lt;476,94g 0
[root@yann-pc1 yann]# vgs
VG #PV #LV #SN Attr VSize VFree
ssd-120 1 1 0 wz--n- &lt;111,79g 0
ssd-512 1 1 0 wz--n- &lt;476,94g 0
vg0 1 3 0 wz--n- 1,86t 927,21g
[root@yann-pc1 yann]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv120 ssd-120 -wi-ao---- &lt;111,79g
virtuel ssd-512 -wi-ao---- &lt;476,94g
lvhome vg0 -wi-ao---- 120,00g
lvmedia vg0 -wi-ao---- 800,00g
lvroot vg0 -wi-ao---- 60,00g
</code></pre></div></div>
<p>Les point de montage : <code class="language-plaintext highlighter-rouge">mount |grep -E "/dev/mapper|/dev/sd|/dev/nvme"</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/dev/mapper/vg0-lvroot on / type ext4 (rw,noatime)
/dev/nvme0n1p1 on /efi type vfat (rw,noatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
/dev/mapper/ssd--512-virtuel on /virtuel type ext4 (rw,relatime)
/dev/mapper/ssd--120-lv120 on /mnt/ssd type ext4 (rw,relatime)
/dev/mapper/vg0-lvhome on /home type ext4 (rw,noatime)
/dev/mapper/vg0-lvmedia on /srv/media type ext4 (rw,relatime)
</code></pre></div></div>
<p>fstab</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a device; this may
# be used with UUID= as a more robust way to name devices that works even if
# disks are added and removed. See fstab(5).
#
# &lt;file system&gt; &lt;mount point&gt; &lt;type&gt; &lt;options&gt; &lt;dump&gt; &lt;pass&gt;
UUID=E5E4-A4AE /efi vfat defaults,noatime 0 2
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
UUID=2a6cab35-6c52-4382-9aee-06a376a8acc0 / ext4 defaults,acl,noatime 0 0
UUID=b4e52069-a8c9-459e-b39f-6ac1b682b0d6 /home ext4 defaults,acl,noatime 0 0
/swapfile none swap defaults,pri=-2 0 0
# /dev/mapper/vg0-lvmedia
UUID=1ca4bfc7-3d31-4859-aeb3-656214fab490 /srv/media ext4 rw,relatime 0 2
# /dev/mapper/ssd--512-virtuel
UUID=84bc1aa9-23ac-4530-b861-bc33171b7b42 /virtuel ext4 defaults 0 2
# Les montage NFS du serveur lenovo 192.168.0.215
192.168.0.215:/ /mnt/sharenfs nfs4 nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10s,rsize=8192,wsize=8192
# /dev/mapper/ssd--120-lv120
UUID=6b48e98c-9b85-461b-9371-040765aae682 /mnt/ssd ext4 defaults 0 2
</code></pre></div></div>
<p>Les liens</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$HOME/.borg -&gt; /mnt/sharenfs/pc1/.borg
$HOME/Documents -&gt; /srv/media/Documents
$HOME/FreeUSB2To -&gt; /mnt/FreeUSB2To
$HOME/media -&gt; /srv/media
$HOME/Musique -&gt; /mnt/sharenfs/Musique
$HOME/sharenfs -&gt; /mnt/sharenfs
$HOME/virtuel -&gt; /virtuel
/files -&gt; /home/yann/media/statique/files
/images -&gt; /home/yann/media/statique/images
</code></pre></div></div>
</div>
<div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2023-05-29T00:00:00+02:00"><!-- start custom article footer snippet -->
<!-- end custom article footer snippet -->
<!--
<div align="right"><a type="application/rss+xml" href="/feed.xml" title="S'abonner"><i class="fa fa-rss fa-2x"></i></a>
&emsp;</div>
-->
</footer>
<div class="article__section-navigator clearfix"><div class="previous"><span>PRÉCÉDENT</span><a href="/2023/05/22/Endeavour_Dell_Latitude_e6230_conteneur_nspawn_debian_bullseye_nspyan.html">EndeavourOS Dell Latitude e6230 --> conteneur nspawn debian bullseye nspyan</a></div><div class="next"><span>SUIVANT</span><a href="/2023/05/29/PC1-EndeavourOS-XFCE-ASUS_H110M_A_conteneur_nspawn_debian_bullseye_nspyan.html">PC1 Ordinateur Bureau EndeavourOS xfce --> conteneur nspawn debian bullseye nspyan</a></div></div></div>
</div>
<script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
$(function() {
var $this ,$scroll;
var $articleContent = $('.js-article-content');
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
var scroll = hasSidebar ? '.js-page-main' : 'html, body';
$scroll = $(scroll);
$articleContent.find('.highlight').each(function() {
$this = $(this);
$this.attr('data-lang', $this.find('code').attr('data-lang'));
});
$articleContent.find('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').each(function() {
$this = $(this);
$this.append($('<a class="anchor d-print-none" aria-hidden="true"></a>').html('<i class="fas fa-anchor"></i>'));
});
$articleContent.on('click', '.anchor', function() {
$scroll.scrollToAnchor('#' + $(this).parent().attr('id'), 400);
});
});
});
})();
</script>
</div><section class="page__comments d-print-none"></section></article><!-- start custom main bottom snippet -->
<!-- end custom main bottom snippet -->
</div>
</div></div></div></div>
</div><script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
var $body = $('body'), $window = $(window);
var $pageRoot = $('.js-page-root'), $pageMain = $('.js-page-main');
var activeCount = 0;
function modal(options) {
var $root = this, visible, onChange, hideWhenWindowScroll = false;
var scrollTop;
function setOptions(options) {
var _options = options || {};
visible = _options.initialVisible === undefined ? false : show;
onChange = _options.onChange;
hideWhenWindowScroll = _options.hideWhenWindowScroll;
}
function init() {
setState(visible);
}
function setState(isShow) {
if (isShow === visible) {
return;
}
visible = isShow;
if (visible) {
activeCount++;
scrollTop = $(window).scrollTop() || $pageMain.scrollTop();
$root.addClass('modal--show');
$pageMain.scrollTop(scrollTop);
activeCount === 1 && ($pageRoot.addClass('show-modal'), $body.addClass('of-hidden'));
hideWhenWindowScroll && window.hasEvent('touchstart') && $window.on('scroll', hide);
$window.on('keyup', handleKeyup);
} else {
activeCount > 0 && activeCount--;
$root.removeClass('modal--show');
$window.scrollTop(scrollTop);
activeCount === 0 && ($pageRoot.removeClass('show-modal'), $body.removeClass('of-hidden'));
hideWhenWindowScroll && window.hasEvent('touchstart') && $window.off('scroll', hide);
$window.off('keyup', handleKeyup);
}
onChange && onChange(visible);
}
function show() {
setState(true);
}
function hide() {
setState(false);
}
function handleKeyup(e) {
// Char Code: 27 ESC
if (e.which === 27) {
hide();
}
}
setOptions(options);
init();
return {
show: show,
hide: hide,
$el: $root
};
}
$.fn.modal = modal;
});
})();
</script><div class="modal modal--overflow page__search-modal d-print-none js-page-search-modal"><script>
(function () {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
// search panel
var search = (window.search || (window.search = {}));
var useDefaultSearchBox = window.useDefaultSearchBox === undefined ?
true : window.useDefaultSearchBox ;
var $searchModal = $('.js-page-search-modal');
var $searchToggle = $('.js-search-toggle');
var searchModal = $searchModal.modal({ onChange: handleModalChange, hideWhenWindowScroll: true });
var modalVisible = false;
search.searchModal = searchModal;
var $searchBox = null;
var $searchInput = null;
var $searchClear = null;
function getModalVisible() {
return modalVisible;
}
search.getModalVisible = getModalVisible;
function handleModalChange(visible) {
modalVisible = visible;
if (visible) {
search.onShow && search.onShow();
useDefaultSearchBox && $searchInput[0] && $searchInput[0].focus();
} else {
search.onShow && search.onHide();
useDefaultSearchBox && $searchInput[0] && $searchInput[0].blur();
setTimeout(function() {
useDefaultSearchBox && ($searchInput.val(''), $searchBox.removeClass('not-empty'));
search.clear && search.clear();
window.pageAsideAffix && window.pageAsideAffix.refresh();
}, 400);
}
}
$searchToggle.on('click', function() {
modalVisible ? searchModal.hide() : searchModal.show();
});
// Char Code: 83 S, 191 /
$(window).on('keyup', function(e) {
if (!modalVisible && !window.isFormElement(e.target || e.srcElement) && (e.which === 83 || e.which === 191)) {
modalVisible || searchModal.show();
}
});
if (useDefaultSearchBox) {
$searchBox = $('.js-search-box');
$searchInput = $searchBox.children('input');
$searchClear = $searchBox.children('.js-icon-clear');
search.getSearchInput = function() {
return $searchInput.get(0);
};
search.getVal = function() {
return $searchInput.val();
};
search.setVal = function(val) {
$searchInput.val(val);
};
$searchInput.on('focus', function() {
$(this).addClass('focus');
});
$searchInput.on('blur', function() {
$(this).removeClass('focus');
});
$searchInput.on('input', window.throttle(function() {
var val = $(this).val();
if (val === '' || typeof val !== 'string') {
search.clear && search.clear();
} else {
$searchBox.addClass('not-empty');
search.onInputNotEmpty && search.onInputNotEmpty(val);
}
}, 400));
$searchClear.on('click', function() {
$searchInput.val(''); $searchBox.removeClass('not-empty');
search.clear && search.clear();
});
}
});
})();
</script><div class="search search--dark">
<div class="main">
<div class="search__header">Recherche</div>
<div class="search-bar">
<div class="search-box js-search-box">
<div class="search-box__icon-search"><i class="fas fa-search"></i></div>
<input id="search-input" type="text" />
<div class="search-box__icon-clear js-icon-clear">
<a><i class="fas fa-times"></i></a>
</div>
</div>
<button class="button button--theme-dark button--pill search__cancel js-search-toggle">
Annuler</button>
</div>
<div id="results-container" class="search-result js-search-result"></div>
</div>
</div>
<!-- Script pointing to search-script.js -->
<script>/*!
* Simple-Jekyll-Search
* Copyright 2015-2020, Christian Fei
* Licensed under the MIT License.
*/
(function(){
'use strict'
var _$Templater_7 = {
compile: compile,
setOptions: setOptions
}
const options = {}
options.pattern = /\{(.*?)\}/g
options.template = ''
options.middleware = function () {}
function setOptions (_options) {
options.pattern = _options.pattern || options.pattern
options.template = _options.template || options.template
if (typeof _options.middleware === 'function') {
options.middleware = _options.middleware
}
}
function compile (data) {
return options.template.replace(options.pattern, function (match, prop) {
const value = options.middleware(prop, data[prop], options.template)
if (typeof value !== 'undefined') {
return value
}
return data[prop] || match
})
}
'use strict';
function fuzzysearch (needle, haystack) {
var tlen = haystack.length;
var qlen = needle.length;
if (qlen > tlen) {
return false;
}
if (qlen === tlen) {
return needle === haystack;
}
outer: for (var i = 0, j = 0; i < qlen; i++) {
var nch = needle.charCodeAt(i);
while (j < tlen) {
if (haystack.charCodeAt(j++) === nch) {
continue outer;
}
}
return false;
}
return true;
}
var _$fuzzysearch_1 = fuzzysearch;
'use strict'
/* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
function FuzzySearchStrategy () {
this.matches = function (string, crit) {
return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
}
}
'use strict'
var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
function LiteralSearchStrategy () {
this.matches = function (str, crit) {
if (!str) return false
str = str.trim().toLowerCase()
crit = crit.trim().toLowerCase()
return crit.split(' ').filter(function (word) {
return str.indexOf(word) >= 0
}).length === crit.split(' ').length
}
}
'use strict'
var _$Repository_4 = {
put: put,
clear: clear,
search: search,
setOptions: __setOptions_4
}
/* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
/* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
function NoSort () {
return 0
}
const data = []
let opt = {}
opt.fuzzy = false
opt.limit = 10
opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = NoSort
opt.exclude = []
function put (data) {
if (isObject(data)) {
return addObject(data)
}
if (isArray(data)) {
return addArray(data)
}
return undefined
}
function clear () {
data.length = 0
return data
}
function isObject (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
}
function isArray (obj) {
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
}
function addObject (_data) {
data.push(_data)
return data
}
function addArray (_data) {
const added = []
clear()
for (let i = 0, len = _data.length; i < len; i++) {
if (isObject(_data[i])) {
added.push(addObject(_data[i]))
}
}
return added
}
function search (crit) {
if (!crit) {
return []
}
return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
}
function __setOptions_4 (_opt) {
opt = _opt || {}
opt.fuzzy = _opt.fuzzy || false
opt.limit = _opt.limit || 10
opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
opt.sort = _opt.sort || NoSort
opt.exclude = _opt.exclude || []
}
function findMatches (data, crit, strategy, opt) {
const matches = []
for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
const match = findMatchesInObject(data[i], crit, strategy, opt)
if (match) {
matches.push(match)
}
}
return matches
}
function findMatchesInObject (obj, crit, strategy, opt) {
for (const key in obj) {
if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
return obj
}
}
}
function isExcluded (term, excludedTerms) {
for (let i = 0, len = excludedTerms.length; i < len; i++) {
const excludedTerm = excludedTerms[i]
if (new RegExp(excludedTerm).test(term)) {
return true
}
}
return false
}
/* globals ActiveXObject:false */
'use strict'
var _$JSONLoader_2 = {
load: load
}
function load (location, callback) {
const xhr = getXHR()
xhr.open('GET', location, true)
xhr.onreadystatechange = createStateChangeListener(xhr, callback)
xhr.send()
}
function createStateChangeListener (xhr, callback) {
return function () {
if (xhr.readyState === 4 && xhr.status === 200) {
try {
callback(null, JSON.parse(xhr.responseText))
} catch (err) {
callback(err, null)
}
}
}
}
function getXHR () {
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
}
'use strict'
var _$OptionsValidator_3 = function OptionsValidator (params) {
if (!validateParams(params)) {
throw new Error('-- OptionsValidator: required options missing')
}
if (!(this instanceof OptionsValidator)) {
return new OptionsValidator(params)
}
const requiredOptions = params.required
this.getRequiredOptions = function () {
return requiredOptions
}
this.validate = function (parameters) {
const errors = []
requiredOptions.forEach(function (requiredOptionName) {
if (typeof parameters[requiredOptionName] === 'undefined') {
errors.push(requiredOptionName)
}
})
return errors
}
function validateParams (params) {
if (!params) {
return false
}
return typeof params.required !== 'undefined' && params.required instanceof Array
}
}
'use strict'
var _$utils_9 = {
merge: merge,
isJSON: isJSON
}
function merge (defaultParams, mergeParams) {
const mergedOptions = {}
for (const option in defaultParams) {
mergedOptions[option] = defaultParams[option]
if (typeof mergeParams[option] !== 'undefined') {
mergedOptions[option] = mergeParams[option]
}
}
return mergedOptions
}
function isJSON (json) {
try {
if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
return true
}
return false
} catch (err) {
return false
}
}
var _$src_8 = {};
(function (window) {
'use strict'
let options = {
searchInput: null,
resultsContainer: null,
json: [],
success: Function.prototype,
searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
templateMiddleware: Function.prototype,
sortMiddleware: function () {
return 0
},
noResultsText: 'No results found',
limit: 10,
fuzzy: false,
debounceTime: null,
exclude: []
}
let debounceTimerHandle
const debounce = function (func, delayMillis) {
if (delayMillis) {
clearTimeout(debounceTimerHandle)
debounceTimerHandle = setTimeout(func, delayMillis)
} else {
func.call()
}
}
const requiredOptions = ['searchInput', 'resultsContainer', 'json']
/* removed: const _$Templater_7 = require('./Templater') */;
/* removed: const _$Repository_4 = require('./Repository') */;
/* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
const optionsValidator = _$OptionsValidator_3({
required: requiredOptions
})
/* removed: const _$utils_9 = require('./utils') */;
window.SimpleJekyllSearch = function (_options) {
const errors = optionsValidator.validate(_options)
if (errors.length > 0) {
throwError('You must specify the following required options: ' + requiredOptions)
}
options = _$utils_9.merge(options, _options)
_$Templater_7.setOptions({
template: options.searchResultTemplate,
middleware: options.templateMiddleware
})
_$Repository_4.setOptions({
fuzzy: options.fuzzy,
limit: options.limit,
sort: options.sortMiddleware,
exclude: options.exclude
})
if (_$utils_9.isJSON(options.json)) {
initWithJSON(options.json)
} else {
initWithURL(options.json)
}
const rv = {
search: search
}
typeof options.success === 'function' && options.success.call(rv)
return rv
}
function initWithJSON (json) {
_$Repository_4.put(json)
registerInput()
}
function initWithURL (url) {
_$JSONLoader_2.load(url, function (err, json) {
if (err) {
throwError('failed to get JSON (' + url + ')')
}
initWithJSON(json)
})
}
function emptyResultsContainer () {
options.resultsContainer.innerHTML = ''
}
function appendToResultsContainer (text) {
options.resultsContainer.innerHTML += text
}
function registerInput () {
options.searchInput.addEventListener('input', function (e) {
if (isWhitelistedKey(e.which)) {
emptyResultsContainer()
debounce(function () { search(e.target.value) }, options.debounceTime)
}
})
}
function search (query) {
if (isValidQuery(query)) {
emptyResultsContainer()
render(_$Repository_4.search(query), query)
}
}
function render (results, query) {
const len = results.length
if (len === 0) {
return appendToResultsContainer(options.noResultsText)
}
for (let i = 0; i < len; i++) {
results[i].query = query
appendToResultsContainer(_$Templater_7.compile(results[i]))
}
}
function isValidQuery (query) {
return query && query.length > 0
}
function isWhitelistedKey (key) {
return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
}
function throwError (message) {
throw new Error('SimpleJekyllSearch --- ' + message)
}
})(window)
}());
</script>
<!-- Configuration -->
<script>
SimpleJekyllSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('results-container'),
noResultsText: '<p>Aucun résultat!</p>',
json: '/search.json',
searchResultTemplate: '<li><a href="{url}">{date}&nbsp;{title}</a>&nbsp;(Création {create})</li>'
})
</script>
</div></div>
<script>(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function scrollToAnchor(anchor, duration, callback) {
var $root = this;
$root.animate({ scrollTop: $(anchor).position().top }, duration, function() {
window.history.replaceState(null, '', window.location.href.split('#')[0] + anchor);
callback && callback();
});
}
$.fn.scrollToAnchor = scrollToAnchor;
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function affix(options) {
var $root = this, $window = $(window), $scrollTarget, $scroll,
offsetBottom = 0, scrollTarget = window, scroll = window.document, disabled = false, isOverallScroller = true,
rootTop, rootLeft, rootHeight, scrollBottom, rootBottomTop,
hasInit = false, curState;
function setOptions(options) {
var _options = options || {};
_options.offsetBottom && (offsetBottom = _options.offsetBottom);
_options.scrollTarget && (scrollTarget = _options.scrollTarget);
_options.scroll && (scroll = _options.scroll);
_options.disabled !== undefined && (disabled = _options.disabled);
$scrollTarget = $(scrollTarget);
isOverallScroller = window.isOverallScroller($scrollTarget[0]);
$scroll = $(scroll);
}
function preCalc() {
top();
rootHeight = $root.outerHeight();
rootTop = $root.offset().top + (isOverallScroller ? 0 : $scrollTarget.scrollTop());
rootLeft = $root.offset().left;
}
function calc(needPreCalc) {
needPreCalc && preCalc();
scrollBottom = $scroll.outerHeight() - offsetBottom - rootHeight;
rootBottomTop = scrollBottom - rootTop;
}
function top() {
if (curState !== 'top') {
$root.removeClass('fixed').css({
left: 0,
top: 0
});
curState = 'top';
}
}
function fixed() {
if (curState !== 'fixed') {
$root.addClass('fixed').css({
left: rootLeft + 'px',
top: 0
});
curState = 'fixed';
}
}
function bottom() {
if (curState !== 'bottom') {
$root.removeClass('fixed').css({
left: 0,
top: rootBottomTop + 'px'
});
curState = 'bottom';
}
}
function setState() {
var scrollTop = $scrollTarget.scrollTop();
if (scrollTop >= rootTop && scrollTop <= scrollBottom) {
fixed();
} else if (scrollTop < rootTop) {
top();
} else {
bottom();
}
}
function init() {
if(!hasInit) {
var interval, timeout;
calc(true); setState();
// run calc every 100 millisecond
interval = setInterval(function() {
calc();
}, 100);
timeout = setTimeout(function() {
clearInterval(interval);
}, 45000);
window.pageLoad.then(function() {
setTimeout(function() {
clearInterval(interval);
clearTimeout(timeout);
}, 3000);
});
$scrollTarget.on('scroll', function() {
disabled || setState();
});
$window.on('resize', function() {
disabled || (calc(true), setState());
});
hasInit = true;
}
}
setOptions(options);
if (!disabled) {
init();
}
$window.on('resize', window.throttle(function() {
init();
}, 200));
return {
setOptions: setOptions,
refresh: function() {
calc(true, { animation: false }); setState();
}
};
}
$.fn.affix = affix;
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
function toc(options) {
var $root = this, $window = $(window), $scrollTarget, $scroller, $tocUl = $('<ul class="toc toc--ellipsis"></ul>'), $tocLi, $headings, $activeLast, $activeCur,
selectors = 'h1,h2,h3', container = 'body', scrollTarget = window, scroller = 'html, body', disabled = false,
headingsPos, scrolling = false, hasRendered = false, hasInit = false;
function setOptions(options) {
var _options = options || {};
_options.selectors && (selectors = _options.selectors);
_options.container && (container = _options.container);
_options.scrollTarget && (scrollTarget = _options.scrollTarget);
_options.scroller && (scroller = _options.scroller);
_options.disabled !== undefined && (disabled = _options.disabled);
$headings = $(container).find(selectors).filter('[id]');
$scrollTarget = $(scrollTarget);
$scroller = $(scroller);
}
function calc() {
headingsPos = [];
$headings.each(function() {
headingsPos.push(Math.floor($(this).position().top));
});
}
function setState(element, disabled) {
var scrollTop = $scrollTarget.scrollTop(), i;
if (disabled || !headingsPos || headingsPos.length < 1) { return; }
if (element) {
$activeCur = element;
} else {
for (i = 0; i < headingsPos.length; i++) {
if (scrollTop >= headingsPos[i]) {
$activeCur = $tocLi.eq(i);
} else {
$activeCur || ($activeCur = $tocLi.eq(i));
break;
}
}
}
$activeLast && $activeLast.removeClass('active');
($activeLast = $activeCur).addClass('active');
}
function render() {
if(!hasRendered) {
$root.append($tocUl);
$headings.each(function() {
var $this = $(this);
$tocUl.append($('<li></li>').addClass('toc-' + $this.prop('tagName').toLowerCase())
.append($('<a></a>').text($this.text()).attr('href', '#' + $this.prop('id'))));
});
$tocLi = $tocUl.children('li');
$tocUl.on('click', 'a', function(e) {
e.preventDefault();
var $this = $(this);
scrolling = true;
setState($this.parent());
$scroller.scrollToAnchor($this.attr('href'), 400, function() {
scrolling = false;
});
});
}
hasRendered = true;
}
function init() {
var interval, timeout;
if(!hasInit) {
render(); calc(); setState(null, scrolling);
// run calc every 100 millisecond
interval = setInterval(function() {
calc();
}, 100);
timeout = setTimeout(function() {
clearInterval(interval);
}, 45000);
window.pageLoad.then(function() {
setTimeout(function() {
clearInterval(interval);
clearTimeout(timeout);
}, 3000);
});
$scrollTarget.on('scroll', function() {
disabled || setState(null, scrolling);
});
$window.on('resize', window.throttle(function() {
if (!disabled) {
render(); calc(); setState(null, scrolling);
}
}, 100));
}
hasInit = true;
}
setOptions(options);
if (!disabled) {
init();
}
$window.on('resize', window.throttle(function() {
init();
}, 200));
return {
setOptions: setOptions
};
}
$.fn.toc = toc;
});
})();
/*(function () {
})();*/
</script><script>
/* toc must before affix, since affix need to konw toc' height. */(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
var TOC_SELECTOR = window.TEXT_VARIABLES.site.toc.selectors;
window.Lazyload.js(SOURCES.jquery, function() {
var $window = $(window);
var $articleContent = $('.js-article-content');
var $tocRoot = $('.js-toc-root'), $col2 = $('.js-col-aside');
var toc;
var tocDisabled = false;
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
var hasToc = $articleContent.find(TOC_SELECTOR).length > 0;
function disabled() {
return $col2.css('display') === 'none' || !hasToc;
}
tocDisabled = disabled();
toc = $tocRoot.toc({
selectors: TOC_SELECTOR,
container: $articleContent,
scrollTarget: hasSidebar ? '.js-page-main' : null,
scroller: hasSidebar ? '.js-page-main' : null,
disabled: tocDisabled
});
$window.on('resize', window.throttle(function() {
tocDisabled = disabled();
toc && toc.setOptions({
disabled: tocDisabled
});
}, 100));
});
})();
(function() {
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
var $window = $(window), $pageFooter = $('.js-page-footer');
var $pageAside = $('.js-page-aside');
var affix;
var tocDisabled = false;
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
affix = $pageAside.affix({
offsetBottom: $pageFooter.outerHeight(),
scrollTarget: hasSidebar ? '.js-page-main' : null,
scroller: hasSidebar ? '.js-page-main' : null,
scroll: hasSidebar ? $('.js-page-main').children() : null,
disabled: tocDisabled
});
$window.on('resize', window.throttle(function() {
affix && affix.setOptions({
disabled: tocDisabled
});
}, 100));
window.pageAsideAffix = affix;
});
})();
</script><!---->
</div>
<script>(function () {
var $root = document.getElementsByClassName('root')[0];
if (window.hasEvent('touchstart')) {
$root.dataset.isTouch = true;
document.addEventListener('touchstart', function(){}, false);
}
})();
</script>
</body>
</html>