копировать права доступа ACL при переносе данных с сервера на сервер

Thank you for reading this post, don't forget to subscribe!

Воз­ник­ла необ­хо­ди­мость пере­не­сти фай­лы из одной сете­вой шары на линук­се на дру­гой сер­вер. Оба сер­ве­ра вклю­че­ны в домен AD. Каза­лась бы про­стая зада­ча, бери да копи­руй. Пра­ва досту­па долж­ны сохра­нить­ся, ведь обе маши­ны в одном и то же домене. Но все ока­за­лось не так просто.

Для меня было боль­шим удив­ле­ни­ем, что при про­стом копи­ро­ва­нии через windows маши­ну пра­ва досту­па не сохра­ня­лись. На обо­их сер­ве­рах была фай­ло­вая систе­ма с под­держ­кой ACL. Уста­но­вить потом пра­ва вруч­ную мож­но было. То есть функ­ци­о­нал весь был, но пра­ва досту­па не сохра­ня­лись. Отме­чу сра­зу, что сер­вер, с кото­ро­го заби­рал инфор­ма­цию был QNAP, копи­ро­вал на CentOS 7.

Вто­рым эта­пом была попыт­ка при­мон­ти­ро­вать сра­зу на сер­вер при­ем­ник фай­ло­вую шару через cifs. Но при этом пра­ва досту­па ACL тоже не копи­ро­ва­лись. Стал искать инфор­ма­цию на эту тему в интер­не­те и нашел, что дей­стви­тель­но, через cifs acl пра­ва не пере­но­сят­ся. Там есть свои ути­ли­ты для про­вер­ки и назна­че­ния прав: getcifsacl и setcifsacl. Вруч­ную ковы­рять­ся с этим не захотелось.

Сле­ду­ю­щим эта­пом была попыт­ка исполь­зо­вать ути­ли­ту от Microsoft — Robocopy. Понра­вил­ся ее функ­ци­о­нал, она дей­стви­тель­но все копи­ру­ет с сохра­не­ни­ем прав досту­па и дру­гой инфор­ма­ции о фай­лах. Но вот неза­да­ча. После копи­ро­ва­ния дан­ных с одной фай­ло­вой шары на дру­гую, появ­ля­лись пра­ва досту­па в виде неиз­вест­ных SID и не пере­во­ди­лись в груп­пы и поль­зо­ва­те­ли. Ну и доступ, соот­вет­ствен­но, не работал.

В ито­ге для пере­но­са дан­ных с сохра­не­ни­ем прав досту­па ACL я посту­пил сле­ду­ю­щим обра­зом. На пер­вом сер­ве­ре, где лежа­ли дан­ные выпол­нил команду:

Коман­да рекур­сив­но собра­ла пра­ва досту­па со всех ката­ло­гов и фай­лов и запи­са­ла в тек­сто­вый файл. Если шара очень боль­шая, то файл будет вну­ши­тель­ных раз­ме­ров. У меня на шаре с 80 000 ката­ло­гов и 500 000 фай­лов такой файл зани­мал 240мб. Даль­ше было бы здо­ро­во сде­лать на сер­ве­ре при­ем­ни­ке команду:

И на этом закон­чить. Но все не так про­сто. Во-пер­вых, в полу­чен­ном фай­ле были ука­за­ны пути в сле­ду­ю­щем формате:

Поче­му-то в нача­ле пути не сто­ял слеш. Коман­да setfacl сра­зу на это руг­ну­лась. Плюс на сер­ве­ре при­ем­ни­ке был дру­гой путь, зна­чит, его нуж­но отре­дак­ти­ро­вать для всех опи­сы­ва­е­мых объ­ек­тов прав досту­па во всем 240мб фай­ле. Про­сто открыть его в тек­сто­вом редак­то­ре и сде­лать заме­ну затруд­ни­тель­но. При­шлось искать дру­гое реше­ние. На помощь при­шла ути­ли­та sed:

С помо­щью этой коман­ды я заме­нил фра­зу share/MD1_DATA на /shares и полу­чил теперь пра­виль­ный путь /shares/soft/Player.

Но это было не все. Даль­ше в фай­ле с пра­ва­ми досту­па встре­ча­лись не домен­ные поль­зо­ва­те­ли, а локаль­ные того сер­ве­ра, с кото­ро­го пере­ез­жа­ли. Нуж­но было их тоже всех уда­лить, ина­че коман­да не отра­ба­ты­ва­ла, выле­та­ла с ошиб­кой. В моем слу­чае это были поль­зо­ва­те­ли: admin, guest, everyone. Я опять же с помо­щью sed про­сто уда­лил все стро­ки, где встре­ча­лись эти фра­зы. Делал это на вся­кий слу­чай поэтап­но с про­вер­кой на каж­дом эта­пе. Полу­чи­лось вот так:

Мож­но было все в одной коман­де сде­лать, но я не очень силен в постро­е­нии регу­ляр­ных выра­же­ний, не было вре­ме­ни раз­би­рать­ся, сде­лал так. Ути­ли­та на удив­ле­ние быст­ро рабо­та­ет. Бук­валь­но 2-3 секун­ды и стро­ки уда­ле­ны из файла.

После это­го на сер­ве­ре при­ем­ни­ке запу­стил команду:

И все домен­ные пра­ва досту­па бла­го­по­луч­но уста­но­ви­лись. Ути­ли­та рабо­та­ла доста­точ­но дол­го, минут 15.