yannstatic/static/2019/08/16/VirtualBox.html

2352 lines
218 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>VirtualBox - YannStatic</title>
<meta name="description" content="">
<link rel="canonical" href="https://static.rnmkcy.eu/2019/08/16/VirtualBox.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;">VirtualBox</h1></header></div><meta itemprop="headline" content="VirtualBox"><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=virtuel">virtuel</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">16&nbsp;août&nbsp;&nbsp;2019</span>
<span title="Modification" style="color:#00FF7F">17&nbsp;janv.&nbsp;2020</span></li></ul></div><meta itemprop="datePublished" content="2020-01-17T00:00:00+01:00">
<meta itemprop="keywords" content="virtuel"><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><img src="/images/virtualbox6-logo.png" alt="image" width="200px" /></p>
<h2 id="liens">Liens</h2>
<ul>
<li><a href="https://www.ostechnix.com/install-oracle-virtualbox-ubuntu-16-04-headless-server/">How to Install Oracle VirtualBox On Ubuntu 18.04.2 LTS Headless Server</a></li>
<li><a href="https://www.tecmint.com/install-virtualbox-on-debian-10/">How to Install VirtualBox 6 on Debian 10</a></li>
<li><a href="https://vorkbaard.nl/how-to-set-up-a-virtualbox-server-in-debian-9-web-interface-autostart-backup/">How to set up a VirtualBox server in Debian 9: web interface, autostart, backup</a></li>
<li><a href="https://www.howtoforge.com/managing-a-headless-virtualbox-installation-with-phpvirtualbox-on-nginx-ubuntu-12.04">Managing A Headless VirtualBox Installation With phpvirtualbox On nginx (Ubuntu 12.04)</a></li>
</ul>
<h2 id="virtualbox-sur-archlinux">VirtualBox sur Archlinux</h2>
<p><em>VirtualBox (ou VBox) est un produit pour la virtualisation dun environnement 32 (x86) ou 64 bits (AMD64/Intel64) et il est aussi valable pour le milieu de lentreprise que pour les particuliers. Il supporte un nombre important de systèmes dexploitation, propose une interface graphique (Qt / SDL) de même quune interface en ligne de commande.</em></p>
<p>VirtualBox offre des performances plus basses par-rapport à <a href="https://wiki.archlinux.fr/Qemu">qemu-kvm</a>.</p>
<p><a href="https://wiki.archlinux.fr/VirtualBox">VirtualBox Archlinux (fr)</a></p>
<h3 id="etapes-dinstallation-pour-les-hôtes-arch-linux">Etapes dinstallation pour les hôtes Arch Linux</h3>
<p>Pour lancer les machines virtuelles VirtualBox sur votre machine Arch Linux, suivez ces étapes dinstallation.
Installer les paquets de base</p>
<p>Installez le paquet <a href="https://www.archlinux.org/packages/?name=virtualbox">virtualbox</a>. Vous devrez choisir un package pour fournir les modules hôtes :</p>
<ul>
<li>pour le noyau <a href="https://www.archlinux.org/packages/?name=linux">linux</a> choisissez <a href="https://www.archlinux.org/packages/?name=virtualbox-host-modules-arch">virtualbox-host-modules-modules-arch</a></li>
<li>pour les autres <a href="https://wiki.archlinux.org/index.php/Kernels">noyaux</a> choisissez <a href="https://www.archlinux.org/packages/?name=virtualbox-host-dkms">virtualbox-host-dkms</a></li>
</ul>
<p>Pour compiler les modules VirtualBox fournis par <a href="https://www.archlinux.org/packages/?name=virtualbox-host-dkms">virtualbox-host-dkms</a>, il sera également nécessaire dinstaller le(s) paquet(s) den-têtes approprié(s) pour le(s) noyau(s) installé(s) (par exemple, <a href="https://www.archlinux.org/packages/?name=linux-lts-headers">linux-lts-headers</a> pour <a href="https://www.archlinux.org/packages/?name=linux-lts">linux-lts</a>).<br />
Lorsque VirtualBox ou le noyau est mis à jour, les modules du noyau seront automatiquement recompilés grâce au DKMS Pacman hook.</p>
<h3 id="modules-de-signalisation">Modules de signalisation</h3>
<p>Lorsque vous utilisez un noyau personnalisé avec loption <strong>CONFIG_MODULE_SIG_FORCE</strong> activée, vous devez signer vos modules avec une clé générée pendant la compilation du noyau.</p>
<p>Naviguez jusquau dossier de larborescence du noyau et exécutez la commande suivante :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># for module in `ls /lib/modules/$(uname -r)/kernel/misc/{vboxdrv.ko,vboxnetadp.ko,vboxnetflt.ko,vboxpci.ko}` ; do ./scripts/sign-file sha1 certs/signing_key.pem certs/signing_key.x509 $module ; done
</code></pre></div></div>
<blockquote>
<p>Note : Lalgorithme de hachage ne doit pas nécessairement correspondre à celui configuré, mais il doit être intégré dans le noyau.</p>
</blockquote>
<h3 id="charger-les-modules-du-noyau-virtualbox">Charger les modules du noyau VirtualBox</h3>
<p><a href="https://www.archlinux.org/packages/?name=virtualbox-host-modules-arch">virtualbox-host-modules-modules-arch</a> et <a href="https://www.archlinux.org/packages/?name=virtualbox-host-dkms">virtualbox-host-dkms</a> utilisent <strong>systemd-modules-load.service</strong> pour charger les quatre modules VirtualBox automatiquement au démarrage. Pour les modules à charger après linstallation, redémarrez ou chargez les modules une fois manuellement.</p>
<blockquote>
<p>Note : <strong>Si vous ne voulez pas que les modules VirtualBox soient automatiquement chargés au démarrage</strong>, vous devez masquer le fichier <em>/usr/lib/modules-load.d/virtualbox-host-modules-arch.conf</em> (ou <em>/usr/lib/modules-load.d/virtualbox-host-dkms.conf</em>) en créant un fichier vide (ou symlink vers /dev/null) avec le même nom dans /etc/modules-load.d/.</p>
</blockquote>
<p>Parmi les <a href="https://wiki.archlinux.org/index.php/Kernel_modules">modules du noyau</a> utilisés par VirtualBox, il y a un module obligatoire nommé <code class="language-plaintext highlighter-rouge">vboxdrv</code>, qui doit être chargé avant que les machines virtuelles puissent fonctionner.</p>
<p>Pour charger le module manuellement, exécutez :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># modprobe vboxdrv
</code></pre></div></div>
<p>Les modules suivants ne sont nécessaires que dans les configurations avancées :</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">vboxnetadp</code> et <code class="language-plaintext highlighter-rouge">vboxnetflt</code> sont tous deux nécessaires lorsque vous avez lintention dutiliser la fonction de mise en <a href="https://www.virtualbox.org/manual/ch06.html#network_bridged">réseau pontée (bridged)</a> ou <a href="https://www.virtualbox.org/manual/ch06.html#network_hostonly">hôte uniquement (host-only networking)</a>. Plus précisément, vboxnetadp est nécessaire pour créer linterface hôte dans les préférences globales de VirtualBox, et vboxnetflt est nécessaire pour lancer une machine virtuelle utilisant cette interface réseau.</li>
<li><code class="language-plaintext highlighter-rouge">vboxpci</code> est nécessaire lorsque votre machine virtuelle doit passer par un périphérique PCI sur votre hôte.</li>
</ul>
<blockquote>
<p>Note : Si les modules du noyau VirtualBox ont été chargés dans le noyau pendant la mise à jour des modules, vous devez les recharger manuellement pour utiliser la nouvelle version mise à jour. Pour ce faire, lancez <code class="language-plaintext highlighter-rouge">vboxreload</code> en tant que root.</p>
</blockquote>
<h3 id="accéder-aux-périphériques-usb-hôtes-dans-guest">Accéder aux périphériques USB hôtes dans guest</h3>
<p>Pour utiliser les ports USB de votre machine hôte dans vos machines virtuelles, ajoutez les utilisateurs qui seront autorisés à utiliser cette fonctionnalité au <a href="https://wiki.archlinux.org/index.php/User_group">groupe dutilisateurs</a> <strong>vboxusers</strong>.</p>
<h3 id="disque-dajouts-dinvités">Disque dajouts dinvités</h3>
<p>Il est également recommandé dinstaller le paquet <a href="https://www.archlinux.org/packages/?name=virtualbox-guest-iso">virtualbox-guest-iso</a> sur lhôte exécutant VirtualBox. Ce paquet agira comme une image disque qui peut être utilisée pour installer les ajouts dinvités sur des systèmes invités autres quArch Linux. Le fichier <strong>.iso</strong> sera situé dans <strong>/usr/lib/virtualbox/additions/VBoxGuestAdditions.iso</strong>, et devra peut-être être monté manuellement dans la machine virtuelle. Une fois monté, vous pouvez exécuter linstallateur dajouts dinvités à lintérieur de linvité.</p>
<h3 id="kit-dextension">Kit dextension</h3>
<p>Oracle Extension Pack offre des <a href="https://www.virtualbox.org/manual/ch01.html#intro-installing">fonctionnalités supplémentaires</a> et est disponible sous une licence non-libre uniquement pour un usage personnel. Pour linstaller, le paquet <a href="https://aur.archlinux.org/packages/virtualbox-ext-oracle/">virtualbox-ext-oracleAUR</a> est disponible, et une version pré-installée peut être trouvée dans le dépôt <a href="https://wiki.archlinux.org/index.php/Unofficial_user_repositories#seblu">seblu</a>.</p>
<p>Si vous préférez utiliser la méthode traditionnelle et manuelle : téléchargez lextension manuellement et installez-la via linterface graphique (Fichier &gt; Préférences &gt; Extensions) ou via <code class="language-plaintext highlighter-rouge">VBoxManage extpack install &lt;.vbox-extpack&gt;</code>, assurez-vous que vous avez un toolkit comme <a href="https://wiki.archlinux.org/index.php/Polkit">Polkit</a> pour accorder un accès privilégié à VirtualBox. Linstallation de cette extension nécessite un <a href="https://www.virtualbox.org/ticket/8473">accès root</a>.</p>
<h3 id="faces-avant-front-ends">Faces avant (Front-ends)</h3>
<p>VirtualBox est livré avec trois frontaux :</p>
<ul>
<li>Si vous voulez utiliser VirtualBox avec linterface graphique standard, utilisez <code class="language-plaintext highlighter-rouge">VirtualBox</code>.</li>
<li>Si vous voulez lancer et gérer vos machines virtuelles depuis la ligne de commande, utilisez la commande <code class="language-plaintext highlighter-rouge">VBoxSDL</code>, qui ne fournit quune simple fenêtre pour la machine virtuelle sans aucun recouvrement.</li>
<li>Si vous souhaitez utiliser VirtualBox sans exécuter dinterface graphique (par exemple sur un serveur), utilisez la commande <code class="language-plaintext highlighter-rouge">VBoxHeadless</code>. Avec lextension VRDP, vous pouvez toujours accéder à distance aux affichages de vos machines virtuelles.</li>
</ul>
<p>Enfin, vous pouvez également utiliser <a href="https://wiki.archlinux.org/index.php/PhpVirtualBox">phpVirtualBox</a> pour administrer vos machines virtuelles via une interface web.</p>
<p>Reportez-vous au <a href="https://www.virtualbox.org/manual">manuel VirtualBox</a> pour savoir comment créer des machines virtuelles.</p>
<blockquote>
<p><strong>Avertissement</strong> : Si vous avez lintention de stocker des images de disque virtuel sur un système de fichiers Btrfs, avant de créer des images, vous devriez envisager de désactiver la fonction de copie sur écriture pour le répertoire de destination de ces images.</p>
</blockquote>
<h2 id="virtualbox-sur-debian-9-stretch">VirtualBox sur Debian 9 (Stretch)</h2>
<p>La VirtualBox est la plateforme de virtualisation la plus utilisée par les utilisateurs. Cest un hyperviseur gratuit et open source pour les ordinateurs x86. Vous pouvez facilement installer VirtualBox sur un système Debian Linux en quelques étapes simples.</p>
<h3 id="pré-requis">Pré-requis</h3>
<p>Connectez-vous à votre serveur Debian avec un utilisateur root ou sudo et mettez à jour les paquets actuels de votre système avec la dernière version.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get update
sudo apt-get upgrade
</code></pre></div></div>
<h3 id="ajouter-le-dépôt-ppa-virtualbox">Ajouter le dépôt (PPA) VirtualBox</h3>
<p>Maintenant, vous devez ajouter Oracle VirtualBox PPA au système. Vous pouvez le faire en exécutant la commande ci-dessous sur votre système.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "deb http://download.virtualbox.org/virtualbox/debian stretch contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
</code></pre></div></div>
<p>Cette commande créera un fichier /etc/apt/sources.list.d/virtualbox.list</p>
<h3 id="importer-la-clé-publique-oracle">Importer la clé publique Oracle</h3>
<p>Après avoir ajouté le référentiel apt requis sur votre système, téléchargez et importez la clé publique Oracle pour apt-secure en utilisant les commandes suivantes.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
</code></pre></div></div>
<h3 id="installer-virtualbox-sur-debian">Installer VirtualBox sur Debian</h3>
<p>Vous êtes maintenant prêt à installer VirtualBox sur un système Debian. Exécutez les commandes suivantes sur le terminal pour terminer linstallation de VirtualBox sur un système Debian.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get update
sudo apt-get installer virtualbox-6.0
</code></pre></div></div>
<h3 id="lancer-virtualbox">Lancer VirtualBox</h3>
<p>Nous pouvons utiliser le lien de lancement sur votre système de bureau pour démarrer VirtualBox ou simplement utiliser la commande depuis un terminal.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>virtualbox
</code></pre></div></div>
<h2 id="machines-virtuelles-virtualbox-en-ligne-de-commande-vboxmanage">Machines virtuelles VirtualBox en ligne de commande (VBoxManage)</h2>
<p>La virtualisation est aujourdhui une composante majeure de lindustrie informatique. Nous pouvons constater que la virtualisation gagne en popularité dans les domaines du serveur, du réseau et du stockage. Pour répondre aux besoins des utilisateurs, de nombreuses solutions de virtualisation open source ont vu le jour, dont Oracle VirtualBox.</p>
<p>Dans cet article, nous aborderons lutilitaire <code class="language-plaintext highlighter-rouge">VBoxManage</code> utilisé pour gérer VirtualBox à partir dune interface de ligne de commande. Voici la syntaxe de lutilitaire VBoxManage</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ VBoxManage [&lt;option générale&gt;] &lt;commande&gt;
</code></pre></div></div>
<p>Dans la commande ci-dessus, loption générale peut être le mode commenté, supprimer le logo, le fichier de réponses, etc.</p>
<h3 id="vboxgérer-list">VBoxGérer list</h3>
<p>La commande liste donne des informations pertinentes sur votre système et des informations sur les paramètres actuels dOracle VM VirtualBox.</p>
<p>Les sous-commandes suivantes sont disponibles avec la commande <code class="language-plaintext highlighter-rouge">VBoxManage list</code> :</p>
<ul>
<li><strong>vms</strong> : Liste toutes les machines virtuelles actuellement enregistrées avec Oracle VM VirtualBox. Par défaut, cela affiche une liste compacte avec le nom et lUUID de chaque VM. Si vous spécifiez également long ou -l, cette liste sera détaillée comme avec la commande showvminfo</li>
<li><strong>runningvms</strong> : Liste toutes les machines virtuelles en cours dexécution par leurs identifiants uniques (UUIDs) dans le même format quavec vms.</li>
<li><strong>ostypes</strong> : Liste tous les systèmes dexploitation invités actuellement connus dOracle VM VirtualBox, ainsi que les identifiants utilisés pour sy référer avec la commande modifyvm.</li>
<li><strong>hostdvds, hostfloppies</strong> : Liste les interfaces DVD, disquette, mise en réseau pontée et mise en réseau de lhôte uniquement sur lhôte, ainsi que le nom utilisé pour y accéder à partir dOracle VM VirtualBox.</li>
<li><strong>intnets</strong> : Affiche des informations sur les réseaux internes.</li>
<li><strong>bridgedifs, hostonlyifs, natnets, dhcpservers</strong> : Liste les interfaces réseau pontées, les interfaces réseau hôtes uniquement, les interfaces réseau NAT et les serveurs DHCP actuellement disponibles sur lhôte.</li>
<li><strong>hostinfo</strong> : Affiche des informations sur le système hôte, telles que les CPU, la taille de la mémoire et la version du système dexploitation.</li>
<li><strong>hostcpuids</strong> : Liste les paramètres CPUID pour les CPU hôtes. Ceci peut être utilisé pour une analyse plus fine des capacités de virtualisation de lhôte.</li>
<li><strong>hddbackends</strong> : Liste tous les back-ends de disques virtuels connus dOracle VM VirtualBox. Pour chacun de ces formats, tels que VDI, VMDK ou RAW, cette sous-commande liste les capacités et la configuration du back-end.</li>
<li><strong>hdds, dvds, floppies</strong> : Affiche des informations sur les images de disque virtuel actuellement utilisées par Oracle VM VirtualBox, y compris tous leurs paramètres, les identificateurs uniques (UUID) qui leur sont associés par Oracle VM VirtualBox et tous les fichiers qui y sont associés. Cest léquivalent en ligne de commande du Virtual Media Manager. Voir Section 5.3, “Le gestionnaire de médias virtuels”.</li>
<li><strong>usbhost</strong> : Affiche des informations sur les périphériques USB connectés à lhôte, y compris des informations utiles pour la construction de filtres USB et si ceux-ci sont actuellement utilisés par lhôte.</li>
<li><strong>usbfilters</strong> : Liste tous les filtres USB globaux enregistrés avec Oracle VM VirtualBox et affiche les paramètres du filtre. Les filtres USB globaux sont pour les périphériques qui sont accessibles à toutes les machines virtuelles.</li>
<li><strong>systemproperties</strong> : Affiche certains paramètres globaux dOracle VM VirtualBox, tels que la taille minimale et maximale de la RAM et du disque dur virtuel invités, les paramètres du dossier et la bibliothèque dauthentification actuellement utilisée.</li>
<li><strong>extpacks</strong> : Affiche tous les packs dextension Oracle VM VirtualBox actuellement installés. Voir Section 1.6, “Installation dOracle VM VirtualBox et des Extension Packs” et Section 7.43, “VBoxManage extpack”.</li>
<li><strong>groups</strong> : Affiche les détails des groupes VM. Voir Section 1.10, “Utilisation des groupes VM”.</li>
<li><strong>webcams</strong> : Affiche une liste des webcams attachées à la machine virtuelle en cours dexécution. Le format de sortie est une liste de chemins absolus ou dalias qui ont été utilisés pour attacher les webcams à la VM en utilisant la commande Attacher la webcam.</li>
<li><strong>screenshotformats</strong> : Affiche une liste des formats de capture décran disponibles.</li>
<li><strong>cloudproviders</strong> : Affiche une liste des fournisseurs de cloud qui sont pris en charge par Oracle VM VirtualBox. Oracle Cloud Infrastructure est un exemple de fournisseur de cloud computing.</li>
<li><strong>cloudprofiles</strong> : Affiche une liste des profils de nuages qui ont été configurés.</li>
</ul>
<h3 id="créer-une-vm-en-utilisant-vboxmanage">Créer une VM en utilisant VBoxManage</h3>
<p>Pour créer une machine virtuelle, nous devons utiliser la commande <code class="language-plaintext highlighter-rouge">createvm</code> avec VBoxManage. Voici la syntaxe</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>createvm --name &lt;name&gt;
[--groups &lt;group&gt;, ...]
[--ostype &lt;ostype&gt;]
[--register]
[--basefolder &lt;path&gt;]
[--uuid &lt;uuid&gt;]
</code></pre></div></div>
<p>Nous pouvons lister les types de système dexploitation supportés en utilisant la commande ci-dessous:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage list ostypes
</code></pre></div></div>
<p>Créons Ubuntu-64 vm à partir de la CLI:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage createvm --name ubuntu-server --ostype Ubuntu_64 --register
</code></pre></div></div>
<p>Lorsque vous exécutez la commande ci-dessus, il générera le résultat suivant:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Virtual machine 'ubuntu-server' is created and registered.
UUID: 7433725a-f314-44c7-8625-91d61cc6125d
Settings file: '/home/linux-techi/VirtualBox VMs/ubuntu-server/ubuntu-server.vbox'
</code></pre></div></div>
<p>Nous pouvons maintenant voir la nouvelle machine virtuelle créée dans VirtualBox Manager</p>
<p><img src="/images/VirtualBox-Manager-Ubuntu-Linux.jpg" alt="" width="500" /></p>
<h3 id="mettre-à-jour-la-vm">Mettre à jour la VM</h3>
<p>Nous avons créé une VM à partir de la CLI. Mais cette machine virtuelle nest pas utilisable en létat. Nous pouvons le rendre utilisable en attribuant une carte réseau, en allouant de la mémoire et en y attachant un disque.</p>
<h3 id="créer-un-réseau-via-vboxmanage">Créer un réseau via VBoxManage</h3>
<p>Pour créer un réseau ponté (bridged network), exécutez les deux commandes suivantes:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage modifyvm ubuntu-server --bridgeadapter1 vmnet1
VBoxManage modifyvm ubuntu-server --nic1 bridged
</code></pre></div></div>
<p>Dans lexemple ci-dessus, jai utilisé le réseau vmnet1. Il est créé par défaut lors de linstallation dOracle VirtualBox.</p>
<h3 id="allouer-de-la-mémoire">Allouer de la mémoire</h3>
<p>Pour allouer de la mémoire, exécutez la commande suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage modifyvm ubuntu-server --memory 2048
</code></pre></div></div>
<h3 id="créer-un-disque-dur">Créer un disque dur</h3>
<p>Pour créer un disque dur, exécutez la commande suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage createhd --filename VirtualBox\ VMs/ubuntu-server/ubuntu-server.vdi --size 10000 --format VDI
</code></pre></div></div>
<p>Lorsque vous exécutez la commande ci-dessus, il générera la sortie suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 5f530d25-da57-4030-bf56-32d5a29c91b5
</code></pre></div></div>
<blockquote>
<p>Cette commande créera un disque dur virtuel. À lheure actuelle, il nest associé à aucune machine virtuelle.</p>
</blockquote>
<h3 id="ajouter-un-contrôleur-sata">Ajouter un contrôleur SATA</h3>
<p>Dans la section précédente, nous avons créé un disque dur virtuel. Nous avons besoin dun contrôleur SATA pour connecter ce disque. La commande ci-dessous crée un contrôleur SATA.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage storagectl ubuntu-server --name "SATA Controller" --add sata --controller IntelAhci
</code></pre></div></div>
<h3 id="attacher-le-disque-virtuel-au-controleur-sata">Attacher le disque virtuel au controleur SATA</h3>
<p>Nous avons maintenant un contrôleur SATA et un disque dur virtuel. Attacher le disque virtuel au contrôleur SATA</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage storageattach ubuntu-server --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium VirtualBox\ VMs/ubuntu-server/ubuntu-server.vdi
</code></pre></div></div>
<h3 id="ajouter-un-contrôleur-ide-pour-les-images-iso">Ajouter un contrôleur IDE pour les images ISO</h3>
<p>Après création de la machine virtuelle ,il faut installer un système dexploitation à partir dune image ISO. Ajoutons donc le contrôleur IDE en utilisant la commande suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage storagectl ubuntu-server --name "IDE Controller" --add ide --controller PIIX4
</code></pre></div></div>
<h3 id="joindre-une-image-iso-au-contrôleur-ide">Joindre une image ISO au contrôleur IDE</h3>
<p>Pour attacher une image ISO au contrôleur IDE, exécutez la commande suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage storageattach ubuntu-server --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium /home/linux-techi/ubuntu-18.04-desktop-amd64.iso
</code></pre></div></div>
<h3 id="démarrer-la-vm">Démarrer la VM</h3>
<p>La VM est configurée et prête pour linstallation. Démarrer la VM en utilisant la commande suivante</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage startvm ubuntu-server
</code></pre></div></div>
<p>Cette commande ouvrira VirtualBox Manager à partir duquel linstallation du système dexploitation peut être effectuée.</p>
<h3 id="arrêter-la-vm">Arrêter la VM</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VboxManage controlvm ubuntu-server poweroff
</code></pre></div></div>
<h3 id="travailler-avec-des-instantanés-snapshots">Travailler avec des instantanés (snapshots)</h3>
<p>Snapshot est une copie ponctuelle de la machine virtuelle. Nous pouvons prendre un instantané en utilisant la commande suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage snapshot ubuntu-server take "first-snapshot"
</code></pre></div></div>
<p>Lorsque vous exécutez la commande ci-dessus, il générera la sortie suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Snapshot taken. UUID: cd5dadc1-dd8f-427e-a6b8-5a3e93307ef9
</code></pre></div></div>
<p>Nous pouvons voir cet instantané dans le gestionnaire VirtualBox:</p>
<p><img src="/images/VirtualBox-VM-Snapshot-Linux.jpg" alt="" width="500" /></p>
<p>Pour revenir à linstantané, exécutez la commande suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage snapshot ubuntu-server restore "first-snapshot"
</code></pre></div></div>
<p>Lorsque vous exécutez la commande ci-dessus, il générera la sortie suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Restoring snapshot ' first-snapshot' (cd5dadc1-dd8f-427e-a6b8-5a3e93307ef9)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
</code></pre></div></div>
<h3 id="supprimer-la-vm">Supprimer la VM</h3>
<p>Pour supprimer la machine virtuelle, exécutez la commande suivante:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage unregistervm ubuntu-server --delete
</code></pre></div></div>
<p>Lorsque vous exécutez la commande ci-dessus, il générera le résultat suivant:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
</code></pre></div></div>
<blockquote>
<p>Veuillez noter que cette commande supprimera tous les fichiers de la machine virtuelle (fichiers de configuration ainsi que les disques durs virtuels) du système.</p>
</blockquote>
<h3 id="dupliquer-un-disque-en-changeant-son-format-vmdk--vdi">Dupliquer un disque en changeant son format (VMDK =&gt; VDI)</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage clonemedium MonDisque.vmdk --format VDI MonDisqueDuplique.vdi
</code></pre></div></div>
<h3 id="agrandir-un-disque-virtuel-vdi">Agrandir un disque virtuel VDI</h3>
<p>Vous avez prévu un disque top petit ? Voici comment agrandir le disque (ici avec un disque de 25Go que je passe à 35Go) :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage modifymedium --resize 35000 win8.vdi
</code></pre></div></div>
<h3 id="compacter-un-disque-virtuel-vdi">Compacter un disque virtuel VDI</h3>
<p>Un disque dur virtuel VDI en taille dynamiquement allouée ne grossit que lorsquil contient de nouveaux fichiers dans la machine virtuelle.
Or, sil est plein à 50% et que des fichiers y sont supprimés, la taille ne diminue pas.</p>
<p>Si au bout dun certain temps le disque devient trop gros, le remplir à 100%.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo dd if=/dev/zero of=/un_point_de_montage_du_disque
</code></pre></div></div>
<p>Une fois que dd ne sait plus écrire, cest que le disque est plein.<br />
Éteindre la machine virtuelle, puis exécuter dans la machine hôte:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage modifymedium MonDisqueDur.vdi --compact
</code></pre></div></div>
<h3 id="conclusion">Conclusion</h3>
<p>Pour plus de détails se référer à la <a href="https://www.virtualbox.org/manual/ch08.html">documentation officielle</a></p>
<h2 id="pack-dextension-virtualbox">Pack dextension VirtualBox</h2>
<ul>
<li><a href="https://kifarunix.com/install-virtualbox-extension-pack-on-virtualbox-6-0/">Install VirtualBox Extension Pack on VirtualBox 6.0</a></li>
</ul>
<p>Alors, quel est le pack dextension VirtualBox? Le pack dextension VirtualBox est un package binaire utilisé pour améliorer les fonctionnalités du package de base Oracle VM VirtualBox, notamment:</p>
<ul>
<li>Prise en charge des périphériques virtuels USB 2.0 (EHCI) et USB 3.0 (xHCI)</li>
<li>Prise en charge du protocole VRDP (Virtual Desktop Protocol)</li>
<li>Prise en charge de lhôte webcam passthrough</li>
<li>ROM de démarrage Intel PXE.</li>
<li>Prise en charge expérimentale de la liaison PCI sur des hôtes Linux</li>
<li>Cryptage dimage disque avec algorithme AES</li>
</ul>
<h3 id="vérifier-la-version-de-virtualbox">Vérifier la version de VirtualBox</h3>
<p>Avant de pouvoir installer le pack dextension VirtualBox, vous devez vérifier la version du package de base de VirtualBox actuellement installé afin de pouvoir installer la version correspondante du pack dextension. Vous pouvez vérifier la version de VirtualBox à laide de la commande vboxmanage .</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vboxmanage --version
</code></pre></div></div>
<p>6.0.8r130347</p>
<blockquote>
<p>ATTENTION ,il faut prendre uniquement la version , dans notre exemple ci-dessus ce sera <strong>6.0.8</strong></p>
</blockquote>
<p>Une fois que vous avez confirmé la version de la VirtualBox actuellement installée, accédez à la <a href="https://www.virtualbox.org/wiki/Downloads">page des téléchargements de VirtualBox</a> et accédez au programme dinstallation du pack dextension. <br />
Vous pouvez simplement exécuter la commande ci-dessous pour télécharger le pack dextension.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget https://download.virtualbox.org/virtualbox/6.0.8/Oracle_VM_VirtualBox_Extension_Pack-6.0.8.vbox-extpack
</code></pre></div></div>
<h3 id="installer-le-pack-dextension-virtualbox">Installer le pack dextension VirtualBox</h3>
<p>Le pack dextension VirtualBox peut être installé directement à partir de la fenêtre principale de VirtualBox ou du terminal à laide de la commande VBoxManage .</p>
<p>Pour installer le pack dextension à laide de la commande vboxmanage , vous devez dabord désinstaller lancienne version, le cas échéant.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo VBoxManage extpack uninstall "Oracle VM VirtualBox Extension Pack"
</code></pre></div></div>
<p>Une fois linstallation terminée, exécutez la commande ci-dessous pour installer le pack dextension que vous venez de télécharger.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.0.8.vbox-extpack
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[...]
Do you agree to these license terms and conditions (y/n)? y
License accepted. For batch installation add
--accept-license=56be48f923303c8cababb0bb4c478284b688ed23f16d775d729b89a2e8e5f9eb
to the VBoxManage command line.
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully installed "Oracle VM VirtualBox Extension Pack".
</code></pre></div></div>
<p>Vérifiez linstallation en exécutant la commande ci-dessous.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VBoxManage list extpacks
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Extension Packs: 1
Pack no. 0: Oracle VM VirtualBox Extension Pack
Version: 6.0.8
Revision: 130520
Edition:
Description: USB 2.0 and USB 3.0 Host Controller, Host Webcam, VirtualBox RDP, PXE ROM, Disk Encryption, NVMe.
VRDE Module: VBoxVRDP
Usable: true
Why unusable:
</code></pre></div></div>
<p>Pour installer le pack dextension à partir de linterface utilisateur de VirtualBox, l<u>ancez VirtualBox en mode su</u><br />
<code class="language-plaintext highlighter-rouge">sudo virtualbox</code><br />
et accédez à Fichier&gt; Paramètres&gt; Extensions . Si lancienne version de lextension pack est installée, sélectionnez-la et cliquez sur licône avec x pour la détacher. Ensuite, cliquez sur licône avec le signe plus pour ajouter le package dextension téléchargé. Une fois le package sélectionné, vous serez invité à linstallation.</p>
<p><img src="/images/vboxext.png" alt="" width="400px" /></p>
<p>installer le pack dextension virtualbox</p>
<p><img src="/images/vboxext2.png" alt="" width="200px" /></p>
<p><img src="/images/vboxext3.png" alt="" width="400px" /></p>
<h3 id="configurer-la-machine-virtuelle-pour-un-accès-au-réseau-partagé">Configurer la machine virtuelle pour un accès au réseau partagé.</h3>
<p><strong>'Configuration &gt; Dossiers partagés</strong><br />
Ajouter le dossier et cocher <strong>'Montage automatique</strong></p>
<p><img src="/images/Vbox-Partage1.png" alt="Texte alternatif" width="200" /></p>
<p><img src="/images/Vbox-Partage2.png" alt="Texte alternatif" width="400" /></p>
<blockquote>
<p>Avant de pouvoir continuer, vous devez installer certains packages requis, tels que les en-têtes de noyau Linux, les versions essentielles, sils ne sont pas installés.</p>
</blockquote>
<p>Installer les additions client dans un Debian en cours dexécution dans une machine virtuelle.</p>
<ul>
<li>Installez gcc ,make et <strong>kernel headers</strong> (installateur a besoin deux pour construire le module du noyau):
<ul>
<li><code class="language-plaintext highlighter-rouge">sudo apt install gcc make linux-headers-$(uname -r)</code></li>
</ul>
</li>
<li>Allez dans le menu <strong>'Périphériques &gt; Insérer limage des additions invité…</strong> de la machine virtuelle en cours dexécution ,si non présent , la télécharger.</li>
<li>Monter le cd dans la machine virtuelle : <code class="language-plaintext highlighter-rouge">sudo mount /dev/cdrom /media/cdrom</code></li>
<li>Allez dans le dossier monté : <code class="language-plaintext highlighter-rouge">cd /media/cdrom</code></li>
<li>Exécutez : <code class="language-plaintext highlighter-rouge">sudo ./VBoxLinuxAdditions.run</code></li>
</ul>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Verifying archive integrity... All good.
Uncompressing VirtualBox 6.0.8 Guest Additions for Linux........
VirtualBox Guest Additions installer
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Starting.
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel
modules. This may take a while.
VirtualBox Guest Additions: To build modules for other installed kernels, run
VirtualBox Guest Additions: /sbin/rcvboxadd quicksetup &lt;version&gt;
VirtualBox Guest Additions: or
VirtualBox Guest Additions: /sbin/rcvboxadd quicksetup all
VirtualBox Guest Additions: Building the modules for kernel 4.19.0-5-amd64.
update-initramfs: Generating /boot/initrd.img-4.19.0-5-amd64
VirtualBox Guest Additions: Running kernel modules will not be replaced until
the system is restarted
</code></pre></div></div>
<ul>
<li>Pas denvironnement graphique : <u>ne pas tenir compte de l'erreur</u> <strong>'Could not find the X.Org or XFree86 Window System, skipping.</strong></li>
<li>Il faut ajouter le group <strong>vboxsf</strong> à votre utilisateur :
<ul>
<li><code class="language-plaintext highlighter-rouge">sudo usermod -a -G vboxsf $USER</code></li>
</ul>
</li>
<li>Pour la prise en compte, redémarrer la machine virtuelle :
<ul>
<li><code class="language-plaintext highlighter-rouge">sudo reboot</code></li>
</ul>
</li>
</ul>
<p><strong>/media/</strong> est le répertoire qui contient le(s) dossier(s) partagé(s)<br />
Dans notre exemple <strong>/media/sf_Partage</strong></p>
<h2 id="créer-des-clones-et-des-instantanés-de-machines-virtuelles-dans-virtualbox">Créer des clones et des instantanés de machines virtuelles dans VirtualBox</h2>
<p><em>Les clones sont une copie exacte dune machine virtuelle en état de marche, tandis que les instantanés vous permettent de sauvegarder un état particulier dune machine virtuelle.</em></p>
<h3 id="créer-un-clone">Créer un clone</h3>
<p>Comme indiqué, les clones constituent lun des meilleurs moyens de créer une copie exacte dune machine virtuelle. Un moyen très pratique dutiliser des clones est de créer une machine virtuelle propre de, par exemple, Ubuntu Server, puis de cloner loriginal pour obtenir une nouvelle base utilisable à toutes fins. Ainsi, avec une machine virtuelle propre Ubuntu Server 18.04 en place (et désactivée ou dans un état enregistré, car les clones ne peuvent pas être créés tant quune machine virtuelle est en cours dexécution), vous pouvez créer un clone en procédant comme suit:</p>
<p><img src="/images/vbox-clone1.png" alt="vbox" /></p>
<ol>
<li>Ouvrez VirtualBox.</li>
<li>Sélectionnez la machine virtuelle à cloner dans le volet gauche.</li>
<li>Cliquez avec le bouton droit sur la machine virtuelle à cloner.</li>
<li>Cliquez sur Cloner dans le menu contextuel.</li>
<li>Lorsque vous y êtes invité, attribuez un nom au clone, puis cliquez sur Suivant .</li>
<li>Sélectionnez Full clone dans la fenêtre Clone Type et cliquez sur le bouton Clone .</li>
</ol>
<p><img src="/images/vbox-clone2.png" alt="vbox" /></p>
<blockquote>
<p>Selon la taille de votre machine virtuelle, le processus de clonage peut durer de cinq à vingt minutes. Assurez-vous de donner au clone un nom approprié à son utilisation, sinon vous risquez de vous retrouver avec beaucoup de clones portant des noms similaires (ce qui pourrait être déroutant).</p>
</blockquote>
<p>Une fois le processus terminé, votre clone est prêt à être utilisé.</p>
<h3 id="création-et-utilisation-dinstantanés">Création et utilisation dinstantanés</h3>
<p><strong>Création</strong><br />
Les instantanés sont un excellent moyen de sauvegarder un état particulier dune machine virtuelle (VM). Supposons, par exemple, que vous envisagiez dinstaller quelque chose de nouveau sur (ou de modifier) une machine virtuelle qui fonctionne et que vous voulez vous assurer que vous avez un «point enregistré» sur lequel vous pouvez revenir (au cas où tout ne se passerait pas bien). Utilisons la même machine virtuelle Ubuntu Server pour créer un instantané. Supposons que vous êtes sur le point dinstaller une pile LAMP (ou une mise à niveau majeure) et que vous souhaitez être sûr de pouvoir restaurer, à tout hasard, linstallation / la mise à niveau annule quelque chose que vous avez installé et configuré.</p>
<ol>
<li>Pour créer un instantané, sélectionnez la machine virtuelle en cours dutilisation dans le volet de gauche<br />
<img src="/images/vbox-clone3.png" alt="vbox" width="600" /></li>
<li>cliquer dans la zone droite , un menu souvre , sélectionner <strong>Instantanés</strong><br />
<img src="/images/vbox-clone9.png" alt="vbox" width="300" /></li>
<li>Cliquer sur <strong>Prendre</strong><br />
<img src="/images/vbox-clone4.png" alt="vbox" width="600" /></li>
<li>Dans la fenêtre résultante, attribuez un nom et une description à linstantané. Assurez-vous de laisser des notes adéquates dans la description, de sorte que vous sachiez pourquoi cet instantané a été pris et / ou comment était létat de la machine virtuelle avant ce qui avait été fait après linstantané. Cliquez sur le bouton OK et linstantané sera pris.<br />
<img src="/images/vbox-clone5.png" alt="vbox" width="300" /></li>
<li>Vous devriez maintenant voir le nom de linstantané répertorié avec État actuel ci-dessous.<br />
<img src="/images/vbox-clone6.png" alt="vbox" width="600" /></li>
</ol>
<p><strong>Restauration</strong></p>
<p>Pour restaurer un instantané, procédez comme suit:</p>
<ol>
<li>Sélectionner la machine virtuelle concernée dans le volet gauche de la fenêtre principale.</li>
<li>cliquer dans la zone droite , un menu souvre , sélectionner <strong>Instantanés</strong></li>
<li>Sélectionner linstantané que vous souhaitez restaurer.</li>
<li>Cliquer sur le bouton <img src="/images/vbox-clone7.png" alt="vbox" width="40" /></li>
<li>Dans la fenêtre résultante, décochez la case <strong>Créer un instantané de létat actuel de la machine</strong><br />
<img src="/images/vbox-clone8.png" alt="vbox" width="300" /></li>
</ol>
<blockquote>
<p>NOTE : La raison pour laquelle vous décochez la case Créer un instantané de létat actuel de la machine est simple. Si vous revenez à un état précédent, parce que létat actuel est cassé, vous ne voulez pas prendre un instantané de cet état cassé. Lorsque vous décochez cette case, létat brisé sera ignoré.</p>
</blockquote>
</div>
<div class="d-print-none"><footer class="article__footer"><meta itemprop="dateModified" content="2019-08-16T00: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="/2019/08/06/Hotspot-wifi-dhcpd-raspberry-(Raspbian-Buster).html">Point d'accès wifi dhcpd sur raspberry (Raspbian Buster)</a></div><div class="next"><span>SUIVANT</span><a href="/2019/08/20/Migrer-Debian_9-vers-Debian_10-Buster.html">Migrer debian stretch vers debian buster (debian 9 -> debian 10)</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>